Java中String、StringBuffer、StringBuilder区别与理解
一、先比较String、StringBuffer、StringBuilder变量的HashCode值
使用System.out.println(obj.hashcode())输出的时对象的哈希码,
而非内存地址。在Java中是不可能得到对象真正的内存地址的,因为Java中堆是由JVM管理的不能直接操作。
只能说此时打印出的Hash码表示了该对象在JAVA虚拟机中的内存位置,
Java虚拟机会根据该hash码最终在真正的的堆空间中给该对象分配一个地址.
但是该地址 是不能通过java提供的api获取的
String变量连接新字符串会改变hashCode值,变量是在JVM中“连接——断开”;
StringBuffer变量连接新字符串不会改变hashCode值,因为变量的堆地址不变。
StringBuilder变量连接新字符串不会改变hashCode值,因为变量的堆地址不变。
小结:哈希码相同的变量,其内容不一定相同;内容向同变量,哈希码不一定相同;
public class Buffer_HashCode01 {
public static void main(String[] args) {
String str1="学海无涯苦作舟";
System.out.println("String 的 str1的hascode"+str1.hashCode());
str1=str1+"人间正道是沧桑"; //注意此str1的存储地址已发生变化
System.out.println("String 的 str1的hascode"+str1.hashCode());
System.out.println(str1);
StringBuffer sb1=new StringBuffer("弟子规");
System.out.println("原来 StringBuffer 的 hascode:"+sb1.hashCode());
StringBuffer sb2=sb1.append("圣人教"); //注意sb1和sb2指向同一个地址
System.out.println("添加字符串后StringBuffer 的 hascode:"+sb2.hashCode());
sb2.insert(6,"海纳百川");
StringBuilder sb=new StringBuilder("这显然是上半年");
System.out.println("改变前StringBuilder变量的hashCode值"+sb.hashCode());
sb.append("哦是的啊");
System.out.println("改变后StringBuilder变量的hashCode值"+sb.hashCode());
}
}
结果:
String 的 str1的hascode-2054942391
String 的 str1的hascode895667206
学海无涯苦作舟人间正道是沧桑
原来 StringBuffer 的 hascode:1311053135
添加字符串后StringBuffer 的 hascode:1311053135
改变前StringBuilder变量的hashCode值118352462
改变后StringBuilder变量的hashCode值118352462
二、比较String、StringBuffer、StringBuilder性能(仅在繁复操作)
String类由于Java中的共享设计,在修改变量值时使其反复改变栈中的对于堆的引用地址,所以性能低。
StringBuffer和StringBuilder类设计时改变其值,其堆内存的地址不变,避免了反复修改栈引用的地址,其性能高。
其中StringBuilder是专门类似于StringBuffer类的非线性安全类,即StringBuffer是线性安全的,适合于多线程操作;
StringBuilder是线性不安全的,适合于单线程操作,其性能比StringBuffer略高。
public class Xing_Neng_SSS01 {
public static void main(String[] args) {
long begin1 = System.currentTimeMillis();
String str = "";
for(int i=0;i<10000;i++){
str = str+i;
}
long end1 = System.currentTimeMillis();
long time1 = end1 - begin1;
System.out.println("1、String + time="+time1);
long begin2 = System.currentTimeMillis();
String str2 = "";
for(int i=0;i<10000;i++){
str2 = str2.concat(i+"");
}
long end2 = System.currentTimeMillis();
long time2 = end2 - begin2;
System.out.println("2、String concat time="+time2);
long begin3 = System.currentTimeMillis();
StringBuffer str3 = new StringBuffer();
for(int i=0;i<10000;i++){
str3.append(""+i);
}
long end3 = System.currentTimeMillis();
long time3 = end3 - begin3;
System.out.println("3、StringBuffer time="+time3);
long begin4 = System.currentTimeMillis();
StringBuilder str4 = new StringBuilder();
for(int i=0;i<10000;i++){
str4.append(""+i);
}
long end4 = System.currentTimeMillis();
long time4 = end4 - begin4;
System.out.println("4、StringBuilder time="+time4);
}
}
结果:
1、String + time=241
2、String concat time=92
3、StringBuffer time=4
4、StringBuilder time=2
三、String共享设计
当String使用引号创建字符串时,会先去字符串池中找,找到了就返回,找不到就在字符串池中增加一个然后返回,这样由于共享提高了性能。
而new String()无论内容是否已经存在,都会开辟新的堆空间,栈中的堆内存也会改变。
下面是==来比较地址是否相等。
public class String_Equals01 {
public static void main(String[] args) {
String str1="学海无涯苦作舟人间正道是沧桑";
String str11=str1;
String str12="学海无涯苦作舟人间正道是沧桑";
String str13=new String("学海无涯苦作舟人间正道是沧桑");
System.out.println("String 的 str1 的hascode"+str1.hashCode());
System.out.println("String 的 str11的hascode"+str11.hashCode());
System.out.println("String 的 str12的hascode"+str12.hashCode());
System.out.println("String 的 str13的hascode"+str13.hashCode());
System.out.println("str1==str11 "+(str1==str11));
System.out.println("str1==str12 "+(str1==str12));
System.out.println("str1==str13 "+(str1==str13));
}
}
结果:
String 的 str1 的hascode895667206
String 的 str11的hascode895667206
String 的 str12的hascode895667206
String 的 str13的hascode895667206
str1==str11 true
str1==str12 true
str1==str13 false
Java中String、StringBuffer、StringBuilder区别与理解的更多相关文章
- Java中String/StringBuffer/StringBuilder区别(转)
1.三者在执行速度方面的比较:StringBuilder > StringBuffer > String 2.String <(StringBuffer,StringBuild ...
- java中string , StringBuffer , StringBuilder 区别
1.String String变量的值不能改变,如果要改变String变量的值,虚拟机首先会遍历方法区中的字符串常量,如果存在需要的值,则虚拟机直接把此常量值的地址分配给String变量,如果不存在这 ...
- java中 String StringBuffer StringBuilder的区别
* String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...
- java中String,StringBuffer,StringBuilder之间的区别
文章转载自:http://www.cnblogs.com/frankliiu-java/archive/2010/07/05/1771537.html String是固定长度的字符串,如果要发生变化必 ...
- 探秘Java中String、StringBuilder以及StringBuffer
探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问 到的地方,今天就来和大家一起学习 ...
- 转:String StringBuffer StringBuilder区别
转自:http://www.iteye.com/topic/522167 作者:每次上网冲杯Java时,都能看到关于String无休无止的争论.还是觉得有必要让这个讨厌又很可爱的String美眉,赤裸 ...
- JAVA中String和StringBuilder类的特点及使用
转自:https://www.imooc.com/code/2202 仅做个人学习记录之用,侵删! 什么是 Java 中的字符串 在 Java 中,字符串被作为 String 类型的对象处理. Str ...
- String&StringBuffer&StringBuilder区别
String String类是final类故不可以继承,也就意味着String引用的字符串内容是不能被修改.String有两种实例化方式: (1)直接赋值(例中,String str = &q ...
- java 中String与StringBuilder 效率
之前印象中string与stringbuilder操作时,如果多次改变string就使用stringbuilder,效率会提高: 今天实际遇到了问题,亲身经历过之后,这性能不是一般的影响啊:不是同一个 ...
- java中String、StringBuilder、StringBuffer三者的区别
在Java项目开发中,字符串是最长使用的数据类型,而有关字符串的String.StringBuilder.StringBuffer三者又常常让人分不清楚什么时候该使用哪个. 特此整理一下. Strin ...
随机推荐
- HDU 3038 How Many Answers Are Wrong(种类并查集)
题目链接 食物链类似的题,主要是在于转化,a-b的和为s,转换为b比a-1大s.然后并查集存 此节点到根的差. 假如x的根为a,y的根为b: b - y = rank[y] a - x = rank[ ...
- SRM 618 DIV1 500
非常棒的组合问题,看了好一会,无想法.... 有很多做法,我发现不考虑顺序的最好理解,也最好写. 结果一定是两种形式 A....A dp[n-1] A...A...A sgma(dp[j]*dp[ ...
- C# 线程调用主线程中的控件
由于项目的需要,最近几天一直在做串口和数据库.由于C#使用的时间不长,所以在编写代码和调试的过程中总是遇到意想不到的问题,比如在使用串口接收数据的时候,在接收数据事件中想把接收的数据放入一个textb ...
- *HDU 1385 最短路 路径
Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/O ...
- *HDU2473 并查集
Junk-Mail Filter Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- Learn ZYNQ(10) – zybo cluster word count
1.配置环境说明 spark:5台zybo板,192.168.1.1master,其它4台为slave hadoop:192.168.1.1(外接SanDisk ) 2.单节点hadoop测试: 如果 ...
- linux系统安装(下)
Grub引导装载程序 目录简单介绍 /dev存放了设备文件 /dev/sad硬盘文件 root/install.log安装日志 root/kickstart包含这次安装信息,下次若需要相同安装可 ...
- 【转】Maven Jetty 插件的问题(css/js等目录死锁)的解决
Maven Jetty 插件的问题(css/js等目录死锁,不能自动刷新)的解决: 1. 打开下面的目录:C:\Users\用户名\.m2\repository\org\eclipse\jetty ...
- Win7 下安装VirtualBox 没有Ubuntu 64bit 选项问题
参考: win7安装virtualbox遇到的问题 基于VirtualBox虚拟机安装Ubuntu图文教程 问题 在安装VirtualBox之后,选择虚拟机进行安装的时候发现没有Ubuntu 64bi ...
- 源码网站(msdn.itellyou.cn) good
verysource 100万源码http://www.verysource.com/category/delphi-vcl/ MSDN DOWNLOADhttp://msdn.itellyou.cn ...