- 浏览: 748323 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (419)
- 杂软粉墨 (2)
- 创意灵感 (3)
- 经验记录 (137)
- 开源轨迹 (2)
- sip-communicator (2)
- 闲侃杂谈 (8)
- 问题交流 (24)
- 概念模式 (32)
- 难点备案 (5)
- JwChat (1)
- 中国象棋 (1)
- 教育探索 (6)
- 英语研究 (58)
- 星际争霸 (1)
- 电信知识 (1)
- 软件架构 (3)
- 哲学探索 (26)
- 算法灵魂 (8)
- 近视探索 (6)
- 数学数学 (3)
- 牛角钻尖 (23)
- 至强文言 (3)
- 数据结构 (1)
- 宇宙物理 (2)
- 网络架构 (3)
- 游戏领域 (4)
- 图形处理 (2)
- 修炼之路 (8)
- 读书天地 (20)
- 编解乱码 (2)
- 概念探索 (8)
- 格物致知 (1)
- 其它语言 (1)
- 测试领域 (3)
- 文化风流 (1)
- JQuery (1)
- 網頁領域 (1)
- Unix/Linux (1)
- Inside JVM (1)
- 异常分析 (1)
最新评论
-
suyujie:
引用
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
suyujie:
HTML <a> 标签灰显禁用 -
iamzhoug37:
您能说一下"局部变量不受文本顺序限制" 是 ...
声明前为什么能赋值却不能输出,都是使用
import java.util.Iterator; import java.util.SortedSet; import java.util.TreeSet; import javax.swing.JFrame; public class Test extends JFrame { public static void main(String[] args) { SortedSet<MarkNode> ss = new TreeSet<MarkNode>(); MarkNode mn1 = new MarkNode(); mn1.m_strID = "111"; ss.add(mn1); MarkNode mn2 = new MarkNode(); mn2.m_strID = "2"; ss.add(mn2); MarkNode mn3 = new MarkNode(); mn3.m_strID = "3"; ss.add(mn3); MarkNode mn4 = new MarkNode(); mn4.m_strID = "111"; ss.add(mn4); MarkNode mn5 = new MarkNode(); mn5.m_strID = "2"; ss.add(mn5); Iterator<MarkNode> it = ss.iterator(); System.out.println("The elements in the TreeSet:"); while(it.hasNext()) System.out.print(it.next().m_strID + " "); System.out.println(); if(mn1.equals(mn4)) System.out.println("mn1 equals mn4"); System.out.println("does mn1 and mn4's hashcode equal: " + (mn1.hashCode() == mn4.hashCode())); System.out.println("mn1 compared to mn4: " + mn1.compareTo(mn4)); } } class MarkNode implements Comparable<MarkNode> { public String m_strID; public double m_dDist; public int m_iRank; public int compareTo(MarkNode arg0) { System.out.println("this = " + this.m_strID + " compare = " + arg0.m_strID); if(!m_strID.equals(arg0.m_strID)) { return 1; } return 0; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((m_strID == null) ? 0 : m_strID.hashCode()); return result; } @Override public boolean equals(Object obj) { if(m_strID.equals(((MarkNode)obj).m_strID)) return true; return false; } }
结果:
this = 2 compare = 111
this = 3 compare = 111
this = 3 compare = 2
this = 111 compare = 2
this = 111 compare = 3
this = 2 compare = 2
The elements in the TreeSet:
111 2 3 111
mn1 equals mn4
does mn1 and mn4's hashcode equal: true
this = 111 compare = 111
mn1 compared to mn4: 0
看此句:
this = 111 compare = 111
出现在TreeSet所含元素打印结果之后,不知道什么原因,应该和111没有去重有关
初步原因找到:
看出来一些问题,在equals和hashCode都满足要求之后,无法去重是因为compareTo的实现关系,实现中compareTo只返回字符串 比较大于或者等于的结果,这样会影响到内部TreeMap的元素比较判断,因为大于,只会往右子树方向比较,会忽略左子树元素,原本相重的元素没有比较到 也就没有去重,这些看TreeMap中public V put(K key, V value)方法实现可以看出
public int compareTo(MarkNode marknode) { System.out.println("this = " + this.m_strID + " compare with " + marknode.m_strID); return this.m_strID.compareTo(marknode.m_strID); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((m_strID == null) ? 0 : m_strID.hashCode()); return result; } @Override public boolean equals(Object obj) { if(m_strID.equals(((MarkNode)obj).m_strID)) return true; return false; }
compareTo正确实现之后貌似又不需要重写equlas和hashCode也能去重了
关于TreeMap中put方法研究:
http://dracularking.iteye.com/blog/691706
发表评论
-
RuntimeException为啥不用声明抛出?
2012-11-13 15:04 7466异常,错误都是同一种父类:java.lang.Throwabl ... -
why null is allocated on java stack
2012-06-05 11:45 1192提问: 恩。。。俺的意思是, String str = n ... -
关于Java 泛型 ?extends T 的问题
2012-05-21 11:05 4361http://topic.csdn.net/u/2012051 ... -
HashSet的contains方法de解释是不是有问题
2011-02-20 22:27 3270first of all, exhibits the code ... -
hashcode中选择31因子的原因
2010-12-24 13:57 1481源自<<effective java 2nd> ... -
为什么AnonymousInnerClass只能访问final型非同一方法局部变量
2010-09-13 09:39 1448import java.io.IOException; im ... -
URLConnection访问servlet无反应
2010-07-26 09:28 2680这样完整的回路是ok的 客户端 import jav ... -
This is how scientists see the world
2010-07-14 15:36 1014有些东西不清楚,比如右上角什么东东,中间那个看似压强C, ... -
接口能描述成has-a吗
2010-07-10 10:19 1336接口has a什么呢? 如果说接口当作具备某种能力来用,比如X ... -
关于java.util.ResourceBundle
2010-07-05 14:17 4355import java.util.ResourceBundle ... -
ArrayList,Vector线程安全性测试
2010-06-18 09:43 3216import java.util.ArrayList; im ... -
这个静态内部类实现的单例是迟加载且线程安全的吗?
2010-05-28 13:10 1635public class JiveProperties { ... -
double-checked locking实现的单例模式之volatile
2010-05-26 17:23 3514private volatile static Singlet ... -
死锁的例子描述对吗
2010-05-10 11:20 1107public class Deadlock { stati ... -
java中Adapter是什么概念
2010-04-06 11:30 4947Adapter乃适配器, ... -
编码转换会丢失信息吗
2010-03-09 13:13 1257编码转换会丢失信息吗? 这是个命题,根 ... -
文本文件在系统中的存储与展现方式
2010-02-04 09:38 1136碰到了一个问题,同样的一个properties ... -
servlet如何实现多线程访问同一个实例的多个service方法
2009-12-09 11:22 1625如题,这是我现在想的一个问题,暂存于此,它同一个方法的 ... -
构造方法是静态的吗?
2009-12-03 15:13 1437public class Test { private ... -
关于JTextPane读取RTF多出一行的问题
2009-11-11 11:20 2469代码如下: import java.io.FileInput ...
相关推荐
总之,Set集合提供了存储不重复元素的能力,HashSet利用散列技术高效地去重,而SortedSet如TreeSet则可以对元素进行排序。理解和熟练掌握这些概念对于编写高效的Java代码至关重要。在实际编程中,根据需求选择合适的...
SortedSet是可排序的集合,元素按特定顺序排列,增删快,但相比于HashSet,它在内存占用上更高,数据量大时效率可能会降低。 Hashtable是键值对(key-value)存储的老式数据结构,无序且动态扩展,基于数组实现,...
- 使用合适的数据结构:根据实际需求选择最适合的数据类型,例如用Set代替List进行成员去重。 - 使用LRU(Least Recently Used)策略:当内存不足时,根据最近使用情况淘汰数据。 - 缓存穿透、缓存雪崩和缓存击穿...
TreeSet实现了SortedSet接口,提供了按自然顺序或自定义比较器排序的Set,它基于红黑树数据结构实现。 Map接口则不同于Collection,它存储的是键值对,每个键是唯一的。HashMap是最常用的Map实现,它通过哈希表快速...
**Set&&TreeSet**:Set接口不允许重复元素,而TreeSet实现了SortedSet接口,元素按自然排序或自定义比较器排序。 **HashSet**:Set接口的实现,不保证元素顺序,但去重效果好,性能高。 **Map接口**:键值对存储,...
不过,可以推测可能会涉及`HashSet`的行为、元素的去重以及元素的添加顺序等问题。 通过以上解析,我们可以了解到SCJP 310-055题库Module7中的几个关键知识点,包括`HashMap`、`HashSet`、`LinkedList`、`TreeSet`...
- 根据业务需求选择合适的数据结构,例如,使用Set代替List处理去重,使用SortedSet进行范围查询,或者使用Hashes进行复杂对象的存储,都能优化性能。 7. **预加载与缓存策略**: - 对于热点数据,可以考虑预先...
2. **TreeSet**: 它实现了SortedSet接口,内部基于红黑树数据结构。TreeSet保证了元素的排序,无论是自然排序还是定制排序。 3. **LinkedHashSet**: 这种Set实现保留了元素的插入顺序,它同时使用哈希表和双向链表...