有这样一道题 String s=new String(“abc”); 这样的方式创建对象,在内存中创建了几个对象?
答案:两个,一个是堆空间中new出的结构,另一个是char[]对应的常量池中的数据(“abc”)而这就涉及到了关于String类的使用
String类,代表字符串,Java程序中所有字符串字面值都作为此类的实例实现。
String对象的字符串内容是存储在一个字符串数组value[]中的
String实现了Serializable接口:表示字符串是支持序列化的
String实现Comparable接口,表示String可以比较大小
String内部定义final char[] value 用于存储字符串数据
String 代表了不可变的字符序列,也就是它的不可变性。
体现:
1)当对字符串重新赋值时,需要重新制定内存区域赋值,不能使用原有的value进行赋值;
2)当对现有的字符串进行连接操作时,也需要重新制定内存区域赋值,不能在原有的位置上赋值
3)当调用String.replace方法修改指定的字符或字符串时,也需要重新指定内存区域,不能在原有的value上赋值
通过字面量的方式给一个字符串赋值时,此时字符串声明在字符串的常量池中 ```java String s1="abc";// 字面量 String s2="abc";// 此时的s1和s2是同一个变量,在常量池中 ``` 字符串的常量池是不会存储相同内容的字符串,而通过new+构造器的方式,将字符串保存在地址值的堆空间中
String s1 = "javaEE";
String s2="javaEE";
String s3=new String("javaEE");
String s4=new String("javaEE");
// 因为是字面值,字面值二者是相等的
System.out.println(s1==s2);
// 因为s3是new的新对象堆空间中,所以不等
System.out.println(s1==s3);
// 同理s4也是new的新对象堆空间中,所以不等
System.out.println(s1==s4);
// s3和s4都是new的新对象堆空间中,所以不等
System.out.println(s3==s4);
这里要特别注意一点,当使用final修饰的时候,此时变量就变为了常量
String s1="javaEEhadoop";
String s2="javaEE";
String s3=s2+"hadoop";
System.out.println(s1==s3);
final String s4="javaEE";// 加入final,该变量成为常量
String s5=s4+"hadoop";
System.out.println(s1==s5);// 所以此时返回true