【Java基础】String StringBuffer StringBuilder
- 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是线程安全的。
常见面试题
如何比较两个字符串?使用“==”还是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的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- Java基础 -- String,StringBuilder,StringBuffer三者的区别
结论 1-String,StringBuilder,StringBuffer 之间的区别主要是在两个方面,即运行速度和线程安全这两方面: 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:St ...
- java中String,StringBuffer,StringBuilder之间的区别
文章转载自:http://www.cnblogs.com/frankliiu-java/archive/2010/07/05/1771537.html String是固定长度的字符串,如果要发生变化必 ...
- java 比较String StringBuffer StringBuilder
String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能 ...
- Java学习|String,StringBuffer,StringBuilder?
1 String (1) String的创建机理 由于String在Java世界中使用过于频繁,Java为了避免在一个系统中产生大量的String对象,引入了字符串常量池.其运行机制是:创建一个字 ...
- Java基础 String/StringBuff/StringBuilder 常用操作方法复习/内存分析/三者的效率比较
附:jdk1.8使用IDEA安装.创建.使用JUnit单元测试 笔记总结: /**String 复习 * 1.像C++这样的char arr[]="..." 的方式无法声明Java ...
- Java中String/StringBuffer/StringBuilder区别(转)
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String 2.String <(StringBuffer,StringBuild ...
- Java基础-String和StringBuilder类型(11)
String类概述 字符串是由多个字符组成的一串数据字符串可以看成是字符数组 构造方法 public String(String original)public String(char[] value ...
- Java的String&StringBuffer&StringBuilder
一:String类 1.String对象的初始化 由于String对象特别用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = "ab ...
- Java之String,StringBuffer,StringBuilder类
在 java 语言中, 用来处理字符串的的类常用的有 3 个: String.StringBuffer.StringBuilder. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2 ...
随机推荐
- 子窗口url调整导致父窗口刷新
2014年3月19日 10:22:38 如题: 在弹窗里搜索时,url发生改变,导致父窗口的div消失.为何? 之前的逻辑是隐藏div 现在修改为插入节点 .可是还是刷新字窗口后,父窗口里面的div节 ...
- shell相关命令
1.shell是什么? 从用户角度:shell是用户与Linux沟通的桥梁 从程序员角度:shell本身是一种用C语言编写的程序 shell担任了翻译的角色,将用户输入的命令翻译成Linux能够识别的 ...
- iOS 开源库 之 AFNetWorking 2.x
1. 网络请求的基本知识 2. Get/Post 请求的使用 3. 文件(图片)上传 4. 断点下载 5. 其它使用细节 6. 设计优良的地方
- 属性(Attribute)资源
前面已经介绍过自定义View组件的开发,自定义View组件与Android系统提供的View组件一样,即可在Java代码中使用,也可在XML界面布局代码中使用. 当在XML布局文件中使用Android ...
- js事件监听器用法实例详解-注册与注销监听封装
本文实例讲述了js事件监听器用法.分享给大家供大家参考.具体分析如下: 1.当同一个对象使用.onclick的写法触发多个方法的时候,后一个方法会把前一个方法覆盖掉,也就是说,在对象的onclick事 ...
- 国民身份证号码校验之“C#/Winform方法实现+案例分析”
根据[中华人民共和国国家标准 GB 11643-1999]中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成.排列顺序从左至右依次为:六位数字地址码,八位数字出 ...
- --@angularJS--指令与控制器之间较复杂的交互demo2
1.index.html: <!DOCTYPE HTML><html ng-app="app"><head> <title>c ...
- WebRTC音视频引擎研究(2)--VoiceEngine音频编解码器数据结构以及参数设置
1.VoiceEngine Codec数据结构 WebRTC中,用一个结构体struct CodecInst表示特定的音频编解码器对象: struct CodecInst { int pltype; ...
- 使用Grafana 展示Docker容器的监控图表并设置邮件报警规则
一.Docker 容器监控报警方式 接着上篇文章的记录,看到grafana的版本已经更新到4.2了,并且在4.0以后的版本中,加入了Alert Notifications 功能,这样在对容器 监控完, ...
- Hadoop权威指南:MapReduce应用开发
Hadoop权威指南:MapReduce应用开发 [TOC] 一般流程 编写map函数和reduce函数 编写驱动程序运行作业 用于配置的API Hadoop中的组件是通过Hadoop自己的配置API ...