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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class  
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 TreeSet ts = new TreeSet(new StrLenComparetor());
  6.                 ts.add("ad");
  7.                 ts.add("ads");
  8.                 ts.add("adxxx");
  9.                 ts.add("ad");
  10.                
  11.                 Iterator it = ts.iterator();
  12.                 while(it.hasNext()){
  13.                         System.out.println(it.next());
  14.                 }
  15.         }
  16. }

  17. class StrlenComparator implements Comparator
  18. {
  19.         public int compare(Object o1,Object o2)
  20.                 {
  21.                 String s1 = (String)o1;
  22.                 String s2 = (String)o2;
  23. // Ⅰ
  24.                 /*
  25.                         if(s1.length()>s2.length())
  26.                         return 1;
  27.                         if(s1.length()==s2.length())
  28.                         return 0;
  29.                         return -1;
  30.                 */
  31. // Ⅱ
  32.                 int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
  33.                 if(num == 0)
  34.                         return s1.compareTo(s2);
  35.                 return num;
  36.         }
  37. }
复制代码
方式一和方式二 在内存中实现方式有什么不同啊
我对内存特别感兴趣 但是现在也没精力学 只能遇到什么问什么了
请朋友们指点一下

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

正序浏览
心弦上的景致 发表于 2013-4-18 22:54
没有解决 都不是我想要的答案

我看了一下,对于第一种来说,其实可以看成是基本数据(这里的length()返回的值是int型)的比较,就相当于在栈内存中两个基本数据类型的值的比较。
而对于第二种,是将基本数据类型的值封装成了对象,因为要使用compareTo()这个方法的话,必须是对象才行,基本数据类型是没有方法可言的。这个相当于用两个堆内存中的对象做比较,其实比较的也是被封装的两个值,你可以看看源代码,compareTo()这个方法其实是调用了compare()这个方法,而compare()这个方法接收的其实就是两个int型的值。
至于图片我就不画了,如果你特别想知道内存图如何画出来,可以有时间私信我,太晚了,就不过多说明了,请见谅。
建议:其实你想要了解底层,看看源代码非常有用的,而且多看看API文档会对你有很大帮助的
回复 使用道具 举报
黄玉昆 发表于 2013-4-18 20:16
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢 ...

没有解决 都不是我想要的答案
回复 使用道具 举报
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
其实功能都是一样的,之所以使用第二种代替第一种,完全是为了书写方便
但是在内存中的确是有区别的:
首先说第一种:这种方法是最简单也是最容易写出的。只是代码看着冗余,
由于前面学习了封装对象,Integer,新版本的Integer有了自动装箱拆箱的功能后,极大了方便了我们的使用。这也就是出现了第二种使用方法。
第二种使用方法是充分利用了Integer的新特性和String的自带比较方法

通过new Integer(s1.length()),new Integer(s2.length())在内存中生成了两个对象,
使用compareTo方法对两个对象进行比较,由于compareTo的比较返回值也是正数,负数,零三种情况,所以可以替代第一种方法,和第一种区别之处就是第一种没有new对象,第二种new对象了。建议使用第二种吧。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
都不知道怎么说好。
第一种方式: 这个是自己定义的方法返回值。

第二种方式:是交给java中定义的函数来返回值。
             这种实现,比第一种更耗内存。
            但看起来专业。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马