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
                    
                
                
            
        
浙公网安备 33010602011771号