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这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
随机推荐
- 如何在没有域的环境中搭建AlwaysOn(一)
对DBA而言,不需要域就可以搭建SQL Server AlwaysOn是Windows Server 2016中最令人兴奋的功能了,它不仅可以降低搭建的成本,而且还减少了部署和运维的工作量. 该特性可 ...
- Linux 自动同步服务器时间
200 ? "200px" : this.width)!important;} --> 介绍 Linux服务器运行久时,系统时间就会存在一定的误差,本篇文章就来介绍怎样使服务 ...
- [nRF51822] 15、穿戴式设备上电量检测装置的设计及细节技术点(偏专业硬件文章)
穿戴式 设备如智能手环.智能手表一般采用几百毫安时的锂离子电池来供电.因此,与之配套的充电电路.稳压电路和电池电量检测电路便必不可少!本文主要谈谈该类消费类电子内部电池电量检测的一般方法及其优缺点. ...
- 《Entity Framework 6 Recipes》中文翻译系列 (38) ------ 第七章 使用对象服务之动态创建连接字符串和从数据库读取模型
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第七章 使用对象服务 本章篇幅适中,对真实应用中的常见问题提供了切实可行的解决方案. ...
- JavaScript学习笔记之string
字符串定义: 1,var myString=“内容”:or var myString=‘内容’ 2,var myString= new String(“内容”) ---〉创建对象, ...
- DOM访问元素样式和操作元素样式
在HTML中定义样式的方式有三种:通过<link/>元素包含外部样式表文件(外部样式表).使用<style/>元素定义嵌入式样式(嵌入式样式表).使用style特性定义针对特定 ...
- 基于Fragment的百度地图框架的使用
博客:http://blog.csdn.net/developer_jiangqq (一)基本介绍(Fragment和SupportMapFragment): Fragment的使用现在安卓APP开发 ...
- MyEclipse的项目中把 java EE 5 Libraries 删掉后怎么重新导入
myeclipse中鼠标右击项目->properties->java Build Path=>Libraries=>Add Library...=>选择MyEclipse ...
- typeof知多少
昨天同事给我看了一道代码题,是关于typeof的,感觉挺有意思的,在这里分享给大家,顺便自己再对typeof总结总结.如有不对,请给予指出,共同进步. 代码是这样的: <!DOCTYPE htm ...
- Oracel_子查询
SQL子查询 子查询语法 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table) 子查询 ( ...