String类

 结构剖析

image-20220401191001811

实现接口:

Serializable接口表示String是串行化的,表示String类可以在网络上传输

Comparable接口表示String类是可以比较的,具体实现方法,可以自己写,也可以按照他的规则

CharSequence接口表示String类是一个有序字符集合

 

 

String类是final类,不能被其他类继承

String有属性private final char value[] 用于存放字符串内容

image-20220401191913253

一定要注意

value是final类型,一但被赋值就不能改变

但是这里的不可改变是指地址不可修改,而不是值不可修改,如图

image-20220401194754171

value一开始指向0x12345,之后不能改变地址,也就是不能修改成0x2345

但是能够修改他的值,比如,能把char数组中的 J 修改成A或者别的,但是不能将value指向v2

final  char [] value = {'J','A','C','K'};
value[0] = 'A';
final char [] v2 = {'a'};
value = v2;//错误,地址不可修改


创建剖析

 

两种创建String对象的区别

  1. 直接赋值

    String s = "xhp"
  2. 调用构造器

    String s2 = new String("xhp");

 

方式一:先从常量池查看是否有"xhp"数据空间,如果有,直接指向,如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址

 

方式二:先在堆中创建空间,里面维护了value属性,指向常量池的xhp空间,如果常量池没有,重新创建,如果有,直接通过value指向。最终指向堆中的空间地址。

如图

image-20220401200834972

题目:

        String a = "xhp";
       String b = new String("xhp");
       System.out.println(args.equals(b));//T
       System.out.println(a == b);//F
       System.out.println(a == b.intern());//T
       System.out.println(b == b.intern());//F
//intern()返回常量池中的地址,如果没有找到则创建一个新的

 



posted @ 2022-04-01 19:55  子非鱼!  阅读(75)  评论(0)    收藏  举报