java中的String
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的更多相关文章
- 再解java中的String
今天看到一篇文章中,写了关于java中的String.我看了后,是我从学java来觉得是最好的一篇关于String类的文章.看了这篇文章你就会对String的认识会提高一个层次.故将原作者的文章特意转 ...
- (转)Java中的String为什么是不可变的
转自:http://www.importnew.com/7440.html String是所有语言中最常用的一个类.我们知道在Java中,String是不可变的.final的.Java在运行时也保存了 ...
- 关于JAVA中的String的使用与连接(转)
JAVA中的String连接性能 Java中的String是一个非常特殊的类,使它特殊的一个主要原因是:String是不可变的(immutable). String的不可变性是Ja ...
- Java中的String为什么是不可变的?
转载:http://blog.csdn.net/zhangjg_blog/article/details/18319521 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那 ...
- Java中的String与常量池[转帖]
string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...
- Java中的String与常量池
string是java中的字符串.String类是不可变的,对String类的任何改变,都是返回一个新的String类对象.下面介绍java中的String与常量池. 1. 首先String不属于8种 ...
- java中字符串String 转 int(转)
java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...
- Java基础知识强化101:Java 中的 String对象真的不可变吗 ?
1. 什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对 ...
- Java中的String,StringBuilder,StringBuffer三者的区别
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- Java中的String,StringBuilder,StringBuffer三者的区别(转载)
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
随机推荐
- 如何给CentOS安装字体库
很多时候,我们需要做一些图像生成工作(譬如验证码之类的),这时候,我们一般都需要用到系统的字体库.但事情却总非尽善人意,我们所使用的Linux操作系统无法像Windows操作系统那样足够“旗舰”,字体 ...
- Android学习——windows下搭建Cygwin环境
在上一篇博文<Android学习——windows下搭建NDK_r9环境>中,我们详细的讲解了在windows下进行Android NDK开发环境的配置,我们也讲到了在NDk r7以后,我 ...
- ASP.NET Web API中的Controller
虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...
- [ASP.NET MVC 大牛之路]02 - C#高级知识点概要(1) - 委托和事件
在ASP.NET MVC 小牛之路系列中,前面用了一篇文章提了一下C#的一些知识点.照此,ASP.NET MVC 大牛之路系列也先给大家普及一下C#.NET中的高级知识点.每个知识点不太会过于详细,但 ...
- ASP.NET MVC 从零开始 - 请求处理
这篇文章是从我的 github 博客 lxconan.github.io 导入的. 这是这个系列的第三篇了.前两篇文章请参见: ASP.NET MVC 从零开始 - Create and Run AS ...
- Android开发学习之路-PopupWindow和仿QQ左滑删除
这周作业,要做一个类似QQ的左滑删除效果的ListView,因为不想给每个item都放一个按钮,所以决定用PopupWindow,这里记录一下 先放一下效果图: 先说明一下这里面的问题: ①没有做到像 ...
- Atitit learn by need 需要的时候学与预先学习知识图谱路线图
Atitit learn by need 需要的时候学与预先学习知识图谱路线图 1. 体系化是什么 架构 知识图谱路线图思维导图的重要性11.1. 体系就是架构21.2. 只见树木不见森林21.3. ...
- C#设计模式-原型模式
在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中分配 ...
- Sql Server系列:自定义函数
用户自定义函数可以像系统函数一样在查询或存储过程中调用,可以接受参数.执行操作并将操作结果以值的形式返回.返回值可以是单个标量或结果集. 1. 标量函数 标量函数返回一个确定类型的标量值,对于多语句的 ...
- 【.NET深呼吸】清理对象引用,有一个问题容易被忽略
大家知道,托管代码一个重要的特点是自动管理内存,即我们常说的垃圾回收机制,那些高大上的理论我就不重复了,有兴趣的朋友可以翻书.我这个有个毛病——不喜欢很严肃地去说一些理论的东西,所以我不多介绍了. 一 ...