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这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
随机推荐
- Html5 绘制旋转的太极图
采用Html5+JavaScript在Canvas中绘制旋转的太极图,如下图所示: 具体思路和绘制逻辑,在上图中已有说明,代码如下: <script type="text/javasc ...
- VS web项目 基于IIS调试和模拟域名调试
1.安装IIS 2.注册.net framework 到IIS 打开程序-运行-cmd:输入一下命令重新注册IISC:\WINDOWS\Microsoft.NET\Framework\v4.0.303 ...
- salesforce 零基础学习(五十一)使用 Salesforce.com SOAP API 实现用户登录以及简单的增删改查(JAVA访问salesforce)
此篇请参看:https://resources.docs.salesforce.com/202/latest/en-us/sfdc/pdf/salesforce_developer_environme ...
- Jetstrap 在线构建 Bootstrap 的工具
Jetstrap 是一个 100% 基于 Web 的 Twitter Bootstrap 构建工具,无需下载软件,只需登录并构建即可.并且别人可以访问你构建的产品.
- android5.0联系人 sort_key改成phonebook_label
项目中用到了联系人根据字母排序,在android4.0手机上是可以的,但是在android4.4以上的手机排序是乱的,一般字母排序都是根据sort_key这个拼音进行排序,而android5.0这个字 ...
- 取消vs2013在solution中单击打开文件的功能
2013用了一段时间,不错,就是单击会打开文件,有点恼人(因人而异吧).解决方案: 取消红色框框里面的那个checkbox就ok了. 来自为知笔记(Wiz)
- PHP关于web页面交互内容
学php学了有一段时间了总结总结给大家分享一下 PHP中的引用 第一段程序: <?php $first_name="firstName"; $first=&$firs ...
- 十进制(decimal system)转换函数说明
一,十进制(decimal system)转换函数说明 1,十进制转二进制 decbin() 函数,如下实例 echo decbin(12); //输出 1100 echo decbin(26); / ...
- SharePoint 2013功能(SPFeature)与GUID对照表
自从上次遇到了一些无法开启SharePoint功能的事件之后(详见<SharePoint 2013 托管导航无法被开启的解决办法>一文),对于在SharePoint中所提示的GUID就格外 ...
- 用JAVA实现插值查询的方法(算近似值,区间求法)
插值查询:如果有这样一张表,有一列叫水位,有一列叫库容,比如下面的图. 我现在想做这么一件事情:对于这个测站而言,当我输入某一个水位或者库容的时候,想要查询到对应的水位或者库容呢? 而这个值不一定是存 ...