【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 ...
随机推荐
- UVa 11340 - Newspaper
题目大意:报社根据文章中不同字符的价值付费给作者,给出字符的价值,计算一篇文章应付多少钱给作者. 先统计文章中每个字符出现的次数,再计算价值.直接寻址表(Direct Addressing Table ...
- UVa 311 - Packets
题目大意:有1X1,2X2 ... 5X5,6X6六种类型的物品,把他们装进6X6的盒子里,求使用的最少盒子数. 贪心吧,其实一看就知道思路了,算是常识吧,装物品时通常都是先装大的,再在其余空间放小的 ...
- div垂直居中(js)
window.onload = function(){ var xx = document.documentElement.clientHeight; // 470为要垂直居中的div的高度 he = ...
- Linux用户和用户组管理总结
Linux下和用户和用户组管理有关的配置文件: /etc/group Group account information. /etc/gshadow Secure group account info ...
- 扫码JSP
扫码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.o ...
- 【bzoj3998】 TJOI2015—弦论
http://www.lydsy.com/JudgeOnline/problem.php?id=3998 (题目链接) 题意 给出一个字符串,求它的字典序第K小的子串是什么,分情况讨论不在同一位置的相 ...
- Linux文件权限与目录配置
一.linux文件属性 用户组概念:假如主机有两个团体,第一个团体名为projecta,里面有class1,class2,class3:第二个团体名为projecb,里面有class4,class5, ...
- linux redis 和 windows redis 的安装
Linux 下安装 下载地址:http://redis.io/download,下载最新文档版本. 本教程使用的最新文档版本为 2.8.17,下载并安装: $ wget http://download ...
- zabbix3.2.3安装部署
安装nginx [root@xuegod64 ~]# yum install -y gcc gcc-c++ autoconf automake zlib zlib-devel openssl open ...
- IE6浏览器常见的bug及其修复方法
IE6不支持min-height,解决办法使用css hack: .target { min-height: 100px; height: auto !important; height: 100px ...