目录
四、使用scanner输入,值保存在堆内存中,与使用构造方法new出来相同
九、java字符串判断是否重复(去重)
一、创建字符串
1.直接赋值 2.通过构造方法创建
内存模型:
1. 第一种方法
2.第二种方法
因此,第一种方法较为节约内存。
code:
String std = "abc";
char[] ch = { 'a', 'b', 'c' };
String std1 = new String(ch);
ch[0] = 'Q';
String std2 = new String(ch);
byte[] bt = { 97, 98, 99, 100 };
String std3 = new String(bt);
System.out.println(std);
System.out.println(std1);
System.out.println(std2);
System.out.println(std3);
output:
abc
abc
Qbc
abcd
二、字符串的==号比较
基本数据类型比较的是数据值,而引用数据类型比较的是地址值。String是引用类型,故字符串中==号比较的是地址。
String a = "abc";
String b = "abc";
System.out.println(a == b);//true
因此,直接赋值时,a、b指向堆内存中串池中存放的“abc”,故a、b中存放的是串池中"abc"的地址,在串池中,相同的数值不会重复创建,而是采用引用的方式赋值,故a、b存放的地址相同,地址对比返回true。
而对于使用构造方法创建的字符串,如
String c = new String("abc");
System.out.println(a == c);//false
使用构造方法创建的字符串在堆区而不在串池中,故两者的地址不同,比较结果为false。
三、字符串内容比较
System.out.println(a.equals(c)); //true
四、使用scanner输入,值保存在堆内存中,与使用构造方法new出来相同
因为scanner的底层代码是使用new构造方法创建的字符串。
五、字符串的常见操作
注:不影响原字符串。
六、String和char以及int的相互转换
code:
String std = "1234567";
char figure = std.charAt(1);
String newFigure = String.valueOf(figure);
int fig = Integer.valueOf(figure);
int fig1 = Integer.valueOf(newFigure);
System.out.println(newFigure);
System.out.println(fig);
System.out.println(fig1);
output:
2
50
2
七、字符串的高效拼接
StringBuilder可以看作一个容器,可用来创建可变字符串对象。常用于字符串的拼接与反转。
code:
StringBuilder std = new StringBuilder();
System.out.println(std);// 打印为空,而不是地址,因为StringBuilder类在封装时进行了特殊处理
StringBuilder std1 = new StringBuilder("abc");
std1.append("123");
std1.append("ch001!@#!@%#$@@");
String type1 = std1.getClass().toString();
String std2 = std1.toString();//从StringBuilder类型变为String类型
String type2 = std2.getClass().toString();
System.out.println(type1);
System.out.println(type2);
System.out.println(std1);
output:
class java.lang.StringBuilder
class java.lang.String
abc123ch001!@#!@%#$@@
java8以前,字符串使用“+”进行,拼接时,在底层使用StringBuilder完成,之后再使用toString方法转换回Stirng,又由于toString方法在底层使用new String生成,故使用"+"拼接字符串至少会在堆内存中生存两个对象。
java8以后,字符串使用“+”拼接时,会首先预估各个字符的长度,开辟一个字符数组,最后生成一个新的字符串,优化了拼接速度。
八、 字符串拼接更简洁的方式
可以使用StirngJoiner,可以人为指定所需拼接的间隔符号、起始符号、终止符号。
code:
public static String pinjie(int[] arr) {
StringBuilder sb = new StringBuilder("[");
for (int i = 0; i < arr.length; i++) {
if (i != arr.length - 1) {
sb.append(arr[i]).append(",");
} else {
sb.append(arr[i]);
}
}
String sb1 = sb.append("]").toString();
return sb1;
}
public static void main(String[] args) {
int[] arr1 = { 1, 2, 3, 4, 5 };
System.out.println(pinjie(arr1));
pinjie1(arr1);
}
output:
[1, 2, 3, 4, 5]
九、java字符串判断是否重复(去重)
public static boolean judge(String t) {
List<String> s = new ArrayList<>();
for (int i = 0; i < t.length(); i++) {
s.add(String.valueOf(t.charAt(i)));
}
List<String> s1 = s.stream().distinct().collect(Collectors.toList());
if (s.size() != s1.size()) {
return false;
} else {
return true;
}
}