【Java基础】String StringBuffer StringBuilder
来源:互联网 发布:定义结构体数组 编辑:程序博客网 时间:2024/05/17 22:47
- String
String是不可变的
我们都知道String不是基本数据类型,而是一个对象,并且是final类型的,不可变的。(public final class String)
查看以下代码:
String text = "a";text = "b";
String不是不可变的么?为什么可以这样用?因为text是字符串"a"的引用,即引用是可以变化的,跟对象实例的属性变化没有关系。(这里创建的是两个String对象)
String设计成不可变的原因
字符串常量池是Java方法区中一个特殊的存储区域,当创建一个String对象时,假如这个字符串已经在常量池中了,就不会创建一个新的对象,而是引用已经存在的对象。++常量池指的是在编译期被确定,并保存在已编译的.class文件中的一些数据。它包括了关于类,方法,接口中的常量,也包括字符串常量++
String text1 = "abc";String text2 = "abc";
上面的代码只会在堆内存中创建一个实际的String对象。如果字符串对象允许改变的话,那么会导致各种逻辑错误,比如改变一个对象会影响到另一个独立对象。
栈(stack):主要保存基本数据类型和对象的引用,数据可以共享,速度仅次于寄存器(register),快于堆
堆(heap):用于存储对象
安全性,因为字符串是不可变的,所以是线程安全的,同一个字符串实例可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串本身就是线程安全的。
StringBuffer,StringBuilder
StringBuffer
StringBuffer和String一样都是用来存储字符串的,只不过他们内部的实现方式不一样,导致他们所使用的范围不同,对于StringBuffer,它在处理字符串的时候,如果是进行修改操作,并不会产生一个新的字符串对象。
StringBuffer的许多方法和String差不多,只不过修改时StringBuffer是修改自身的,而String类则是产生一个新的对象,这是他们最大的区别。
同时,StringBuffer是不能通过=来进行初始化的,它必须通过构造方法来进行初始化。
StringBuilder
StringBuilder和StringBuffer的不同之处在于StringBuilder是线程不安全的,StringBuffer是线程安全的。
String,StringBuffer,StringBuilder区别
常见面试题
如何比较两个字符串?使用“==”还是equals()方法?
- equals()是用来比较两个值的,==会比较两个引用
String s=new String("abc")创建了几个对象?
public String(String original) { this.value = original.value; this.hash = original.hash; }
上面是String的构造方法,我们在使用new调用了String的构造方法创建了一个对象,并将它的引用赋值给了str变量。
同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是“abc”,由此我们又要引入另外一种创建String对象的方法的讨论 -- 引号内包含文本String字符串与BufferString的传递问题
基本数据类型的值传递,不改变其值;引用数据类型的值传递,改变其值
String类虽然是引用数据类型,但是他当作参数传递时和基本数据类型是一样的
public static void changeString(String str) { // 因为str是属于局部变量,在调用该方法时实际参数s和形式参数str指向同一个字符串对象 // 但是在方法内部将str又指向了一个新的字符串对象,而此时s还是指向原来的字符串对象 // changeString方法执行完毕,局部变量str消失,方法内部产生的新的字符串对象称为垃圾 // 但是s还是指向原有的字符串对象,并没有改变 str += "test";}
String.intern()
- 存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同unicode的字符串常量,如果有,返回其引用,没有的话就在常量池中添加一个unicode等于str的字符串并返回它的引用
- 【Java基础】String,StringBuffer, StringBuilder
- java基础<String-StringBuffer-StringBuilder>
- Java基础 String StringBuffer StringBuilder
- 【Java基础】String StringBuffer StringBuilder
- java基础-String/StringBuffer/StringBuilder
- Java基础--String、stringbuffer、stringbuilder
- java基础02 String、StringBuffer和StringBuilder
- java基础笔记之String、StringBuffer、StringBuilder
- java基础类型String、StringBuffer、StringBuilder
- Java基础——String、StringBuffer、StringBuilder
- java基础 之 String类 StringBuffer StringBuilder
- Java基础之String,StringBuilder,StringBuffer
- Java基础回顾 : String、StringBuffer和StringBuilder
- Java基础:StringBuilder、StringBuffer和String
- java-基础-String、StringBuilder以及StringBuffer剖析
- java基础 String 、StringBuffer、StringBuilder的区别
- String StringBuffer StringBuilder 基础
- Java String,StringBuilder,StringBuffer
- Niushop 商城系统目录结构说明
- Android动画案例(二)补间动画
- MAC创建ipv6热点
- CMSIS-RTOS2 应用笔记 二 配置接口
- H2O框架简介(转载)
- 【Java基础】String StringBuffer StringBuilder
- 阅读笔记:Gated Bi-directional CNN for Object Detection
- combobox无法显示选中的数据,都是undefined
- C/C++/JAVA 二进制/十六进制 的应用 :大数(超过32位二进制数),按位逻辑运算,属性值设置,等
- saving.h
- Android 软键盘 弹出,默认隐藏,强制隐藏,自动变大写等
- CSDN-markdown编辑器使用教程
- 【python图像处理】极坐标变换及插值算法
- redis安装,redis项目以来,redis和spring整合,redis的service,redis的service实现类