A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© TanQiao 中级黑马   /  2015-3-12 08:45  /  1366 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s=new String("abc");直接打印s,显示的为什么不是输出"abc"的地址,而是直接abc了?

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 加油

查看全部评分

10 个回复

倒序浏览
String s1=new String("abc");System.out.println(s==s1);打印输出的是false。
回复 使用道具 举报
TanQiao 发表于 2015-3-12 09:12
String s1=new String("abc");System.out.println(s==s1);打印输出的是false。

除了String和封装器,equals()和“==”没什么区别
15 但String和封装器重写了equals(),所以在这里面,equals()指比较字符串或封装对象对应的原始值是否相等, "== "是比较两个对象是否为同一个对象
回复 使用道具 举报
String类对象有个特殊的创建的方式,就是直接指定比如String x = "abc","abc"就表示一个字符串对象。而x是"abc"对象的地址,也叫做"abc"对象的引用。
回复 使用道具 举报
TanQiao 发表于 2015-3-12 09:12
String s1=new String("abc");System.out.println(s==s1);打印输出的是false。

String s = new String("abc")实际上是"abc"本身就是文字池中的一个对象,在运行 new String()时,把文字池即pool中的字符串"abc"复制到堆中,并把这个对象的应用交给s,所以创建了两个String对象,一个在pool中,一个在堆中。下面看这个程序,创建了几个对象。


public class Demo03 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String s1 = new String("abc") ;
        String s2 = new String("abc") ;
        if( s1 == s2 ){ //不会执行的语句}
       System.out.println("在堆中创建了一个对象");

    }
        else{
        System.out.println("在堆中创建了两个对象");   
        }
        }
}
输出结果为:
可知在堆中创建了两个对象,但是在文字池中有一个对象,所以共创建了三个对象。

评分

参与人数 1技术分 +1 收起 理由
万合天宜 + 1 很给力!

查看全部评分

回复 使用道具 举报
521123270 发表于 2015-3-12 12:18
String类对象有个特殊的创建的方式,就是直接指定比如String x = "abc","abc"就表示一个字符串对象。而x是 ...

对啊,x是“abc”的地址,那为什么System.out.println(x);输出的是abc而不是“abc”的地址了?
回复 使用道具 举报
521123270 发表于 2015-3-12 12:37
String s = new String("abc")实际上是"abc"本身就是文字池中的一个对象,在运行 new String()时,把文字 ...

我这样想有错吗?System.out.println(s1)输出abc,System.out.println(s2)也是输出abc,所以s1=s2。
回复 使用道具 举报
TanQiao 发表于 2015-3-12 14:29
对啊,x是“abc”的地址,那为什么System.out.println(x);输出的是abc而不是“abc”的地址了? ...

地址?你指的是hashcode?
回复 使用道具 举报
521123270 发表于 2015-3-12 17:31
地址?你指的是hashcode?

那个地址是标记对象的,在调用main方法,通常要调用他的toString()方法,将对象的内容转换为字符串.打印出来abc!java中默认toString()重写方法。
回复 使用道具 举报
TanQiao 发表于 2015-3-12 14:35
我这样想有错吗?System.out.println(s1)输出abc,System.out.println(s2)也是输出abc,所以s1=s2。 ...

"== "是比较两个对象是否为同一个对象,String s1=new String("abc");与String s=new String("abc");Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
对象不同,也就是地址不一样的。如果你要比较数值是否相同!请用equals来比较!
回复 使用道具 举报
class Demo
{
       
}
class Test
{
        public static void main(String[] args)
        {
                Demo d=new Demo();
                System.out.println(d);
                System.out.println(d.toString());
               
                String s=new String("abc");
                System.out.println(s);
                System.out.println(s.toString());
               
        }
}
终于清楚了,以前学C语言打印地址就直接输出地址,而java却是打印的是      对象的应用.toString()
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马