字符串常见问题(笔试常考)
构造方法
public class StringDemo01 {
public static void main(String[] args) {
//public String();创建一个空白的字符串对象,不含有任何内容
String s1 = new String();
System.out.println("s1:" + s1);
// public String(char[] chs) : 根据字符数组的内容,来创建字符串对象
char[] chs = {'a', 'z', 'c', 'v'};
String s2 = new String(chs);
System.out.println("s2:" + s2);
//public String(byte[] bys) :根据字节数组的内容,来创建字符串对象
byte[] bys = {97, 98, 99};
String s3 = new String(bys);
System.out.println("s3:" + s3);
//String s4="abc";直接赋值的方式创建字符串对象,内容就是abc
String s4="abc";
System.out.println("s4:" + s4);
}
}
常见的考题
public class StringDemo02 {
public static void main(String[] args) {
//构造方法的方式得到对象
char[] chs = {'a', 'b', 'c'};
String s1 = new String(chs);
String s2 = new String(chs);
System.out.println(s1 == s2);
//结果:false
//直接赋值的方式得到对象
String s3 = "abc";
String s4 = "abc";
System.out.println(s3 == s4);
//结果true,都指向同一个常量池
System.out.println(s1 == s3);
//结果:false
String s5 = new String("abc");
//这句实际上创建了两个对象,浪费内存,最好不要用
System.out.println( s3 == s5);
//结果:false
}
}
public class StringDemo03 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
System.out.println(s1==s3);//false
/*常量池里有abc,ab,c
* 因s3是拼接的,Java底层就会在堆内存中创建
一个StringBuilder对象,自动调用方法拼接's2'和c
拼接完以后,调用toString()方法,把数据转换成String类型
此时s3指向的是堆内存中的地址,而s1是字符串常量池中的地址
*/
String s4 = "a"+"b"+"c";
System.out.println(s1==s4);//true
}
}
字符串的比较
使用==做比较
基本类型:比较的是数据类型是否相同
引用类型:比较的是地址值是否相同
字符串是对象,它比较内容是否相同,通过**equals()**方法实现
public class StringDemo04 {
public static void main(String[] args) {
//构造方法得到对象
char[] chs={'a','b','c'};
String s1=new String(chs);
String s2=new String(chs);
//直接赋值得到对象
String s3="abc";
String s4="abc";
//比较字符串地址是否相同
System.out.println(s1==s2);//false
System.out.println(s1==s3);//false
System.out.println(s3==s4);//true
System.out.println("~~~~~");
//比较字符串内容是否相同
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s3));//true
System.out.println(s1.equals(s4));//true
}
}