- 浏览: 2094873 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (366)
- hadoop (91)
- DB (2)
- vmware (0)
- python (49)
- Java (72)
- Linux (57)
- 多线程 (2)
- hive (1)
- hbase (3)
- mongodb (5)
- Hibernate (3)
- nodejs (1)
- 模式与重构 (1)
- 持续集成CI (4)
- Mysql (2)
- chorme (1)
- 软件开发 (0)
- 敏捷 (5)
- maven (3)
- windows (7)
- 测试驱动 (1)
- scala (3)
- Jetty (0)
- android (1)
- eclipse (1)
- 设计模式 (1)
- 面向对象设计 (2)
- oracle (3)
- cassandra (15)
- pig (3)
- rails (1)
- redis (4)
- ruby (1)
- storm (0)
- 实时运算 (3)
- scribe (1)
- hadoop源码 (3)
- cassandra jna (1)
- Kafka (2)
- Sublime (2)
- C++ (2)
- C (1)
- 版本控制 (1)
- 服务器 (1)
- docker (0)
- flink (1)
最新评论
-
伍大都督:
解释太到位了,感谢分享
理解Linux系统中的load average(图文版) -
rfjian123:
非常感谢,用你的方法解决了问题。
Server sent unexpected return value (403 Forbidden) in response to OPTIONS -
yuhaifei12:
今天遇到同样的问题了。设置的是每分钟执行一次。结果发现每分钟执 ...
解决Linux下crontab同一时间重复执行问题 -
BigBird2012:
想问一下,使用ExecutorService每次都要调用 sh ...
spring quartz使用多线程并发“陷阱” -
zhuqx1130:
有用,谢谢
解决Sublime Text 3中文显示乱码(tab中文方块)问题
TreeSet基于TreeMap,它很有意思,当你执行add()方法的时候,集合会自动排序,不需要手工执行Collections.sort()进行排序,代码更加简洁(Clean),今天使用过程发现它暗藏机关,与大家分享。
使用TreeSet有两种方法:
一、元素实现Comparable接口,然后直接通过add方法添加元素即可。
二、创建一个Comparator,并在构造TreeSet的时候传入,如下:
//我这里Job为待添加元素
Set<Job> jobs = new TreeSet<Job>(new JobComparator());
Set<Job> jobs = new TreeSet<Job>(new JobComparator());
我要实现的需求很简单,根据Job的优先级字段(Priority)进行排序,Job类代码如下:
public class Job implements Comparable<SortJob> { private String jobName; private Integer priority; public SortJob() { } public SortJob(String jobName, Integer priority) { this.jobName = jobName; this.priority = priority; } public String getJobName() { return jobName; } public void setJobName(String jobName) { this.jobName = jobName; } public Integer getPriority() { return priority; } public void setPriority(Integer priority) { this.priority = priority; } @Override public int compareTo(SortJob o) { return priority.compareTo(o.getPriority()); } }
测试代码如下:
@Test public void sortJob() { Set<SortJob> jobs = new TreeSet<SortJob>(); jobs.add(new SortJob("001", 1)); jobs.add(new SortJob("002", 1)); jobs.add(new SortJob("003", 1)); assertEquals(3, jobs.size()); // ① jobs.clear(); jobs.add(new SortJob("001", 1)); jobs.add(new SortJob("002", 3)); jobs.add(new SortJob("003", 2)); List<SortJob> listJobs = new ArrayList<SortJob>(jobs); assertEquals("001", listJobs.get(0).getJobName()); assertEquals("003", listJobs.get(1).getJobName()); assertEquals("002", listJobs.get(2).getJobName()); }
测试并没有通过,在行①,这里实际集合size为1,出了什么问题呢?
soga,原来TreeSet的add方法会先调用Job的compareTo方法判断元素是否重复,因为Priority全部为1,所以TreeSet认为后两个Job是重复的,这样的结果显然不是我们想要的,重新实现compareTo方法如下:
@Override public int compareTo(SortJob o) { int compare1 = priority.compareTo(o.getPriority()); return compare1 == 0 ? this.jobName.compareTo(o.jobName) : compare1; }
再次运行测试,OK了。
总结:
- TreeSet通过集合元素的compareTo方法判断元素是否重复,实现compareTo方法既要考虑排序,又要考虑对象是否重复
- 发现这个陷阱后,发现Collections.sort()还是很不错的选择,只需要考虑排序就可以了。
--heipark
发表评论
-
shell下使用log4j 1.x “No appenders could be found for logger”问题两个处理办法
2018-05-25 23:25 1638错误: log4j:WARN No appenders c ... -
通过java class文件确定其编译器版本
2016-06-23 10:45 1074方法一: hexdump -C XXX.class ... -
字符编码笔记:ASCII,Unicode和UTF-8(转)
2014-11-06 17:29 1237今天中午,我突然想搞 ... -
Server sent unexpected return value (403 Forbidden) in response to OPTIONS
2014-10-10 15:01 5553之前用的好好的,忽然某天再次svn up时候就报下面的错误: ... -
netbeans下优秀sublinme主题
2014-09-29 10:13 3631推荐站点:http://netbeansthemes.com ... -
将netbeans项目放到jenkins上做持续集成
2014-07-25 15:20 1230netbeans项目本质是通过ANT来管理的,只不 ... -
关于jvm中Xmx参数默认值
2014-05-08 09:19 2014我的机器win7 64bit 8GB内存,通过jconso ... -
Eclipse代码自动完成功能无法使用问题记录
2014-04-28 10:15 1138使用Alt+/无法补齐Java代码,现象时没有反应。解决方 ... -
thrift0.9.1简单教程(包含Java服务端和Java、python客户端)
2014-04-25 15:55 6404一、Thrift Java服务端和客户端 官 ... -
使用sublime text3开发scala
2014-04-04 16:49 3761打开菜单栏Tool->build system-> ... -
netbeans下打开本地文件夹插件(explorer)
2014-04-02 14:44 20281. 在线安装 工具->插件->可用插 ... -
关闭Sublime自动更新
2014-03-09 21:42 835每次启动都提示更新,可以关闭它。 找到Prefere ... -
使用log4j.properties配置slf4j输出LOG
2014-01-09 08:57 6647完成配置需要以下文件: slf4j-log4j12-x ... -
正确使用java -cp通配符
2013-11-21 17:05 10185JDK6支持java -cp后面跟通配符'*',试了一下发 ... -
强制Java使用东八时区方法
2013-11-15 15:37 1834今天线上有台服务器时区错误,导致很多使用new Da ... -
谨慎使用java的PrintWriter类
2013-10-23 12:31 1362public void test() throws Fil ... -
记录Java ShutdownHook
2013-08-30 11:40 1071public class TestMe { stat ... -
eclipse + maven + jetty + spring web 开发环境简要笔记
2013-08-27 11:25 1608环境准备 确保安装maven3 确保安装eclip ... -
Eclipse(IDE for Java Developers)、maven、jetty、spring web集成
2013-08-27 08:53 0方法一: http://wiki.eclipse.o ... -
关于数据压缩
2013-08-23 14:26 1132常用压缩 quicklz zlib snappy/ ...
相关推荐
主要接口包括List、Set和Map,而ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等是这些接口的主要实现。了解这些集合的特性和使用场景对于优化代码性能至关重要。例如,ArrayList适合于频繁的随机访问...
Java的TreeMap和TreeSet实现了红黑树。 7. **堆**:一种特殊的树形数据结构,满足堆性质(最大堆或最小堆)。Java的PriorityQueue就是基于堆实现的。 8. **图**:由节点和边组成,用于表示对象之间的复杂关系。...
- 集合框架是存储和管理对象的容器,包括List(有序,允许重复元素,如ArrayList和LinkedList)、Set(无序,不允许重复元素,如HashSet和TreeSet)和Map(键值对,如HashMap和TreeMap)。 - 迭代器(Iterator)...
例如,了解HashMap的扩容机制、LinkedList的节点操作、ArrayList的动态数组管理等,能够帮助开发者在设计和实现自己的数据结构时避免常见陷阱。 6. **工具类**:Collections和Arrays类提供了很多实用的静态方法,如...
Java编程事项是一个涵盖广泛的主题,它包含了众多关于Java语言编程的最佳实践、常见陷阱以及高效编程技巧。这篇由多个来源整理转贴的资料,以.htm格式呈现,旨在帮助开发者提升编程技能,避免常见错误,理解Java的...
在Java编程过程中,掌握一些关键的注意事项至关重要,这不仅能提高代码质量,还能避免常见的编程陷阱。以下是一些关于"JAVA注意事项"的详细说明: 1. **命名规范**:Java有严格的命名规则,类名应使用驼峰式命名,...
2. **集合**:Java集合框架是处理对象集合的重要工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)、Queue(如ArrayDeque)以及Map(如HashMap和TreeMap)。学习这些数据结构的使用、特性和...
这本书由Joshua Bloch和Neal Gafter合著,通过一系列精心设计的代码示例,揭示了Java中容易被忽视的陷阱和误解。这些谜题可以帮助开发者提高对语言规范的理解,避免写出易出错的代码。 在学习Java时,以下是一些...
本篇文章将深入探讨`Iterator`中的`remove`方法以及它在`List`和`Set`集合中的陷阱。 首先,`Iterator`接口提供了一个`remove()`方法,它的作用是移除当前迭代器指向的元素。在使用`Iterator`遍历集合并删除元素时...
这份手册不仅涵盖了基础的编程规范,还包括了最佳实践和陷阱提示,使得Java开发者能够在遵循规范的同时,避免常见的编程错误。 一、编程基础规范 1. 类与对象:强调单一职责原则,每个类或方法应有一个明确的责任,...
此外,深入学习集合框架的具体实现可以帮助开发者更好地利用这些工具,并避免常见的陷阱,从而提高程序的整体性能和质量。在实际开发中,合理选择合适的数据结构是非常重要的,它不仅关系到程序的执行效率,还直接...
3.1.3 TreeMap和TreeSet 3.2 Map和List 3.2.1 Map的values()方法 3.2.2 Map和List的关系 3.3 ArrayList和LinkedList 3.3.1 Vector和ArrayList的区别 3.3.2 ArrayList和LinkedList的实现差异 3.3.3 ...
通过深入研究这些源码注释,你可以学习到如何有效地利用Java集合框架,优化你的代码,避免常见的陷阱,并提升程序的性能。对于任何希望成为Java开发高手的人来说,理解并掌握集合框架的内部机制都是至关重要的一步。...
- `TreeSet`:基于红黑树数据结构,保持元素排序,支持快速查找和排序操作。 - **Map**:存储键值对的集合。 - `HashMap`:基于哈希表实现,提供快速的查找、插入和删除操作。 - `TreeMap`:基于红黑树实现,...
通过研究源码,开发者不仅可以理解Java集合框架的基础操作,还能洞察其内部实现机制,这对于性能调优、避免常见陷阱以及设计自己的数据结构具有重要意义。此外,还可以学习到如何使用和扩展已有的集合类,以及如何...
2. **算法细节**:比如`LinkedList`插入和删除操作的时间复杂度为何是O(1),以及`TreeSet`是如何使用红黑树保证排序的。 3. **并发控制机制**:`ConcurrentHashMap`如何在不加锁的情况下实现线程安全。 4. **性能...
在集合类如`TreeSet`和`TreeMap`中,这会导致元素排序和查找的问题。例如,两个被认为是不等的`Foo`对象如果在`compareTo()`中被视为相等,那么在`TreeMap`中添加这两个对象将只保留一个,而不是预期的两个独立条目...