String,字符串,一个引用类。存储结构是char数组
首先介绍一下他的常用方法:
1、从构造方法开始,他有四个构造方法,参数分别是:
String, cahr value[], StringBuffer, StringBuilder
2、equals方法
String重写了该方法,这个方法会传递一个Object类型的参数,首先进行判断引用是否一样,一样直接返回true,因为都是在字符串常量池中存储;然后判断传入的参数是不是一个字符串,然后循环判断每一个字符是否相同。用到了一个instanceof,简单写一下他的用法:
Object oString = "123";
Object oInt = 123;
System.out.println(oString instanceof Integer);
System.out.println(oInt instanceof Integer);
/*
output:
false
true
*/
3、除了equals方法,还有一个字符串比较的方法,compareTo方法,该方法循环比较所有的字符,发现第一个不一样的字符就返回’c1’ - ‘c2’;接收的参数是String类型,返回值是int
4、其他常见方法:
String str = " idndex ";
System.out.println(str.indexOf('i'));
//首次出现的下标位置
String strn = str.trim();
//去掉字符串首尾空格
String strReplace = str.replace('i', 'n');
//替换,把参数1 替换成 参数2
System.out.println(strReplace);
System.out.println(strn.lastIndexOf('e'));
//最后一次出现的下标位置
String[] a = {"test", "index", "hazel"};
String arrStr = String.join("-", a);
把字符串数组转成字符串
System.out.println(arrStr);
/*
output:
1
ndndex
4
test-index-hazel
*/
toLowerCase() //变成小写
toUpperCase() //变成大写
split() //按某字符进行分割
常见问题:
1、final修饰的好处
安全、高效
字符串是在常量池中进行存储的。也就是可能会有两个对象同时引用一块内存空间,如果可以改变,那么就没办法做到字符串常量池这种设计了
2、String StringBuffer StringBuilder的区别
String类不可变,那么要想往后追加内容性能就会变低,StringBuffer类提供了append和insert方法进行拼接,他们都用synchronized修饰,保证了线程安全,性能就不是很高了,StringBuilder也提供了append和insert方法,但是不保证线程安全;
3、两种新建方式的不同
String str1 = "java";
String str2 = new String("java");
System.out.println(str1 == str2);
str2 = "java".intern();
System.out.println(str1 == str2);
//output:
false
true
解释一下,str1是直接去字符串常量池中找这个字符串有就返回引用,没有就创建一个,然后返回引用;
str2是在堆上创建了一个对象,调用了intern对象才会把字符串保存到常量池中去
intern方法就是,如果常量池中含有了等于这个String的字符串,就会返回引用,否则在常量池中创建这个字符串,然后返回引用,这也就是上面代码执行结果的原因了
4、编译器做的优化
String s1 = "ja" + "va";
String s2 = "java";
System.out.println(s1 == s2);
//output: true
编译器会把第一个直接编译成"java",不会做+操作