一: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. Python学习入门基础教程(learning Python)--6.4 Python的list与函数

    list是python下的一种数据类型,他和其他类型如整形.浮点型.字符串等数据类型一样也可作为函数的型参和实参来使用! 1.list作为参数 list数据类型可以作为函数的参数传递给函数取做相应的处 ...

  2. 3364 Lanterns (异或方程组高斯消元)

    基本思路.首先构造一个n*(m+1)的矩阵,同时标记一个行数row,row从零开始,然后找出每一列第一个非零的数,和第row行互换, 然后对row到n行,异或运算.最终的结果为2^(m-row) #i ...

  3. gearman的安装和配置

    gearman作为并发任务管理服务,已经越来越多攻城狮在生产环境中使用了.为了日后方便部署到服务器,我写了一个shell. 一般服务器使用稳定的centos,我使用的是centos6.7. 安装she ...

  4. Linux学习笔记(一):常用命令(2)

    3.帮助命令 A,帮助命令:man    B,其他帮助命令 3.1,格式:man [命令名] 查看命令拥有哪个级别的帮助:                                       ...

  5. Windows下安装Redmine-2.5.3

    安装准备 服务器操作系统:Windows Server 2008 R2 Standard,64位操作系统. RailsInstaller版本:2.2.4  (下载地址http://railsinsta ...

  6. 关于ul和dl的区别

    1.ul是无序列表,也就是说没有排列限制可以随意加li:<ul><li>可以随意放置</li><li>可以随意放置</li><li&g ...

  7. JNDI中 java:comp/env 的理解

    J2EE 上下文环境变量前缀,一般有如下几种:java:/comp/env/jdbcjava:/comp/env/urljava:/comp/env/mailjava:/comp/env/jms在部署 ...

  8. grunt--自动化任务快速上手

    这篇文章将带领你用Grunt来提速和优化网站开发的流程.首先我们会简短介绍Grunt的功能,然后我们直接上手,介绍如何用Grunt的不同插件来替你完成网站项目开发中的很多繁冗工作. 接着我们会创建一个 ...

  9. shell 读取文件

    #!/bin/bash content=`cat test.txt` echo "begin" for i in $content do echo $i done 读取前10行 t ...

  10. 读取Oracle表结构数据

    <html lang="zh-cn"> <head> <meta name="generator" content="O ...