字符串是常量;它们的值在创建之后不能更改。因为 String 对象是不可变的,所以可以共享。
1、字符串String类型本身是final声明的,意味着我们不能继承String。
2、字符串的对象也是不可变对象,意味着一旦进行修改,就会产生新对象
我们修改了字符串后,如果想要获得新的内容,必须重新接受。 如果程序中涉及到大量的字符串的修改操作,那么此时的时空消耗比较高。可能需要考虑使用StringBuilder或StringBuffer的可变字符序列。
> JDK1.9之前有一个char[] value数组,JDK1.9之后byte[]数组 "abc"` 等效于 `char[] data={ 'a' , 'b' , 'c' }`。
4、String类中这个char[] values数组也是final修饰的,意味着这个数组不可变
6、任意数据类型与"字符串"进行拼接,结果都是字符串
7、字符串的对象个数
String str1 = "hello";//1个,在常量池中 String str3 = new String("hello"); //str3首先指向堆中的一个字符串对象,然后堆中字符串的value数组指向常量池中常量对象的value数组
字符串对象比较
只有两个字符串变量都是指向字符串的常量对象时,才会返回true
4、compareTo:String类型重写了Comparable接口的抽象方法,自然排序,按照字符的Unicode编码值进行比较大小的,严格区分大小写
if("".equals(str)) if(str!=null && str.isEmpty()) if(str!=null && str.equals("")) if(str!=null && str.length()==0)
注释(indexof方法内源码涉及)ch < Character.MIN_SUPPLEMENTARY_CODE_POINT
以0x开头代表十六进制,0开头的是八进制。 Character. MIN_SUPPLEMENTARY_CODE_POINT这个数代表十进制中62355,刚好是2个字节。