String

关于String类:

      Java.lang.String类使用finnal修饰,不能被继承,String是常量,其对象一旦构造就不不再改变,所有对String值发生的改变实际上是将该String的值赋给构造成新的String类;

关于String数据内存:

编码方式:

      Java字符串在内存中采用unicode编码方式,即任何一个字符(无论中文还是英文)都算一个字符长度,占用两个字节定长编码;

常量池:

     Java在声明创建一个静态String类型数据时,选择在常量池,  所谓常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。在常量池,java会尝试尽量使用同一个对象,对于重复出现的字符串常量,JVM首先会在常量池中查找,如果存在,就返回该对象。

1  String str1 = "abc";
2  String str2 = new String("abc");

      对于1 中的 String str1 = "abc",首先会检查字符串常量池中是否含有字符串abc,如果有则直接指向,如果没有则在字符串常量池中添加abc字符串并指向它.所以这种方法最多创建一个对象,有可能不创建对象。

     对于2中的String str2 = new String("abc"),首先会在堆内存中申请一块内存存储字符串abc,str2指向其内存块对象。同时还会检查字符串常量池中是否含有abc字符串,若没有则添加abc到字符串常量池中。所以 new String()可能会创建两个对象。

String的匹配相等问题:

    比对象的内容是否相等使用equals(),比较两个引用是否指向同一个对象时用==;

关于StringBuffer:

    AbstractStringBuilder是StringBuffer的父类,定义了一些字符串的基本操作,比如append、insert、indexOf等公共方法。

未完,待续......
原文地址:https://www.cnblogs.com/zhishiyv/p/9576775.html