String

  1. String对象用于保存字符串,也就是一组字符序列

  2. "jack" 字符串常量,用双引号括起来的字符序列

  3. 字符串的字符用Unicode字符编码,一个字符(无论字母汉字)占两个字节

  4. String类有很多构造器 常用的有 String s1 = new String();
    String s2 = new String(String original);
    String s3 = new String(char[] a);
    String s4 = new String(char[] a, int startIndex, int count);
    String s5 = new String(byte[] b);

  5. a. String类实现了接口 Serializable, 说明String可以串行化:可以在网络传输
    b. 还实现了接口Comparable,String对象可以比较大小

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

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

  8. 一定要注意:value是一个final类型,不可以修改 即value不能指向新的地址,但单个字符内容可以变化。

创建String对象的两种方式:

方式一: 直接赋值 String s = "hsp";
方式二: 调用构造器 String s2 = new String("hsp");

  1. 方式一: 先从常量池中查看是否有"hsp"的数据空间, 如果有就直接指向; 如果没有就重新构建, 然后指向。 s最终指向的是常量池的空间地址。
  2. 方式二: 先在堆中创建空间,里面维护了value属性,指向常量池的hsp空间。如果常量池中没有"hsp", 重新创建,如果有,直接通过value指向、最终指向的是堆中的空间地址。

内存分布图如下:

alt text

intern的作用:

如果字符串常量池里存在一个和当前字符串对象等价的字符串对象(equals==true认为相同),那么返回字符串常量池里那个对象.如果不存在,把当前字符串对象存进常量池, 返回当前字符串对象.
即str.intern()方法最终返回的是常量池的地址.

面试题:

alt text

alt text

alt text
alt text


本文章使用limfx的vscode插件快速发布