专栏首页java达人两个关于字符串的经典例子

两个关于字符串的经典例子

示例1:

==运算符

public static void test(){
String x = "hello";
String y = "world";
String a = "helloworld";
System.out.println("x==hello:"+(x=="hello"));
System.out.println("a==helloworld:"+(a=="hello"+"world"));
System.out.println("a==x+y:"+(a==(x+y)));
}

结果:

x == hello:true a == helloworld:true a == x+y:false

双引号内的字符串是放在常量池里的,当双引号内再次出现与原来字符串相同内容时,jvm不会创建新对象,只是将引用指向了常量池里原来就存在的那个String对象,这与用new创建不同,用new的话将在堆中创建一个新对象,不管在堆中有没有相同内容的对象。因此,对System.out.println("x==hello:"+(x=="hello"));“hello”所在的地址与x引用所指向的地址相同,输出true;

hello”+“world“在编译器内就已经确定了,即为已存在常量池中的以a作为引用的对象,仍输出true;

而x+y属引用相加,这在编译时是不能确定的,在执行期间将由x+y得出的“helloworld”放入堆中(而不是常量池),因此输出false。

示例2:

对象引用

public class TestRef{
public static void main(String[] args){
StirngBuffer a = new StringBuffer("a");
StringBuffer b = new StringBuffer("b");
append(a,b);
System.out.println(a.toString()+","+b.toString());
b = a;
System.out.println(a.toString()+","+b.toString());
}
public static void append(StringBuffer a,StringBuffer b){
a.append(b);
b = a;
}
}

结果: ab,b ab,ab 第一个为什么输出的为什么不是ab,ab呢,根据有关值传递与引用传递的理论,得出这样的结论:两个StringBuffer对象的引用传递到append方法中,方法中的a,b其实是不同于main()方法中的a,b引用的,但他们都分别指向同一个对象,通过append()方法中的a.append(b),使a指向的对象变成ab,而方法中b=a只是将append()中的b引用指向ab,而main()方法中的b引用仍指向原来的对象,即b,需要在main()中通过b=a,使main()中b引用指向ab,方能输出ab,ab。

本文分享自微信公众号 - java达人(drjava),作者:卐极客

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-02-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 数字的陷阱

    Java中对数字的处理,如四舍五入,如加减乘除,貌似是一个很基础很简单的知识点,但是如果你没有对他进行充分了解,很容易掉进它的陷阱里。 1、浮点数运算 先来看一...

    java达人
  • Java finally return知识小菜

    示例代码: public class FinalTest { public static String testTry1() { try { ...

    java达人
  • 我的Android进阶之旅------>Android采用AES+RSA的加密机制对http请求进行加密

    作者:欧阳鹏 来源:http://blog.csdn.net/ouyang_peng/article/details/50983574(点击文末阅读原文前往) ...

    java达人
  • Java异常处理中的恢复模型

    二十三年蝉
  • 刨根问底儿————解析Java代码,看看toString的秘密

    在main方法中执行第一个语句System.out.println("love "+new ToStringTest() ),语句由内向外执行,先执行new T...

    泰斗贤若如
  • Hello,Go

    gaobinzhan
  • Java中lambda表达式详解

    上面的代码中,e是一个lambda的对象,根据java的继承的特性,我们可以说e对象的类型是继承自eat接口。而e1是一个正常的匿名类的对象.

    付威
  • eeglab中文教程系列(12)-学习和删除ICA组件

    本教程为脑机学习者Rose发表于公众号:脑机接口社区(微信号:Brain_Computer),QQ交流群:903290195

    脑机接口社区
  • eeglab教程系列(12)-学习和删除ICA组件

    研究组件属性的操作:Tools > Reject data using ICA > Reject components by map.操作过程如下:

    脑机接口社区
  • [漫谈] 软件设计的目标和途径

    记录一下笔者关于软件设计的一些相关认知。在开始之前,先引入两个概念目标和途径(这里可能会有些咬文嚼字,不过主要是为了区分主观和客观的一些细微差异)。

    blackheart

扫码关注云+社区

领取腾讯云代金券