1、String类创建对象的方式
(1)直接使用“ ”定义
Sting name= "abc";
(2)通过String类的构造器创建对象
String s = new String(abc);
2、关于两种创建String方式创建几个对象的问题
例如: 以下代码共创建了几个对象?
String s= "abd";
String s1=new String("hello");
String s2=new String("hello");
String s3=s1;
String s4=s2;
解析:
String s 创建一个对象(在字符串常量池abd)
String s1 创建两个对象(在字符串常量池hello,堆内存hello)
String s2 创建一个对象(堆内存hello)
String s3 String s4 没有创建对象
综上所述:一共创建四个对象
3、String类和数组有关参数类型的影响
基本数据类型,形参的改变不会影响实参;引用数据类型,如果地址相同,形参的改变,会影响实参的改变,如果地址不同,形参的改变实参不变。
public class Example{
String str=new String("good");
char[]ch={'a','b','c'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
Sytem.out.print(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='g';
}
}
运行结果:good and gbc
解析:
(1)java 中String是 immutable的,也就是不可变,⼀旦初始化,其引⽤指向的内容是不可变的(注意:是内容不可变)。String内部使用了一个final类型的char数组 也就是说,假设代码中有String str = “aa”;str=“bb”;,则第⼆条语句不是改变“aa”原来所在存储地址中的内容,⽽是另外开辟了⼀个空间⽤来存储“bb”;同时由于str原来指向的“aa”现在已经不可达,jvm会通过GC⾃动回收。在⽅法调⽤时,String类型和数组属于引⽤传递,在上述代码中,str作为参数传进change(String str, char ch[]) ⽅法,⽅法参数str指向了类中str指向的字符串,但str= "test ok"; 语句使得⽅法参数str指向了新分配的地址,该地址存储“test ok”,⽽原来的str仍然指向“good”。
(2)对于数组⽽⾔,在change⽅法中,⽅法参数ch指向了类中ch指向的数组,ch[0] = 'g';语句改变了类中ch指向的数组的内容。
4、.equals相等问题
String s="duck";
StringBuffer sb=new StringBuffer("duck");
String e=new String("duck");
String t=e;
[A] s.equals(sb) [B] s.equals(e)
[C] t.equals(sb) [D] s==t
解析:
Stringbuffer不属于string类