String是一个类,属于数据类型中的引用类型
Java中一切使用""引起来的内容,都是这个类的实例,称为字符串对象.
字符串在定义以后,值不可改变,是一个常量,实际是一个字符数组.
//这句话执行时,创建一个"Tom"字符串对象,将其地址保存在变量name中
String name = "Tom";
//这句话执行时看似在改变字符串的值,实际是创建了一个新的"Jerry"字符串对象,将其地址保存在name中
name = "Jerry";
//以上两句,在内存中,会有两个字符串对象"Tom"和"Jerry",没有任何字符串发生了改变,只是name引用了不同的字符串地址
//字符串可以当作数组使用
System.out.println(name.length());
//字符串实际是一个字符数组对象"包装"而来
char[] list = {'J','e','r','r','y'};
String str2 = new String(list);
System.out.println(name);
System.out.println(str2);
System.out.println(name == str2);
String类使用时注意
由上方案例可见,如果频繁的将一个String类型变量的值进行更改时,会创建很多字符串对象.效率低浪费内存.
所以正在频繁更改字符串时,不要使用String类变量.
String str="";
for(int i =0;i<=10000;i++){
str+=i;
}
如果要频繁更改字符串,使用StringBullder类或者StringBuffer类
如何创建字符串对象
1.使用""赋值创建
String="abc";
2.通过构造方法创建
常用构造方法 | 说明 |
---|---|
String() | 创建一个空白字符串对象 |
String(String str) | 创建一个指定字符串的字符串对象 |
String(char[] list) | 创建一个指定字符数组的字符串对象 |
String(byte[] list,String charsetName) | 按指定的编码格式的字符串对象 |
String str = "ab";
使用=赋值时,str对象保存的是在堆中的字符串常量池中的地址.
String str = "a"+"b"; 等同于String str = "ab";
String str = "a"+new String("b");
使用+拼接的字符串在编译后会成为一个整体,当+拼接的不是""而是一个对象时.
1.当编译时,发现+中有对象参与时,会先创建new StringBuilder()对象.
2.再在字符串常量池中定义"a","b".
3.会在堆中新创建一个String对象保存"b",
4.再使用创建的StringBuilder() 调用append方法将"a"与new String()的结果拼接保存在该StringBuilder()对象中,最后将new StringBuilder()的地址赋予给str
String str = new String("ab");
而使用new 的方式时,会在堆中创建一个String对象,将该对象指向字符串常量池中的地址,再将该String对象的地址赋值给str
可以使用jdk中地带的反编译工具javap对class文件进行反编译
在class文件所在目录下(项目的Out目录中),进入控制台,输入 javap -c 字节码文件名.class
字符串String类中的常用方法
方法名 | 返回值 | 作用 | 备注 |
---|---|---|---|
length() | int | 得到字符串的长度 | |
toLowerCase() | 转换后的字符串 | 将字符串转换为小写 | 不会改变原本的字符串 |
toUpperCase() | 转换后的字符串 | 转换为大写 | 同上 |
trim() | 去除前后空格后的字符串 | 去除首尾所有空格 | 同上,中间的空格不会去掉 |
isEmpty() | true/false | 判断是否为空白字符串 | |
getBytes() | byte[ ] | 转换为字节数组 | 字母用ASCII码,汉字默认在UTF-8编码下一个汉字占3个字节 |
toCharArray() | char[ ] | 转换为字符数组 | |
equalsIgnoreCase(String str) | true/false | 忽略大小写判断两个字符串是否相同 | 验证码 |
charAt(int index) | char | 返回index索引的字符 | |
equals(String str) | true/false | 判断两个字符是否相同 | 字面值 |
indexOf(String str) | int | 返回str出现的index索引,没有则返回 -1 | 只会返回第一次出现的 |
(int i) | 同上 | i 参考ASCII码 | |
(String str,int fromIndex) | 同上 | 由指定索引fromindex开始查找 | |
lastIndexOf(String str) | int | 返回str出现的index索引,没有则返回 -1 | 最后一次出现的 |
contains(字符序列) | true/false | 判断字符串中是否存在指定字符序列 | |
concat(String str) | String | 将指定字符串拼接到原字符串末尾 | |
startsWith(String str) | true/false | 判断字符串是否以指定字符串开头 | |
endsWith(String str) | true/false | 判断字符串是否以指定字符串结尾 | |
subString(int beginIndex) | String | 返回由指定索引beginIndex开始截取至末尾的字符串 | 不包括索引为beginIndex的字符 |
subString(int beginIndex,int endIndex) | String | 返回由指定索引beginIndex开始截取至endIndex的字符串 | 不包括索引为beginIndex的字符,包括索引为endIndex的字符 |
split(String regex) | String[ ] | 按照regex对字符串切分为一个字符串数组 | regex是正则表达式 |
replace(char oldChar,char newChar ) | String | 将字符串中的所有指定字符替换为新的字符 | |
valueOf(所有类型) | String | 将任意参数转换为字符串 | 该方法为静态方法 |
format(String format,Object... obj) | String | format一种格式,%a,bf,表示四舍五入保留b位小数,整体占a位 | %5.2f表示保留2位小数,整个数据只占5为,不足5位在最前补空格 |
可变字符串
String字符串是一个常量,在定义后,值不可改变.
如果使用String对象,对其频繁更新时,就会不停的创建新的对象,不停引用给同一个变量.
StringBuilder是一个对象,全程都是在操作StringBuilder类
总结
在使用字符串时,如果要比较值,建议不用 == 判断,因为 == 判断是内存地址.
如要频繁操作同一个字符串时,一定要使用可变字符串,StringBuider或StringBuffer的对象,不能使用String的对象