String、StringBuffer、StringBuilder学习笔记

String类

String类的特点:

   由于 String 类使用 private final char value[]来实现字符串存储,所以String对象一旦创建,不可改变。这点相较与StringBuffer类有所不同,StringBuffer是可变的,而且是线程安全的。

与String相关的举足轻重的概念——常量池(Constant Pool):

  常量池(Constant Pool)是一个由数组组成的表,用来存储程序中的各种常量,包括Class、String、Integer等各种Java基本数据类型;而我们创建的String常量也存储与常量池的String Pool中。

如何创建String:

  • String s1 = "first";
  • String s2 = new String();
  • String s3 = new String("string");
  • String s4 = "first" + "second";

直接的""创建机制:

String str1 = "hello";//"hello"在编译时就能确定其值,属于编译期常量
Stirng str2 = "hello";
System.out.println(str1 == str2);//true

      编译期常量在编译完成后,"hello"就已存储在 Constant Pool 常量池中;到了运行期时,虚拟机会调用intern()方法,拿着"hello"去常量池中查找有没有这个对象(通过equals方法)。存在则返回常量池中相应的内存单元的引用位置,赋值给str1,str2同理。假如不存在,则会新建一个的 "hello" 放到 Constant Pool 中,返回内存单元的引用位置,赋值给引用的变量。

intern()方法: 当调用intern方法时,JVM会在常量池中通过equals()方法来匹配是否存在等值的String;若存在,则直接返回其地址,否则再新建。

new String("hello")的创建机制:

String str1 = "hello";
String str2 = new String("hello");//创建两次String对象,一次在String Pool中,一次在堆内存中
System.out.println(str1 == str2);//false

       在Java中,new一个新对象,不管在String Pool中是否存在相同的字符串对象,总会创建一个新的String对象存储在堆内存(heap)中,然后返回heap中相应内存单元的地址,赋值给str1;而srt2是指向String Pool中相应内存单元。

String类的常用方法:

//1、常用的String构造方法
String str = new String(byte[] bytes);//参数为字节数组,走编码表
String str = new String(char[] ch);//参数为字符数组,不走编码表,将字符数组变成字符串

//2、String常用的方法

//---------------------------------------------------------
//   返回值    |       方法            |       解释
     int          length()               //获取字符串str长度
     string       substring(begin,end)   //截取字符串的一部分,包括头不包括尾,返回新的字符串
     string       substring(begin)       //截取从begin开始的字符串,返回新的字符串
     boolean      startWith(str1)        //判断是否以指定字符串str1开头
     boolean      endsWith(str1)         //判断是否以指定字符串str1结尾
     boolean      contains(str1)         //判断是否包含某一子串
     int          indexOf(str1)          // 获取str1 在str 第一次出现的位置
     int          indexOf(char ch)       // 获取字符ch在str 第一次出现的位置
     char         charAt(index)          //根据位置(index)获取字符
     byte[]       getBytes()             //将字符串转成字节数组,走码表
     char[]       toCharArray()          //将字符串转成字符数组
     boolean      equalsIngnoreCase(String str) //判断是否相同,忽略字母的大小写
     String       toUpperCase()          //将str变成大写字母
     String       toLowerCase()          //将str变成小写字母
     String       trim()                 //去掉str中的空格
     String[]     split(",")             //将str用 ","分割成String数组

附加内容:

char类型做运算会先转码表

ASCII码表

大写字母     小写字母      数字

65-90           97-122        48-57

StringBuffer类

       由于String类过于浪费内存,为了提高字符串的操作效率,StringBuffer 横空出世。StringBuffer 是线程安全的可变字符序列,还有他的兄贵类StringBuilder是线程不安全的可变字符序列,但运行速度比StringBuffer快。

WHY SO FAST:

       与String类不同,StringBuffer类在修饰字符数组时并没有用final修饰。导致其在操作字符串时效率非常高,不用反复在String pool中创建对象,节约了内存,提高了操作效率。

         StringBuffer的默认初始长度为16,支持扩容;

String与StringBuffer操作时对比:

String str = "hello"+"world";
//简单的一行代码,但却十分消耗内存;相当于在String pool中创建了三个对象,"hello"、"world"和"helloworld"
StringBuffer strB = new StringBuffer();
strB.append("hello").append("world");
//StringBuffer对象,由于其成员变量char[]非final修饰,value数组可以反复变化,比较String就非常节约内存

StringBuffer常用的构造方法:

//1.空参构造(常用),初始容量为16
StringBuffer strB = new StringBuffer();
//2.有参构造
StringBuffer strB = new StringBuffer(String str);

常用方法:

//------------------------------------------------------------------------------
        返回值     |      方法                     |            注释
    StringBuffer    append(任意类型)                    将任意类型数据加在容器末尾
    StringBuffer    delete(start ,end[不包含])          删除start到end的字符内容
    StringBuffer    insert(index ,数据)                 将任意类型数据加在指定索引
    StringBuffer    replace(start,end,string[不包含])   将从start开始到end的字符串替换为string
    StringBuffer    reverse()                           将缓冲区中的字符串反转


 

猜你喜欢

转载自blog.csdn.net/WICHER_WU/article/details/79491327