String,StringBuffer,StringBuilder的使用
String类型
String类用于创建和操作字符串。
String类内部被final修饰,不可以进行修改。(所谓的修改实际上是在内存中开辟了一块新的空间储存修改后的内容)
String a = "abc";
String b = "abc";
String c = a + "def";
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(a == b);
由此可以看出a,b所指向的字符串地址相同,说明他们指向的是同一个对象。
String s = new String("abc");
String s1 = new String("abc");
System.out.println(s == s1);
System.out.println(s.equals(s1));
而这种实例化一个对象,此时其引用地址还是储存于栈中,而其内容中的字符串储存与堆中,在堆中的字符串内容也不能够改变,但是新建立的字符串就算和之前字符串内容相同也不会指向相同的地址,而是在堆中新开辟一块内存进行储存。
此时用 == 比较两个对象的地址,地址不同。equals比较两个对象的内容相同。
(equals是Object类中的方法,原本也是比较地址的一个方法,但是String类中重写了这个方法,让其比较字符串中的内容是否相等)
上述特性常在函数传参中由于对String类型的储存方法认知不清导致错误。
基本数据类型传递参数是传值,而引用数据类型是传地址,而String按道理来说是传地址,那么对其进行操作也应该直接作用于此对象,但实际情况是传参的过程中确实是将地址传递到函数中去了,函数中一旦改变此对象的内容String就会新开辟堆上的一块内存进行储存。修改内用当然也对原对象无影响。
此时就导致了我们看到的这种情况,String类型虽然是传地址,但是却又有传值操作的特性。
StringBuilder和StringBuffer
这两个类存在的意义非常简单。因为String类不能进行修改,在某些时候非常的不方便所以就出现了这两个类来对字符串进行修改。
而他们两个的区别就是StringBuilder是效率很高,但是线程不安全
StringBuffer是线程安全,但是效率相当低。
下面是这两个类中主要的方法:
出自:Java StringBuffer 和 StringBuilder 类 | 菜鸟教程 (runoob.com)
Stringbuilder同上。
原文地址:https://blog.csdn.net/a13931329858/article/details/140680401
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!