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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周洋 黑马帝   /  2012-3-15 16:57  /  2192 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

下面这个程序中,al和arr都是引用类型的,为什么一个输出结果是引用地址,一个输出结果是存的内容?
代码如下
package execisetest;
import java.util.*;
public class CollectionTest {
        public static void main(String [] args){
                ArrayList al=new ArrayList();
                al.add("jacaa");
                al.add("fsf");
                al.add("fsfaf");               
                sop(al);        
                int []  arr=new int[]{2,2,3,6};
                sop(arr);
        }
        public static void sop(Object obj){
                System.out.println(obj);
        }
}

6 个回复

倒序浏览
本帖最后由 谢明 于 2012-3-15 18:09 编辑

System.out.println(xx);这句
他实际上是先调用xx.toString()。 然后输出这个值。
而默认的toString方法将会输出  类的名字+“@”+hash码
////////////////api原文
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于:
getClass().getName() + '@' + Integer.toHexString(hashCode())
//////////////////////
还有  就是   ArrayList覆写了toString()

评分

参与人数 1技术分 +2 收起 理由
房宝彬 + 2

查看全部评分

回复 使用道具 举报
彭卫红 2012-3-15 17:33:57
藤椅
提示: 作者被禁止或删除 内容自动屏蔽
回复 使用道具 举报
al和arr引用所指向的内容是不同的。

这应该要从ArrayList的底层实现来说起,在ArrayList底层其实它维护的是一个数组。

    public boolean add(E e) {
        ensureCapacity(size + 1);  // elementData为数组
        elementData[size++] = e;
        return true;
    }这是底层add方法的实现
当调用add方法往集合中添加数据(其实是往一个长度为10的集合中添加,该集合能自动增长),所以arr引用指向的是[jacaa, fsf, fsfaf]这个地址,
而数组中arr的引用指向的是该数组的引用地址。
希望能帮到你

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1 默认长度为10,每次增加长度的百分之50..

查看全部评分

回复 使用道具 举报
打印的原理是这样的  System.out.println() 对应的流是PrintStream,用的是PrintStream中的println()方法  println()打印对象的的源码是:
public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }
用到了String的静态方法valueOf(Object obj)  源码是
public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }
所以打印对象实际上是先调用了对象的toString()方法
那么你打印al就是调用了al的toString()方法,ArrayList的toString()方法是这样描述的
“返回此 collection 的字符串表示形式。该字符串表示形式由 collection 元素的列表组成,这些元素按其迭代器返回的顺序排列,并用方括号 ("[]") 括起来。相邻元素由字符 ", "(逗号加空格)分隔。通过 String.valueOf(Object) 可以将元素转换成字符串。”因此打印的是里边的元素

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 段浩亮 于 2012-3-15 20:20 编辑

接上(打印数组应该是这样的 我也不太确定 仅供参考)
打印数组默认是   [数组类型@hash地址值  
只有字符数组不是这样的 因为PrintStream中对字符数组定义了打印方法println(char[] ch)方法   打印的是字符串
回复 使用道具 举报
周洋 黑马帝 2012-3-16 11:46:40
7#
谢谢,明白了!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马