1、字符串基本性质
String是SUN写好的一个内置类,java.lang.String。
String的底层是用byte[]进行存储数据。
String类是用final修饰的,调用者不能对其中的属性和方法修改。是线程安全的。
凡是直接用双引号创建的都是String对象,这类String对象都在方法区的字符串常量池中创建,一旦创建不可改变,都会占用空间。
字符串对象都有length()方法,可以获取字符串的长度
2、String对象的两种创建方式和区别
//方式1
String str1 = "abc";
//方式1在JVM中,是在栈中创建了变量str1,在方法区的字符串常量池创建了对象"abc"。然后栈中的变量str1直接指向了方法区的对象"abc"。只创建了一个对象。
//方式2
String str2 = new String("abc");
//方式2在JVM中,是在栈中创建了变量str2,在堆中创建new了对象string,在方法区的字符串常量池创建了对象"abc"。然后栈中的变量str2指向的是堆中的对象string,再有对象string指向方法区中的对象"abc"。创建了两个个对象。
3、字符串判断是否内容相等
字符串判断是否内容相等时,用equals方法,不要用==
SUN重写了String 的equals方法,可以直接比较两个字符串的值。
建议:"字符串".equals(字符串变量名)这样使用equals,可以避免空指针异常
4、字符串拼接
进行字符串拼接操作,较少的字符串的连接可以用+,也可以使用StringBuffer/StringBuilder的append方法,后者可以减少内存的损耗。
//变量str1和str2是指向字符串常量池中的同一个字符串对象
String str1 = "a"+"b";
String str2 = "abc";
//用+做字符串拼接,是在堆中创建了新的String对象,再让变量str3指向它
//以下相当于new String("abc"),和上面的在内存创建形式是不同的
String str3 = str1+"c";
5、String对象内存图
6、String类中常用的构造方法
-
"字符串" 常用
-
new String("字符串") 常用
-
new String(byte/char类型的一维数组 ) 传入一个byte/char数组
-
new String(byte/char类型的一维数组、int截取数组的起始下标、int截取长度)
7、String类中常用的方法
char c = "字符串".charAt(int index)
通过字符串下标index获取字符
int compareResult = "字符串1".compareTo("字符串2")
比较两个字符串的大小,从首个字符开始依次比较
compareResult 有三个值:
0表示两字符串相等,-1表示字符串1小于字符串2,1表示字符串1大于字符串2
boolean result = "字符串1".contains("字符串2")
判断字符串1中是否包含字符串2,包含返回true,不包含返回false
boolean result = "字符串1".endwith("字符串2")
判断字符串1中是否以字符串2结尾,是以字符串2结尾返回true,不是返回false
boolean result = "字符串1".equals("字符串2")
比较字符串1的值是否等于字符串2(不忽略大小写),相等返回true,不相等返回false
boolean result = "字符串1".equalsIgnore("字符串2")
比较字符串1的值是否等于字符串2(忽略大小写),相等返回true,不相等返回false
byte[] byteArr = "字符串".getBytes()
将字符串转成byte数组
int index = "字符串1".indexOf("字符串2")
返回字符串2在字符串1中第一次出现处的下标/索引,没有就返回-1
int index = "字符串1".lastIndexOf("字符串2")
返回字符串2在字符串1中最后一次出现处的下标/索引,没有就返回-1
boolean result = "字符串".isEmpty()
判断字符串是否是空字符串,是返回true,不是返回false
int length = "字符串".length()
返回字符串的长度
String newStr= "字符串".replace("字符串的片段","替换字符串片段")
返回替换后的新的字符串
String[] strs ="字符串".split ("分隔符")
返回按指定分隔符拆分后的字符串数组
boolean result = "字符串1".startsWith("字符串2")
判断字符串1 是否是以字符串2开始,是返回true,不是返回false
String newStr = "字符串".substring(beginIndex)
将字符串从下标beginIndex(包括该下标的字符)截取到最后,返回截取到的字符串
String newStr = "字符串".substring(beginIndex,endIndex)
将字符串从下标beginIndex(包括该下标的字符)截取到下标为endIndex前一个字符,返回截取到的字符串
char[] charArr = "字符串".toCharArray()
将字符串转换为char数组
String newStr = "字符串".toLowerCase()
将字符串全部转为小写形式,返回一个新的字符串
String newStr = "字符串".toUpperCase()
将字符串全部转为大写形式,返回一个新的字符串
String newStr = "字符串".trim()
去掉字符串的前后空格,返回一个新的字符串
String Str = String.valueOf(非字符串)
将非字符串转为字符串
8、StringBuffer和StringBuider
StringBuffer可以理解为:用来接收数据的缓存。
StringBuffer和StringBuider这两个内置类都可以用作字符串拼接,但主要java还是提供StringBuider用作字符串拼接。
StringBuffer和StringBuider底层都是byte[]数组,往他们中存放数据,其实就是放到byte[]中,这个数组的默认初始化容量是16个字符。
建议:在创建StringBuffer和StringBuider对象时,尽量可能给定一个合适初始化容量,减少底层数组的扩容次数
StringBuffer和StringBuider的区别是:前者是线程安全的,后者是非线程安全的