博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于String 和 StringBuffer、StringBuilder
阅读量:6087 次
发布时间:2019-06-20

本文共 2608 字,大约阅读时间需要 8 分钟。

闲话不多,先看一段代码

public class test {    public static void main(String[] args)   {    String str1 = "hello";    //方法1    String str2 = "hel"+"lo";        //方法2    String str3 = "hel";    str3 = str3 + "lo";       System.out.println("str1 == str2 :" + (str1 == str2));    System.out.println("str1 == str3 :" + (str1 == str3));  }}

结果会是什么呢,你们可以先猜猜

 

---------------------------------------我是分割线----------------------------------------------------

答案:

str1 == str2 :true

str1 == str3 :false

 

对于str2,jvm会自动帮你优化成

str2 = "hello";

首先,要注意一点,上面程序中的==并不表示比较内容,它们的值是指向对象所在的内存地址,而不是对象本身,而真正的比较内容是用的equal函数。

那他们相等的缘由,就一定是因为str1与str2所指向的地址。

当执行String str1 = "hello";

真正发生的事情,我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以

当继续执行String str2 = "hello";(优化后语句)时并不是new的一个字符串,此时并没有第二个对象产生,str2还是指向原来那个对象,也就是,和str1指向同一个对象。

ok地址相同了,自然返回true。

 

str3 =str3+"lo";

实际上是:
str3 = (new StringBuilder()).append(str3).append("lo").toString();
显然,str3是new出来的 

要注意一点的是,String是不可变类,也就是说执行这个语句的时候,并不是说在原来的对象后面加上lo,而是说重新生成了一个新对象"hello",str3成为这个新对象的引用对象,而最重要的问题是,原先的"hel"依然存在。

 

好的,现在你一定在想,能不能有个好点的办法?有!

 

StringBuffer对象代表一个字符序列可变的字符串,当一个StringBuffer创建后,通过StringBuffer提供的一些方法可以改变这个字符串对的字符序列,一旦通过StringBuffer生产了最终想要的字符串,调用toString()方法即可将其转换为一个String对象

而StringBuilder是从jdk1.5后出现的,使用基本同StringBuffer,不同点是StringBuffer是线程安全的,但性能略低,StringBuilder反之

 

关于其简单的用法,盗用一下李刚老师的疯狂Java讲义里面的代码吧:

/** * Description: * 
网站: 疯狂Java联盟 *
Copyright (C), 2001-2012, Yeeku.H.Lee *
This program is protected by copyright laws. *
Program Name: *
Date: * @author Yeeku.H.Lee kongyeeku@163.com * @version 1.0 */public class StringBuilderTest{ public static void main(String[] args) { StringBuilder sb = new StringBuilder(); //追加字符串 sb.append("java");//sb = "java" //插入 sb.insert(0 , "hello "); //sb="hello java" //替换 sb.replace(5, 6, ","); //sb="hello, java" //删除 sb.delete(5, 6);//sb="hellojava" System.out.println(sb); //反转 sb.reverse();//sb="avajolleh" System.out.println(sb); System.out.println(sb.length()); //输出9 System.out.println(sb.capacity()); //输出16 //改变StringBuilder的长度,将只保留前面部分 sb.setLength(5); //sb="avajo" System.out.println(sb); }}

 

 

还有一个比较有意思的效率的帖子:赞里面的大神 ChDw(米)

http://topic.csdn.net/t/20050610/10/4072734.html

 

 

 

最近笔试比较多,刚好和同学讨论的时候(他是Java方向),又聊到一个东西,即有一个很大的程序运行时候,两个申请相同的字符串的String距离比较远的话却又不相等了后来被告知是因为jvm中有一个缓冲区,每次当新生成一个String的时候,他就会在自己的缓冲去里面找,当工程足够大的时候,原先申请的缓冲区里面已经没有之前那个String了,故他们不相等。

当了解到这些的时候,突然觉得自己思维有点死了,一直没问过自己,当程序很大的话,难道所有申请过的String都会被保留么?这么没逻辑的事情我居然没有怀疑过,有点汗颜

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/FreeAquar/archive/2012/10/03/2710758.html

你可能感兴趣的文章
我的友情链接
查看>>
用yum安装mariadb
查看>>
一点IT"边缘化"的人的思考
查看>>
WPF 降低.net framework到4.0
查看>>
搭建一个通用的脚手架
查看>>
开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
查看>>
开源磁盘加密软件VeraCrypt教程
查看>>
本地vs云:大数据厮杀的最终幸存者会是谁?
查看>>
阿里云公共镜像、自定义镜像、共享镜像和镜像市场的区别 ...
查看>>
shadowtunnel v1.7 发布:新增上级负载均衡支持独立密码
查看>>
Java线程:什么是线程
查看>>
mysql5.7 创建一个超级管理员
查看>>
【框架整合】Maven-SpringMVC3.X+Spring3.X+MyBatis3-日志、JSON解析、表关联查询等均已配置好...
查看>>
要想成为高级Java程序员需要具备哪些知识呢?
查看>>
带着问题去学习--Nginx配置解析(一)
查看>>
onix-文件系统
查看>>
java.io.Serializable浅析
查看>>
我的友情链接
查看>>
多线程之线程池任务管理通用模板
查看>>
CSS3让长单词与URL地址自动换行——word-wrap属性
查看>>