1. 创建
String str=“abc”;
String str1=“abc”;
- 如果"abc"在String Pool中不存在(equals比较),则会创建一个String(“abc”)对象,str指向这个对象
- 以后以这种方式再次创建"abc"对象时,都只是指向第一次创建的"abc"对象
- str==str1 结果:true
String str3 = “ab”+“c”;
str==str1==str3
- str3编译期自动优化为"abc"
String str4 = “ac”;
String str5 = str4+“c”;
- str5==str 结果:false
JVM对于有字符串引用存在的字符串"+"连接中,而引用的值在程序编译期是无法确定的,即str4+"c"无法被编译器优化,只有在程序运行期来动态分配并将连接后的新地址赋给str5
str=“bcd”;
- 字符串是不变对象,str重新赋值"bcd",String pool中查看是否有"bcd"对象,无则创建,然后str会重新指向bcd"对象(即str中的地址改变),原来的"abc"对象在内存中还存在,并没有改变
String str = new String(“abc”);
String str1 = new String(“abc”);
- 首先在String Pool中查看是否存在String(“abc”)对象,不存在则创建;然后执行new String(“abc”)构造方法,在Heap里又创建一个新的字符串对象“abc”,引用str指向Heap中创建的新对象
- 因此,new String(“abc”)创建字符串对象时,可能会创建2个对象,编译期在String Pool中创建一个,运行时Heap中创建一个
- str==str1 结果:false
构造方法
String str = new String(char[ ], "UTF-8") //字符数组构造一个字符串
2. 字符串的操作
- 注:指定位置都是含头不含尾;下标都是从0开始
1.字符串转换
1.基本类型-字符串
String str=Integer.toString(123) //将int类型的转换成字符串
String str=String.valueOf(1234.1) //将任何基本类型转换为字符串
2.字符串-基本类型
int Integer.parseInt(str)
int Integer.parseInt(str,8);//将一个字符串按照指定进制转成十进制的整数
parseInt("8",8) 八进制不可能出现8=异常
double b=Double.parseDouble(str)
3.字符串-包装类型
Long Long.valueOf("123")
4.字符串-字符数组
char[] toCharArray()
String String.valueOf(char[])
5.字符串-字节数组
byte[] byteArr=str.getBytes()
byte[] byteArr=str.getBytes("UTF-8") //StandardCharsets.UTF_8
String str=new String(byteArr,"UTF-8");
2.API
1.字符串长度
int str.length()
2.获取给定位置的字符
char str.charAt(int index)
3.大小写转换
String str.toUpperCase() //英文部分转换成大写
String str.toLowerCase() //英文部分转换成小写
//一般用在忽略大小写的验证码
4.截取当前字符串中指定范围的内容
String str.substring(0,4)
beginIndex ~ (endIndex - 1) = 0 ~ 3
String str.substring(4) //指定位置到末尾
5.判断字符串是否是以给定字符串开始、结尾
boolean str.startsWith("th") //判断前缀
boolean str.endsWith("va") //判断后缀
6.是否满足正则表达式
String str="1583300";
String regex="^(158|159)"; //以158或159开头
boolean str.matches(regex);
7.替换
String str2=str1.replaceAll(String regex, String replacement)//将满足正则部分替换成给定字符串
String replace(char oldChar,char newChar)//将给定字符替换成新字符
8.将当前字符串中第一个匹配给定的正则表达式内容部分替换为给定内容
String str1="158000159";
String regex="^(158|159)";//以158或159开头
String str2=str1.replaceFirst(regex,"999");//结果:999000159,除第一个外其他符合的不会替换
//成功则返回替换的字符串,失败则返回原始字符串
9.字符串格式化
//format:占位符+标识符构成的转换符
//args:用于替换占位符的数值
String format(String format, Object... args);
-
占位符
符号 数据类型 %s 字符串类型 %c 字符类型 %d 整数类型(十进制) %b 布尔类型 %f 浮点类型 %tx 日期与时间类型 -
标识符
符号 说明 + 正数:前面添加正号;负数:本身前面就有符号,无效果 0 在数字位数不够的前面补上0 空格 在位数不够的地方补上空格 , 对数字每三个数字一组,添加数字分结号(又叫千分号),常用显示金额 ( 使用括号将去掉负号的负数包含进来 -
例子
代码 说明 结果 (“Hi,%s”, “小超”) Hi,小超 (“%.2f”, 42.8571) 保留两位小数,并四舍五入 42.86 (“%+d”,15) 15前面添加正号 +15 (“%04d”, 99) 总共4位数字,不够的,数字前面补0 0099 (“% 4d”, 99) 总共4位,不够的,数字的左边补空格 空格空格99 (“%3d”,8) 总共3位,不够的,左边补空格 空格空格8 (“%-3d”,8) 总共3位,不够的,右边补空格 8空格空格 (“%,d”, 12345) 千分位加逗号分隔 123,456,789 (“%(f”, -99.99) 去掉符号,并将数字用括号括起来 (99.990000)
10.拆分
String[] str.split("[0-9]+")
1)如果连续匹配到拆分内容,中间会剩余空串,末尾的拆分空串会忽略
2)如果字符串中不包含拆分符:
空串:数组长度=1,数组中只有一个空串,不会报错
没有分隔符的String,拆分出来数组长度=1,就是本身的字符串,不会报错
11.去除两边空白字符
String str.trim()
12.查找给定字符串在当前字符串中的下标
int str.indexOf("in")//从头开始找
int str.lastIndexOf("in")//从末尾开始找
int str.indexOf("in",3))//从给定的位置找
//当前字符串不包含该内容则返回-1
//从头找和从末尾找的位置一样表示给定字符串在该字符串中只有一份
13.接受字符串输入
String in.nextLine() //以回车为分隔符 //空格也算字符输入
String in.next() //以空格或回车为分隔符
14.比较
- 其实就是使用ASCⅡ码做减法运算
- 字符串在进行比较时是比较每一位的ASCⅡ码,先比较第一位,再比较第二位,依次向后进行比较,比较到最小长度的字符串的位数后就停止比较
- 减法结果反应比较大小结果
- 正数:s1 > s2
- 负数:s1 < s2
- 0:s1 = s2
int s1.compareTo(s2);
//忽略大小写比较
int s1.compareToIgnoreCase(s2);
//最小长度的字符串是"122",所以比较完第3位就停止比较,所以以下3个实际都是122-120=2
"122".compareTo("120"); //2
"122".compareTo("1200"); //2
"122".compareTo("12000"); //2
//97-65
"a".compareTo("A"); //32
boolean "EXIT".equals(str)
//这样判断的好处是即使str=null也不会空指针,且正常判断
15.忽略大小写情况下判断是否相等
boolean "A12bc".equalsIgnoreCase(str)
16.判断字符串中是否含有给定字符序列
boolean str.contains("name");
17.是否为空串
//等效于str.length()==0
boolean str.isEmpty();
18.连接成分隔符分割的字符串
- 空集合连接结果是空串
String String.join(",",集合<String> / String[])
String String.join(",",可变长的String参数)
19.字符串操作中特殊字符的转义
写法 | 说明 |
---|---|
\\. | 点 |
\’ | 单引号 |
\" | 双引号 |
\\ | 反斜线 |
\n | 换行符 |
\r | 回车符 |