9.1String基本概念
1:String的两种实例化的方式
方式一:通过字面量定义的方试
方式二:通过new+构造器的方式
//此时s1和s2的数据JAVAEE声明在方法区中的字符串常量池中。
String s1="JAVAEE";
String s2="JAVAEE";
//通过new+构造器的方试:此时的s3和s4保存的地址值,是数据在堆空间
//中开辟空间以后对应的地址值
String s3=new String("JAVAEE");
String s4=new String("JAVAEE");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
System.out.println(s1==s4);//false
System.out.println(s3==s4);//false
System.out.println("*******************************");
Person p1=new Person("Tom",12);
Person p2=new Person("Tom",12);
System.out.println(p1.name.equals(p2.name));//true
System.out.println(p1.name==p2.name);//true 通过字面量的方式定义的“Tom”
p1.name="Jerry";
System.out.println(p2.name);//Tom
2.字符串的特性
1.String声明为final的,不可被继承
2.String实现了Serializable接口:表示字符串是支持序列化的。
实现了Comparable接口:表示String可以比较大小
3.String内部定义了final char[] value用于存储字符串数据
4.String:代表一个不可变的字符序列。简称:不可变性
体现:
1)当对字符串重新赋值时,需要重写指定的内存区域赋值,不能使用原有的value进行赋值。
2)当对现有的字符串进行连接操作时,也需要重写指定内存区域进行赋值,不能在原有的value上进行赋值。
3) 当调用String的replace()方法修改字符或者字符串,也需要重写指定内存区域进行赋值,不能在原有的value上进行赋值。
5) 通过字面量的方式(区别与new)给字符串赋值,此时的字符串值声明在字符串常量池中。
6) 字符串常量池中,不会存储相同内容的字符串的。
问题:String s=new String("abc");方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:“abc"
3.值的比对:
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2.只要其中有一个是变量,结果就在堆中。除了被定义了final
3.如果拼接的结果调用intern()方法,返回值就在常量池中
String s1="javaEE";
String s2="hadoop";
String s3="javaEEhadoop";
String s4="javaEE"+"hadoop";
String s5=s1+"hadoop";
String s6="javaEE"+s2;
String s7=s1+s2;
System.out.println(s3==s4);//true 这个是字面量 在常量池中
System.out.println(s3==s5);//false 其他的都在堆中
System.out.println(s3==s6);//false
System.out.println(s3==s7);//false
System.out.println(s5==s6);//false
System.out.println(s5==s7);//false
System.out.println(s6==s7);//false
//如果拼接的结果调用intern()方法,返回值就在常量池中
String s8=s5.intern();//返回值得到的s8使用的常量值中已经存在的”javaEEhadoop“
System.out.println(s3==s8);//true