1、String类型特点
String是封装数据类型,String类是final类,它是不可变的,不能被继承。
2、String s=”Hello”;s=s+”world!”;这两句代码执行后,原始的String对象中的内容变没?
没有,因为String被设计成为不可变类,不能修改,继承,代码执行后,s所指向的对象”hello”没有改变.不过s不指向s,而是指向了另外一个String.原来的对象还在内存中,只是不指向了。
3、Strings=new String(“xyz”);创建了几个String Object?二者之间有什么区别?
两个或一个。
当字符串“xyz”已存在时,只创建一个String对象,当“xyz”不存在时,创建两个对象。
4、String和StringBuffer的区别是什么?
1、String是不可变的,StringBuffer是可变的。如果已知字符串要改变就用StringBuffer.
2、String实现了equals和hashcode,而StringBuffer没有实现equals和hashcode。比如new String(“abc”).equals(new String(“abc”)的结果为true,
new StringBuffer(“abc”).equals(new StringBuffer(“abc”)
5、StringBuffer与StringBuilder的区别
StringBuffer和StringBuilder类都表示内容可以被修改的字符串,
StringBuilder是线程不安全的,运行效率高,StringBuffer是线程安全的,运行效率低。
如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。
如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。
6、equals 与 “==”的区别
equals比较的是两个字符串的值是否相等(内容是否相同);“==”比较的是两个字符串是否为同一个对象(同一内存地址)
7、String题目
String a = "abcd";
String b = "ab" + "cd";
System.out.println(a == b);//true
String t = "cd";
String c = "ab"+t;
System.out.println(a == c);//false
final String s = "cd";
String d = "ab" + s;
System.out.println(a == d);//true
String r = "ab";
String e = r + t;
System.out.println(a == e);//false
System.out.println(e.intern() == a);//true
String f = new String("abcd");
System.out.println(a == f);//false
System.out.println(f.intern() == a);//false
System.out.println(f.intern() == a.intern())//true
ps:JDK API文档中对intern()方法的描述是:
返回字符串对象的规范化表示形式。
一个初始为空的字符串池,它由类 String 私有地维护。
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。
它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。
所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。
8、String内存分配详解:
String x = "abc";
String y = new String("abcd");
内存分配情况如下图:
可以看出,x与y存在栈中,它们保存了相应对象的引用。第一条语句没有在堆中分配内存,而是将“abc”保存在常量池中。对于第二条语句,同样会在常量池中有一个“abcd”的字符串,当new时,会拷贝一份该字符串存放到堆中,于是y指向了堆中的那个“abcd”字符串。