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
posted @ 2021-04-16 16:19  袁中  阅读(137)  评论(0编辑  收藏  举报