Java基础之字符串篇

字符串无论是在开发中还是在面试,算法题中,都非常常用。这里记录一下其相关的类和方法的使用,以及易错混淆点,以备不时之需。

一:String类

  (1)概述:

  (2)String 对象创建的五种方式:(字面量定义 和 构造器定义)

  【注意,混淆点来了!】注意第一种方式,虽然String是个引用类型,但是也可以不通过new,仅通过字面量的定义方式来进行初始化赋值。如:String s1 = "abcd"; 这种方式会将字符串“abcd”存入方法区中的字符串常量池中,而不是堆空间,且在常量池中不会含有重复字符串,因此当有其他String变量也赋值为“abcd”时,这些变量均指向同一地址。 如:String s2 = “abcd”, 则 s1 == s2 !!! 此外,如果给s1重新赋值“hello”,java不会在原有地址上修改,而是重新开辟一个常量池地址,将“hello”存入,继而s1指向新地址。此时原地址仍为“abcd”,也即s2 仍为“abcd”。(只要字符串不一样,就要重新开辟空间,重新构造)。而其他方式通过new构造字符串,变量实际上存入的是堆空间的地址,而堆空间里的值存的是字符串常量池中的地址,最终的字符串总是存入常量池中的。所以对两字符串进行“==”判断时(判断的是地址值),要留意赋值的方式,赋值的方式不同,存入的地址类型就不同。而equals()则不用注意,其只会判断字符串内容,不会判断地址值!(下图可能便于理解!)

  (3)字符串的拼接:

 

   (4)String的常用方法

  

   

   

  (5)String与字符数组之间的转换:

  

  (6)String与字节数组之间的转换:

  

 

二:StringBuffer 类与StringBuilder类:

  (1)StringBuffer常用方法(StringBuilder方法相同):

  

  (2)String、StringBuffer、StringBuilder三者之间的异同?(重点!!!)

  相同点:三者的底层都使用,char[ ] 存储。

  不同点:String:不可变的字符序列;

      StringBuffer:可变的字符序列;线程安全的,效率低;(多用于多线程);

      StringBuilder:可变的字符序列;JDK 5.0 新增的,线程不安全,效率高;(多用于单线程);

  注意,StringBuffer与StringBuilder默认声明长度为16的char [], 如果需要扩容,新开辟一个数组,长度扩容为原来容量的2倍 + 2, 同时将元素复制到新的数组中 。

  三者效率:StringBuilder > StringBuffer > String

 

  本文参考尚硅谷Java教程视频:https://www.bilibili.com/video/BV1Kb411W75N?p=468

posted @ 2021-03-09 18:40  Only、  阅读(108)  评论(0)    收藏  举报