参考链接: https://blog.csdn.net/u012396308/article/details/46998187 参考链接: https://blog.csdn.net/AlbenXie/article/details/89739172
不同于C,C++,在Java中,String是引用数据类型,且java对其进行了特殊的处理,提供专有的String支持。
String对象
注:String对象内容是不可以改变的
String的实例化
直接赋值实例化: String 对象=内容。 在实例化时,只会开辟一块对内存空间,并且对象可以自动入池以实现对象之间的共享构造方法实例化: String 对象=New String(内容)【相当于调用了String类的构造方法,public String (String s)】 在实例化时,会开辟两块堆内存空间,其中堆内存开辟出的内存空间会成为垃圾,实例化的对象也不会自动入池,需要利用intern()进行手动入池 eg:
public class P{
public static void main(String args[]) {
String str=new String("hello").intern();
String str1=new String("hello");
String str2="hello";
System.out.println(str1==str); //false --str与str1开辟出了两块堆空间
System.out.println(str==str2); //true --str入池,str2会在对象池中寻找,所以二者地址相同
System.out.println(str2==str1); //false --str2地址与str相同,故于str1不同
}
}
匿名对象
只有堆内存,没有栈内存的引用空间,用new xxx()进行调用。对象在使用一次后就会成为垃圾,所以只能使用一次。 eg: new Person(“张三”).getInfo() 而String的直接实例化本质就是为字符串的匿名对象起了一个名字
对象池
针对于几个特殊的类使用了共享设计的思路。在进行直接赋值实例化String时,字符串内容定义之后,会自动将自己保存到对象池之中,若此时其他的字符串也采用了直接赋值,并且内容完全相同,那么不会开辟新的堆内存空间,而是通过对象池直接找到堆内存空间地址而直接引用。为共享设计模式
String的比较
==:是java本身提供的关系运算符,进行数值的比较,比较的是地址(是否为同一个对象)equals:是String类的方法,比较的是字符串的内容,又因为子u穿的匿名对象永远不可能为null,故在进行equals进行比较时,应尽量使用:匿名对象.equals(String对象)来防止空指针异常。
String内置方法的使用:
略(请下载javaAPI进行查找)
StringBuilder与StringBuffer
StringBuilder与StringBuffer都继承与抽象类AbstractStringBuilder ,且底层都是用的char数组(jdk9之后用的是byte数组)
StringBuilder
在单线程情况下,如有大量的字符串操作情况,应该使用StringBuilder来操作字符串。
StringBuffer
在多线程情况下,如有大量的字符串操作情况,应该使用StringBuffer。StringBuffer源码在每个方法前加了关键字Synchronized,保证了线程安全 其余在底层上,但在效率上比StringBuilder低。StringBuffer与StringBuilder实现方法相同
底层源代码:https://blog.csdn.net/u012396308/article/details/46998187 底层源代码: https://blog.csdn.net/AlbenXie/article/details/89739172
(源代码)实现原理
StringBuilder与StringBuffer,首先在实例化时定义了一定长度的char数组,添加字符串时,若添加的字符串长度小于数组长度,则可以直接添加。若大于数组长度,则扩充容量,最后声明的新数组进行对原数组进行拷贝并添加新的字符串内容。
相互转换
StringBuffer向String转换: (1)任何对象都有toString()方法,用于转换为字符串(Object的方法) (2)利用“+”进行连接String 向StringBuffer转换: (1)通过StringBuffer构造方法, (2)先进行StringBuffer实例化,在通过append()进行调用。
public static void main(String args
[]){
String str1
="hello word!!";
StringBuffer sb1
=new StringBuffer("I am Cyc");
StringBuffer sb2
=new StringBuffer(str1
);
StringBuffer sb3
=new StringBuffer();
String str2
=sb1
.toString();
String str3
=sb1
+"";
sb3
.append(str1
);
System
.out
.println("str2为"+str2
);
System
.out
.println("str3为"+str3
);
System
.out
.println("sb2为"+sb2
);
System
.out
.println("sb3为"+sb3
);
}
相比于String类,StringBuffer与StringBuilder拥有reverse(),insert()方法,与delete()方法可以进行字符串的快速处理。