String作为java最常用的类,被广大程序员们蹂躏已久,让我们又爱又恨,应该如何正确的使用它呢,老姜带你一起来揭开它神秘的面纱。

一、String类定义时被冠上了final的标识符,决定了它终生不可变的特质。

  final:修饰类时,类不可被继承。

设计初衷:类不需要有子类,类的实现细节不允许改变,并且确信这个类不会被扩展;编译器会对final进行优化,提高执行效率。

二、String类的任何操作都会生成新的字符串对象。

  前面我们讲过,String是final的,既然不可改变,自然会生成新的对象。我们看下面一段代码:

String a = "abc123";

  a.subString(3);

system.out.println(a);

以上代码会输出什么呢?答案是abc123,因为a从未被改变,a.subString(3)的结果并未重新赋值给变量a。

三、String常量池

  相信有过面试经验的同学们,肯定遇到过类似这样的问题:String a = new String("a");这段代码生成了几个对象?

我的回答是1个或者2个。

1:如果此行代码之前定义过“a”这个变量,那么只会生成new String("a")这么一个对象。

2:相反,之前未定义过,就会存在“a”以及new String("a")这两个对象。

ps:有些同学要问了,那么变量a呢?它不是对象吗?

a只是一个变量,它存放对象new String("a")的引用,它不能称之为对象,仅仅是一个别名而已。

我们知道,在函数中定义的一些基本类型的变量和对象的引用变量在函数的栈内存中分配,new创建的对象和数组存放在堆内存中。

除此之外还有一个常量池存在,它是在编译期被确定的,被保存在class文件中,String常量就包含其中。例如,

  String s = “abcd”;

  String s2 = “abcd”;

  此处只会产生一个对象“abcd”,且存放在常量池中,并且s1==s2 为true。

  String s3 = "ab" + "cd";

  s3 == s?答案是true,因为编译器会对直接字符串常量的“+”运算优化为s3 =“abcd”且被存放至常量池中。

四、字符串的拼接

  1)少量字符串相加,直接用“+”,如:String a = a1+a2+a3;

  2)大量字符串拼接,用StringBuilder,如:

   StringBuilder sb = new StringBuilder();

  for(int i=0;i<100;i++){

  sb.append(i);

  }

  String s = sb.toString();

StringBuilder内部维护了一个初始值为16的char型数组,容积不足时2倍扩充。所以如果能够预测到你最终拼接的字符串大小,在初始化时不妨这样写:

   StringBuilder sb = new StringBuilder(100);避免空间不足,反复开辟内存,影响效率。

ps:String作为常量,每次“+”都会生成新的对象,反复开辟内存,效率自然下降。

  3)考虑到线程安全的情况,就要用到StringBuffer了,它的内部实现与StringBuilder类似,不过实现了数据同步,效率要低于StringBuilder。

五、字符串的比较

1、为空比较:

  if(null == s || "".equals(s)){...}

  把null==s放在左面以及""放在equals左边,因为s有可能为null,直接造成程序空指针异常:java.lang.NullPointerException。

ps:另一种写法,if(null==s||s.length()==0){...},话说这种效率要高于equals。

2.两个对象进行比较

  大多数情况下,我们关心的是字符串的值,而非内存地址,用equals进行比较。

在运行期,使用"=="进行字符串的比较,结果往往是不会让你满意的,有时会让我们踩在坑里好久好久,不停的问自己,为什么这段逻辑始终不正确呢?因为永远执行不到。

今天就写到这里,有没有能触动到你的地方呢?

关注老姜谈技术,微信号:helojava,或者扫描下面二维码。


每日一帖,技术鸡汤。

java中的String的更多相关文章

  1. 再解java中的String

    今天看到一篇文章中,写了关于java中的String.我看了后,是我从学java来觉得是最好的一篇关于String类的文章.看了这篇文章你就会对String的认识会提高一个层次.故将原作者的文章特意转 ...

  2. (转)Java中的String为什么是不可变的

    转自:http://www.importnew.com/7440.html String是所有语言中最常用的一个类.我们知道在Java中,String是不可变的.final的.Java在运行时也保存了 ...

  3. 关于JAVA中的String的使用与连接(转)

    JAVA中的String连接性能 Java中的String是一个非常特殊的类,使它特殊的一个主要原因是:String是不可变的(immutable).           String的不可变性是Ja ...

  4. Java中的String为什么是不可变的?

    转载:http://blog.csdn.net/zhangjg_blog/article/details/18319521 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那 ...

  5. Java中的String与常量池[转帖]

    string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...

  6. Java中的String与常量池

    string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...

  7. java中字符串String 转 int(转)

    java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...

  8. Java基础知识强化101:Java 中的 String对象真的不可变吗 ?

    1. 什么是不可变对象?       众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对 ...

  9. Java中的String,StringBuilder,StringBuffer三者的区别

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  10. Java中的String,StringBuilder,StringBuffer三者的区别(转载)

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

随机推荐

  1. 企业IT管理员IE11升级指南【3】—— IE11 新的GPO设置

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  2. 招聘.NET开发人员(截止于2015-06-15)

    文章更新 2015-06-15 01:00AM: 感谢各位的支持,简历和解决方案接收截止.2015-06-08 08:30AM: 已经收到一些简历和解决方案,正在筛选中.职位仍然开放,欢迎发送简历及解 ...

  3. Python yield与实现

    Python yield与实现  yield的功能类似于return,但是不同之处在于它返回的是生成器. 生成器 生成器是通过一个或多个yield表达式构成的函数,每一个生成器都是一个迭代器(但是迭 ...

  4. 关于分工的思考 (Thoughts on Division of Labor)

    Did you ever have the feeling that adding people doesn't help in software development? Did you ever ...

  5. Ubuntu 14 安装 .Net Core

    .Net Core的安装包的分发地址如下: https://apt-mo.trafficmanager.net/repos/dotnet-release/pool/main/d/ 方法一: 可以分别手 ...

  6. Visual Studio Code + live-server编辑和浏览HTML网页

    第一步: 安装Visual Studio Code + Node.JS 第二步:通过如下命令行安装live-server npm install -g live-server 第三步:打开Visual ...

  7. 《Entity Framework 6 Recipes》中文翻译系列 (14) -----第三章 查询之查询中设置默认值和存储过程返回多结果集

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-6在查询中设置默认值 问题 你有这样一个用例,当查询返回null值时,给相应属性 ...

  8. WCF 安全性 之 自定义证书验证

    案例下载 http://download.csdn.net/detail/woxpp/4113172 客户端调用代码 通过代理类 代理生成 参见 http://www.cnblogs.com/woxp ...

  9. iOS-----dSYM 文件分析工具

    来到新公司后,前段时间就一直在忙,前不久 项目 终于成功发布上线了,最近就在给项目做优化,并排除一些线上软件的 bug,因为项目中使用了友盟统计,所以在友盟给出的错误信息统计中能比较方便的找出客户端异 ...

  10. DataGrid中的事件和方法

    事件: onLoadSuccess:数据加载成功的时候触发. onLoadError:在载入远程数据产生错误的时候触发. onClickCell:在用户点击一个单元格的时候触发. onDblClick ...