一: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(字符串)课堂总结的更多相关文章

  1. Java中String字符串常量池总结

    最近到广州某建站互联网公司面试,当时面试官问假设有两个字符串String a="abc",String b = "abc";问输出a==b是true还是fals ...

  2. java中String字符串的==解析

    今天不知道怎么看了下string的==的问题,本身我觉得我这个水平去判断几个字符串相等还能出问题?呵呵,真的出了大问题,根本原因在于对java字节码的不了解. 首先,==运算符比较的是两个变量所指向的 ...

  3. Java中String字符串常量池

    首先看一个例子,通过这个例子更能快速理解String常量池 public static void main(String[] args) { String a = "ab"; St ...

  4. java中String字符串

    一.定义String字符串 String字符串和char字符不同,char使用单引号,只能表示一个字符,字符串就是一段文本.String是个类.这个类使用final修饰,所以这个类是不可以继承扩充和修 ...

  5. java中String字符串的替换函数:replace与replaceAll的区别

    例如有如下x的字符串 String x = "[kllkklk\\kk\\kllkk]";要将里面的“kk”替换为++,可以使用两种方法得到相同的结果 replace(CharSe ...

  6. Java中String字符串toString()、String.valueOf()、String强转、+ ""的区别

    Object#toString(): Object object = getObject(); System.out.println(object.toString()); 在这种使用方法中,因为ja ...

  7. JAVA中String字符串比较equals()和equalsIgnoreCase()的区别

    标签: equals和equalsIgnoreC 2012-11-11 16:03 65644人阅读 评论(0) 收藏 举报  分类: JAVA(3)  1.使用equals( )方法比较两个字符串是 ...

  8. Java中的字符串操作(比较String,StringBuiler和StringBuffer)

    一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...

  9. java中string内存的相关知识点

    (一):区别java内存中堆和栈: 1.栈:数据可以共享,存放基本数据类型和对象的引用,其中对象存放在堆中,对象的引用存放在栈中: 当在一段代码块定义一个变量时,就在栈中 为这个变量分配内存空间,当该 ...

随机推荐

  1. tag标签记录

    看到项目代码中有一个自定义的tag标签,想起以前自己写过的标签,竟然忘记的差不多了,手一痒,自己写个简单的tag标签,回顾一下历史知识 首先建一个servlet工程,然后写个index.jsp,项目跑 ...

  2. 黑马程序员:Java基础总结----反射

    黑马程序员:Java基础总结 反射   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 反射 反射的基石:Class类 Class类代表Java类,它的各个实例对象又分别 ...

  3. 解决hexo神烦的DTraceProviderBindings MODULE_NOT_FOUND

    原文:http://kikoroc.com/2016/05/04/resolve-hexo-DTraceProviderBindings-MODULE-NOT-FOUND.html 今晚折腾hexo的 ...

  4. C#调用百度地图API

    1.打开链接http://developer.baidu.com/map/jshome.htm这里有很多DEMO,或者你直接百度搜索"百度地图API",第一个就是.进入后有很多方向 ...

  5. linux 开启防火墙操作

    1)在/etc/sysconfig/  下新建iptables文件,添加如下代码: *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ...

  6. picturefill + picture 标签 实现兼容性很棒的 响应式图片 自适应 屏幕大小

    polyfill 它是一个能够补齐浏览器兼容性问题的一个东西,使用到的<picture></picture>标签 ,并不是所有浏览器都支持,为了实现更好的兼容效果,这里就使用到 ...

  7. 【USACO】滑雪课程

    滑雪课程贝西去科罗拉多州去滑雪,不过还她不太会玩,只是个能力为 1 的渣渣.贝西从 0 时刻进入滑雪场,一到 T 时刻就必须离开.滑雪场里有 N 条斜坡,第 i 条斜坡滑行一次需要 Di 分钟,要求游 ...

  8. php学习笔记——文件(1)

    一.include和require 服务器端包含 (SSI) 用于创建可在多个页面重复使用的函数.页眉.页脚或元素. include (或 require)语句会获取指定文件中存在的所有文本/代码/标 ...

  9. git submodule相关操作

    $ cd 项目目录 // 初始化 $ git init $ git submodule add https://github.com/XXXX // 普通更新 $ git submodule upda ...

  10. mysql中You can't specify target table for update in FROM clause

    使用mysql在删除表中重复记录 delete from user where username in (select user name form(select username from user ...