说明:其中内容摘自:《Java程序员面试宝典》,这里仅供学习使用。
1. 字符串创建于存储的机制是什么?
(1)对于String s1 = new String("abc"); 和String s2 = new String("abc");语句,存在两个引用对象s1和s2,两个内容相同的字符串对象“abc”,他们在内存中的地址是不同的,只要用new总会产生新的对象。
(2)对于String s1 = "abc";和String s2 = "abc";语句,JVM中存在着一个字符串池的概念,其中保存着很多String对象,并且可以被共享使用,s1和s2引用的是一个常量池中的对象。
当创建一个字符串常量时,例如String s1 = "abc";,会首先在字符串常量池中查找是否已经有相同的字符串被定义,判断依据为String类equals方法的返回值,若已经定义,则直接获取其引用,此时不需要创建新的对象。若没有定义,则首先创建这个对象,然后把它加入到常量池总,在将他的引用返回。
对于String类型的变量,s=null和s="";是否相同?
- 不同,s=null,其中s是一个字符串类型的引用,他不指向任何一个字符串。s="";中的s是一个字符串类型的引用,他指向一个空的字符串。
new String("abc");创建了几个对象?
- 一个或两个。如果常量池中有“abc”,那么只创建一个对象,如果没有,那么先创建一个字符串常量对象加入到常量池中,然后将其引用复制给他的引用对象。
2. ==,equals和hashCode有什么区别?
(1)==用于比较两个变量的值是否相等,也就是用于比较变量对应的内存中存储的数值是否相同,因此,该运算符可以用于比较基本数据类型是否相同,以及两个引用变量是否相同(两个引用变量是否指向同一个内存存储空间),但无法比较两个对象的内容是否相同。
(2)equals方法是Object对象的一个方法,它默认的实现是==,因此也是比较引用对象是否相同。但它可以被覆盖,在String类中,equals方法是用于比较两个独立对象的内容是否相同,即堆中的内容是否相同,如下:
String s1 = new String("abc");
String s2 = new String("abc");
两个语句分别创建了两个对象,然后用s1和s2指向了这两个变量,这两个对象是两个不同的对象,他们的首地址不同,即s1和s2中存储的数值不同,所以s1==s2返回为false,但这两个引用对象指向的变量是相同的,即a.equals(b)将返回true;
(3)hashCode方法也是Object中的,也用来鉴定两个对象是否相同。hashCode方法返回对象在内存中地址转换成的一个int值。他与equals方法的关系为:
- 如果x.equals(y)=true,即两个对象根据equals比较是相等的,那么调用这两个对象中的任意一个对象的hashCode方法都必须产生相同的正数结果。
- 如果x.equals(y)=false,那么x和y的hashCode方法的放回值有可能相同也可能不同。但反之,如果hashCode的返回值不相同,一定能推出equals方法的返回值也不同。
3. String,StringBuffer,StringBuilder和StringTokenizer有什么区别?
Java中提供4个类可以对字符和字符串进行操作,分别是Character,String,StringBuffer和StringTokener,其中Character用于单个字符的操作,String用于字符串的操作,属于不可变类,StringBuffer用于字符串的操作,属于可变类。
如果一个字符串经常被修改,则最好使用StringBuffer进行实现。实例化一个String时,可以如下:
String s1 = new String("abc");
String s1 = "abc";
但使用StringBuffer,则只能为:
StringBuffer s1 = new StringBuffer("abc");
使用String和StringBuffer进行如下操作是等价的 ,但String多了很多附加操作:
String s = "hello";
s += " world";
StringBuffer sb = new StringBuffer(s);
sb.append(" world");
s = sb.toString();
StringBuilder也是修改字符串,与StringBuffer类似,但它线程不安全,只能用于单线程的情况下,但效率较StringBuffer(线程安全,牺牲了一些效率)高。因此效率上StringBuilder>StringBuffer>String。
4. Java中的数组是不是对象?
是,可以用instanceof方法进行判断。
5. 数组的初始化方式有哪几种?
对于一维数组:
对于二维数组:
6. length属性和length()方法有什么区别?
- 数组提供了length属性获取数组的长度。
- 字符串使用length()方法获取字符串的长度。