java面试题复习(二)

//我又回来了java

十一、数组有没有length()方法?String有没有length()方法?c++

数组只有length属性,String有length()方法。注意:JavaScript获取字符串长度使用length属性。//写个数组和字符串,再来个点+(alt+/)来看看程序员

十二、Java中,如何跳出当前的多重嵌套循环?编程

在最外层前加上标记而后用“break 标记”,能够跳出多重循环。数组

1三、构造器(constructor)是否可被重写(override)缓存

固然不能了,构造器都不能被继承,因此不能重写,但能够重载//又是重载和重写的问题安全

1四、两个对象值相同(x.equals(y) == true),他们的hashcode是否相同服务器

Java对于eqauls方法和hashCode方法是这样规定的:(1)若是两个对象相同(equals方法返回true),那么它们的hashCode值必定要相同;(2)若是两个对象的hashCode相同,它们并不必定相同。//充分非必要条件jvm

因此两个对象值相同时hashcode也相同//ide

偷来的补充:关于equalshashCode方法,不少Java程序都知道,但不少人也就是仅仅知道而已,在Joshua Bloch的大做《Effective Java》(不少软件公司,《Effective Java》、《Java编程思想》以及《重构:改善既有代码质量》是Java程序员必看书籍,若是你还没看过,那就赶忙去亚马逊买一本吧)中是这样介绍equals方法的:首先equals方法必须知足自反性(x.equals(x)必须返回true)、对称性(x.equals(y)返回true时,y.equals(x)也必须返回true)、传递性(x.equals(y)y.equals(z)都返回true时,x.equals(z)也必须返回true)和一致性(当xy引用的对象信息没有被修改时,屡次调用x.equals(y)应该获得一样的返回值),并且对于任何非null值的引用xx.equals(null)必须返回false。实现高质量的equals方法的诀窍包括:1. 使用==操做符检查参数是否为这个对象的引用2. 使用instanceof操做符检查参数是否为正确的类型3. 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;4. 编写完equals方法后,问本身它是否知足对称性、传递性、一致性;5. 重写equals时老是要重写hashCode6. 不要将equals方法参数中的Object对象替换为其余的类型,在重写时不要忘掉@Override注解。

1五、当一个对象被看成参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里究竟是值传递仍是引用传递?
是值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例做为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性能够在被调用过程当中被改变,但对对象引用的改变是不会影响到调用者的。C++和C#中能够经过传引用或传输出参数来改变传入的参数的值。//赶忙去学c++

1六、char 型变量中能不能存储一个中文汉字,为何

char类型能够存储一个中文汉字,由于Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的惟一方法),一个char类型占2个字节(16比特)

1七、抽象类和接口的异同

同:抽象类和接口都不可以实例化,但能够定义抽象类和接口类型的引用。一个类若是继承了某个抽象类或者实现了某个接口都须要对其中的抽象方法所有进行实现,不然该类仍然须要被声明为抽象类。

异:抽象类中能够定义构造器,能够有抽象方法和具体方法,而接口中不能定义构造器并且其中的方法所有都是抽象方法。

抽象类中的成员能够是private、默认、protected、public的,而接口中的成员全都是public的。

抽象类中能够定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法

1八、类加载机制?

程序调用某个类时,若是该类在内存中不存在,则系统会经过加载、链接、初始化三个步骤对类初始化;类的加载是将类的class文件读入到内存中,并为之建立一个class的对象;类的加载由jvm完成,jvm类加载机制是,父类委托、所有加载、缓存机制

1九、描述一下JVM加载class文件的原理机制?

JVM中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java中的类加载器是一个重要的Java运行时系统组件,它负责在运行时查找和装入类文件中的类。
因为Java的跨平台性,通过编译的Java源程序并非一个可执行程序,而是一个或多个类文件。当Java程序须要使用某个类时,JVM会确保这个类已经被加载、链接(验证、准备和解析)和初始化。类的加载是指把类的.class文件中的数据读入到内存中,一般是建立一个字节数组读入.class文件,而后产生与所加载类对应的Class对象。加载完成后,Class对象还不完整,因此此时的类还不可用。当类被加载后就进入链接阶段,这一阶段包括验证、准备(为静态变量分配内存并设置默认的初始值)和解析(将符号引用替换为直接引用)三个步骤。最后JVM对类进行初始化,包括:1)若是类存在直接的父类而且这个类尚未被初始化,那么就先初始化父类;2)若是类中存在初始化语句,就依次执行这些初始化语句。
类的加载是由类加载器完成的,类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)。从Java 2(JDK 1.2)开始,类加载过程采起了父亲委托机制(PDM)。PDM更好的保证了Java平台的安全性,在该机制中,JVM自带的Bootstrap是根加载器,其余的加载器都有且仅有一个父类加载器。类的加载首先请求父类加载器加载,父类加载器无能为力时才由其子类加载器自行加载。JVM不会向Java程序提供对Bootstrap的引用

20、java的内存溢出

堆栈溢出

堆栈先进后出,有两个基本操做,push栈顶加,pop栈顶减。形成的缘由:过多的函数调用致使堆栈没法容纳这些调用的返回地址,通常在递归调用产生。如输入字符串过长,数组容纳不下,继续向栈顶写字符,提早申请动态内存能够避免,但若是堆栈生长方向和内存生长方向相反,在返回时就会出错

理论上Java由于有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被普遍使用于服务器端编程的一个重要缘由);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,所以也会致使内存泄露的发生。//对象处于持久态,就不会回收;

通常是程序所需求的栈深度过大致使的。解决时要分清是内存泄露仍是内存不足

jvm内存泄漏:调大-xmx-xms参数

持久带内存溢出:class对象释放(有过多的class对象,class对象占用信息过多)

没法建立本地线程:总容量不变,减少堆内存和非堆内存(线程内存不足)

递归改非递归,全局变量代替局部变量

相关文章
相关标签/搜索