JAVA中String(字符串)课堂总结
一:Java编译器中关于字符串自动优化
例子一:
源代码:
public class StringPool {
public static void main(String args[])
{
String s0="Hello";
String s1="Hello";
String s2="He"+"llo";
System.out.println(s0==s1);//true
System.out.println(s0==s2);//true
System.out.println(new String("Hello")==new String("Hello"));//false
}
}
结果截图:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAANMAAABtCAIAAAC0pcOLAAACG0lEQVR4nO3ay23qUBRAUeqiINdDNW4mxfgNiOz7sDGgRNqDrDULPzHYOjfY57JA4VJ/Af4o5dFQHo21vK/b9TLN5VfhT1Eejctyj+4/19vXsizLPF2m2/rcPct5WvscWx0+Qr6842zmzdMa4VrcYXnDg8s8re+B516UtxtgR+U9zkzl8dpvlGfM8bntqsq+nyfl3V91H3TraevfOz4zXM/bDs3hF8aup/VV19ttOvqFYf7xDleSaSiPhvJoKI+G8mgoj4byaNhVoaE8GrakaNiSomFLioYtKRq2pGjYkqLhSjIN5dFQHg3l0VAeDeXRGMvbXVY5Mk/uz/ILhvI+uBVhsYWf2sr7pCbl8VOHW1LfUa0H6+5s3ZU3fMQ2N61O8dx7M+/xuce/X+wW2Clg57S8ceidlvc93Q4ecjeXYyflDYPq1czb3jHur4iN556X93W7Dksr5zPv6BmrU5w5O23Xw3ZYiHo8RPdLydtnWJ3iOfcwaCiPhvJoKI+G8mgoj4byaCiPhvJoKI+G8mgoj4byaCiPhvJoKI+G8mgoj4byaCiPhvJoKI+G8mgoj4byaCiPhvJoKI+G8mgoj4byaCiPhvJoKI+G8mgoj4byaCiPhvJoKI+G8mgoj4byaCiPhvJoKI+G8mgoj4byaCiPhvJoKI+G8mgoj4byaCiPhvJoKI+G8mgoj4byaCiPhvJoKI+G8mgoj4byaPwD7qRCrnGlhnYAAAAASUVORK5CYII=" alt="" />
分析:1:在Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。
2:编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。这种优化工作由Java编译器自动完成。
3:当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。
例子二:
源代码:
public class qqq {
public static void main(String[] args) {
String s1="a";
String s2=s1;
System.out.println(s1==s2);
s1+="b";
System.out.println(s1==s2);
System.out.println(s1=="ab");
System.out.println(s1.equals("ab"));
}
}
结果截图:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJ0AAABZCAIAAACrPbEjAAACPElEQVR4nO3cv2rbQBzA8XuBQN4hWyAQAiEg8NTSTqFTxy4laO+b6Gm01mRKhjQQLwbPoY9xHWTOF+lsE4oi+8v3s/mvhq9Pce5nFKJG8/nL95PTs4fHp+7mw+PT+cVsuVz+nt9fXn0a9dBh1HdXz+23H/P5/WKxuL75OuqB7PqhXl//nl/Mft79+vP8MuqBQoyrpgp1O+pR9NHsyhTeqppVjDG2daibplrf2UVv61Q//ySs0tP8cByQ8npt65Q49Sx2ze6MbZ1eo6lt7TpYfKWu2WLNl7sm939dXaKHKsRSnS1du2d1izSdh/2zeohCjPnpNPveNKiVnlU1TV363uTaPRzuSzDZlcmuTHZlsiuTXZm6roN/dEra2n3goxFifNe2kcOf4xDi+1rZ9Tj05nTrZOmUOzjrDrpm+02bNe/wbmr71mv/sf7tPRMCJwMT2dI1X7A7u65XZuEud42nVOyaLbJ963XzinzGY8qplbqumiob7Oxer6VHHN5Nr3weTqfhbCTXP70OfzCxeQ+Hd1Nzv4nJrkx2ZbIrk12Z7MrknI7JOR2Tczom53RMzumYnNMxOadjck7H5JyOyf0mJrsy2ZXJrkx2ZbIrk12ZvD4ik12ZenM6r3sJ4XUvmbzuJZPXvWTyupdMXveSyX0JJrsy2ZXJrkx2ZbIrk12Z7MpkVya7MtmVya5MdmWyK5NdmezKZFcmuzLZlcmuTHZlsiuTXZnsymRXJrsy2ZXJrkx2ZbIrk12Z7MpkV6Z/cZ/eTrIlfSoAAAAASUVORK5CYII=" alt="" />
分析:
1:给字串变量赋值意味着:两个变量(s1,s2)现在引用同一个字符串对象“a”!
2:String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象”a”无关,所以,s1==s2返回false;
3:代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。
JAVA中String(字符串)课堂总结的更多相关文章
- Java中String字符串常量池总结
最近到广州某建站互联网公司面试,当时面试官问假设有两个字符串String a="abc",String b = "abc";问输出a==b是true还是fals ...
- java中String字符串的==解析
今天不知道怎么看了下string的==的问题,本身我觉得我这个水平去判断几个字符串相等还能出问题?呵呵,真的出了大问题,根本原因在于对java字节码的不了解. 首先,==运算符比较的是两个变量所指向的 ...
- Java中String字符串常量池
首先看一个例子,通过这个例子更能快速理解String常量池 public static void main(String[] args) { String a = "ab"; St ...
- java中String字符串
一.定义String字符串 String字符串和char字符不同,char使用单引号,只能表示一个字符,字符串就是一段文本.String是个类.这个类使用final修饰,所以这个类是不可以继承扩充和修 ...
- java中String字符串的替换函数:replace与replaceAll的区别
例如有如下x的字符串 String x = "[kllkklk\\kk\\kllkk]";要将里面的“kk”替换为++,可以使用两种方法得到相同的结果 replace(CharSe ...
- Java中String字符串toString()、String.valueOf()、String强转、+ ""的区别
Object#toString(): Object object = getObject(); System.out.println(object.toString()); 在这种使用方法中,因为ja ...
- JAVA中String字符串比较equals()和equalsIgnoreCase()的区别
标签: equals和equalsIgnoreC 2012-11-11 16:03 65644人阅读 评论(0) 收藏 举报 分类: JAVA(3) 1.使用equals( )方法比较两个字符串是 ...
- Java中的字符串操作(比较String,StringBuiler和StringBuffer)
一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...
- java中string内存的相关知识点
(一):区别java内存中堆和栈: 1.栈:数据可以共享,存放基本数据类型和对象的引用,其中对象存放在堆中,对象的引用存放在栈中: 当在一段代码块定义一个变量时,就在栈中 为这个变量分配内存空间,当该 ...
随机推荐
- C#中数组,ArrayList与List对象的区别
在C#中,当我们想要存储一组对象的时候,就会想到用数组,ArrayList,List这三个对象了.那么这三者到底有什么样的区别呢? 我们先来了解一下数组,因为数组在C#中是最早出现的. 数组 数组有很 ...
- 深入浅出MyBatis-Sqlsession
前面的章节主要讲mybatis如何解析配置文件,这些都是一次性的过程.从本章开始讲解动态的过程,它们跟应用程序对mybatis的调用密切相关.本章先从sqlsession开始. 创建 正如其名,Sql ...
- Elasticsearch 5.0 _source field的简单认识
前言:本文的目的是为后续磁盘空间利用优化做铺垫,主要知识点来源于官网 一._source是什么 _source field是我们在PUT数据时候的json body: PUT store_index/ ...
- OpenH264
转自:http://blog.csdn.net/chinabinlang/article/details/41209053 目前最常用的264工程师x264: 最近有又有一个开源工程OpenH264, ...
- AC日记——字典 codevs 4189
4189 字典 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 查看运行结果 题目描述 Description 最经,skyzhong得到了 ...
- kafka删除topic的方法及我在kafka上边的一些经验
我在本地做kafka的producer调试,每隔一段时间后,所使用的topic管道就会堆积数据,而且我这边使用的是 kafka bin 下的consumer命令单独消费的,每次都是 --fro ...
- Hadoop基本命令详解
调用文件系统(FS)Shell命令应使用bin/hadoop fs <args>的形式.所有的的FS shell命令使用URI路径作为参数.URI路径详解点击这里. 1.cat 说明:将路 ...
- iOS 手势识别
首先给大家解释一下为什么要学习手势识别? 如果想监听一个UIView上面的触摸事件,之前的做法是: 自定义一个UIView : 实现UIView的touches方法,在方法里面实现具体功能 透过tou ...
- angularjs的directive详解
Directive(指令)笔者认为是AngularJ非常强大而有有用的功能之一.它就相当于为我们写了公共的自定义DOM元素或CLASS属性或ATTR属性,并且它不只是单单如此,你还可以在它的基础上来操 ...
- python爆破zip脚本
最近在提高自己编程能力,拿一些实用的小工具练下.该脚本为python语言,主要涉及模块zipfile,threadings模块. 功能:暴力猜解zip解压密码 #coding: utf-8 impor ...