- 浏览: 1589955 次
- 来自: 上海
文章分类
- 全部博客 (374)
- Java (101)
- Struts (54)
- Oracle (30)
- JavaScript (16)
- Spring (27)
- Hibernate (16)
- MyEclipse (3)
- JSF (1)
- FreeMarker (2)
- SiteMesh (2)
- JfreeChart (2)
- Ibatis (2)
- JSP (12)
- MyBatis (4)
- SWFupload (1)
- EJB (4)
- Jboss (4)
- WebService (2)
- Linux (16)
- Android (2)
- XML (6)
- Java 网络编程 (13)
- AXIS2 (1)
- FTP (1)
- Jswing (1)
- Socket (3)
- 杂文选集 (6)
- solr (2)
- PS (1)
- Tomcat (7)
- JDBC (9)
- Highcharts (1)
- maven (1)
- Nodejs (0)
- navicat (2)
- Exception (5)
- eclipse (3)
- jQuery (1)
- springMVC (4)
- MySQL (11)
- SVN (1)
- Sql Server (1)
- zookeeper (1)
- JVM (1)
- Groovy (2)
- Git (1)
- Nginx (1)
- DynamicReport (1)
- IDEA (2)
- JasperReports (1)
- Postgresql (2)
- Mac (1)
- gradle (1)
- 数据结构算法 (1)
最新评论
-
hpu145:
引用引用
java 千分位的添加和去除 -
被遗忘的下路:
少了个junit-4.8.2的包
SSH2整合完整案例(四十三) -
白天看黑夜:
java过滤emoji字符处理,希望能帮到你http://ww ...
emoji 表情图片解决方法 -
caipeiming:
这个挺好JavaScript实现input输入框控件只允许输入 ...
js 控制文本框只能输入中文、英文、数字等 -
双子树:
东西太好啦受教啊
Struts2 JSP中将list,set ,Map传递到Action然后<s:iterator>遍历(三十五)
HashSet 和 TreeSet
TreeSet的第一种排序 元素自身拥有比较功能 哈哈
TreeSet 的第二种比较方式(当元素自身不具备比较方法的时候)
TreeSet练习
谢谢,我懂了!
TreeSet的第一种排序 元素自身拥有比较功能 哈哈
/** * Set 无序的,不可以重复元素 * |--HashSet: 底层数据结构是哈希表, 线程不同步 * hashSet是如何保证元素唯一性呢? * 是通过元素的两个方法, hashCode 和 equals 来完成的 * 如果元素的hashCode值相同,才会判断equals 是否为true * 如果元素的hashCode值不同,不会调用 equals. * * 注意: 对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法. * * |--TreeSet: 可以对Set集合中的元素进行排序 * 底层数据结构式是二叉树 * 保证元素唯一性的依据 * compareTo 方法 return 0 TreeSet 中就只会有一个 元素 * * TreeSet排序的第一种方式,让元素自身具备比较性, * 元素需要实现Comparable接口,覆盖compareTo 方法 * 这种方式 也成为元素的自然顺序,或者叫默认顺序. * * TreeSet的第二种排序方式. * 当元素自身不具备比较性时,或者具备的比较性不是所需要的 . * 这是就需要让集合自身具备比较性. * 在集合初始化时,就有了比较方式. * * * 需求: * 往TreeSet集合中存储自定义对象学生 * 想按照学生的年龄进行排序. * * 记住:排序时,当主要条件相同时,一定要判断一下次要条件. * */ public class TreeSetDemo { public static void main(String[] args) { method_1(); System.out.println("======================="); method_2(); } //保存自定义对象 public static void method_2(){ TreeSet ts=new TreeSet(); ts.add(new Student("lisi01",22)); ts.add(new Student("lisi007",20)); ts.add(new Student("lisi09",19)); ts.add(new Student("lisi01",19)); ts.add(new Student("lisi01",40)); ts.add(new Student("lisi007",30)); ts.add(new Student("lisi09",36)); ts.add(new Student("lisi01",29)); ts.add(new Student("lisi01",90)); Iterator it=ts.iterator(); while(it.hasNext()){ Student stu=(Student)it.next(); System.out.println(stu.getName()+"...."+stu.getAge()); } } //保存普通对象 public static void method_1(){ TreeSet ts= new TreeSet(); ts.add("cba"); ts.add("abcd"); ts.add("aaa"); ts.add("bca"); Iterator it =ts.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } } //使用TreeSet来保存自定义对象 class Student implements Comparable{ private String name; private int age; Student(String name,int age){ this.name=name; this.age=age; } public String getName(){ return name; } public int getAge(){ return age; } @Override public int compareTo(Object obj) { // TODO Auto-generated method stub if(!(obj instanceof Student)) throw new RuntimeException("不是学生对象"); Student stu=(Student)obj; if(this.age>stu.age) return 1; else if(this.age==stu.age){ //return 0; //如果年龄相同的时候 就需要按照姓名排序 return this.name.compareTo(stu.name); } return -1; } }
TreeSet 的第二种比较方式(当元素自身不具备比较方法的时候)
/** * TreeSet的第二种排序方式. * * 当元素自身不具备比较性时,或者具备的比较性不是所需要的 . * 这是就需要让集合自身具备比较性. * 在集合初始化时,就有了比较方式. * 步骤 * 1.定义比较器 (定义一个类,实现Comparator,覆盖compare方法.) * 2.传递给 TreeSet比较器 * * 注意: * 当两种排序都存在时候,以比较器为主. * * * 需求变了: * 要改成 name排序 这样我们为了 不需改 Student 的原比较方法 我们定义一个比较器 采用 name进行比较 */ public class TreeSetDemo1 { public static void main(String[] args) { //之前才使用 age比较 method_1(); //需求变了 要改成 name排序 这样我们为了 不需改 Student 的原比较方法 我们定义一个比较器 采用 name进行比较 System.out.println("=========================="); //改成使用 name比较 method_2(); } public static void method_2(){ //这样就可以 实现 name比较了哦 TreeSet ts=new TreeSet(new StudentComparator()); ts.add(new Student("lisi01",22)); ts.add(new Student("lisi007",20)); ts.add(new Student("lisi09",19)); ts.add(new Student("lisi01",19)); Iterator it=ts.iterator(); while(it.hasNext()){ Student stu=(Student)it.next(); System.out.println(stu.getName()+"...."+stu.getAge()); } } public static void method_1(){ TreeSet ts=new TreeSet(); ts.add(new Student("lisi01",22)); ts.add(new Student("lisi007",20)); ts.add(new Student("lisi09",19)); ts.add(new Student("lisi01",19)); Iterator it=ts.iterator(); while(it.hasNext()){ Student stu=(Student)it.next(); System.out.println(stu.getName()+"...."+stu.getAge()); } } } class Student implements Comparable{ private String name; private int age; Student(String name,int age){ this.name=name; this.age=age; } public String getName(){ return name; } public int getAge(){ return age; } @Override public int compareTo(Object obj) { if(!(obj instanceof Student)) throw new RuntimeException("不是学生对象"); Student stu=(Student)obj; return new Integer(this.age).compareTo(new Integer(stu.getAge())); } } class StudentComparator implements Comparator{ @Override public int compare(Object o1, Object o2) { Student t1=(Student)o1; Student t2=(Student)o2; int num=t1.getName().compareTo(t2.getName()); if(num==0) return new Integer(t1.getAge()).compareTo(new Integer(t2.getAge())); return num; } }
TreeSet练习
/** * 练习 :按照字符串的长度排序 * 字符串本身具备比较性,但是他的比较方式不是所需要的. * * 这时就只能使用比较器. * 注意 : 主要和次要条件的比较 */ public class TreeSetTest { public static void main(String[] args) { TreeSet ts=new TreeSet(new StrLenComparator()); ts.add("abcde"); ts.add("cc"); ts.add("bad"); //长度都相同 内容不同 ts.add("gdg"); //长度都相同 内容不同 ts.add("hahaha"); Iterator it=ts.iterator(); while(it.hasNext()) System.out.println(it.next()); } } class StrLenComparator implements Comparator{ @Override public int compare(Object o1, Object o2) { String s1=(String)o1; String s2=(String)o2; /* if(s1.length()>s2.length()) return 1; if(s1.length()==s2.length()) return 0; return -1; */ int num=new Integer(s1.length()).compareTo(new Integer(s2.length())); //主要条件判断完了 判断次要条件 if(num==0) return s1.compareTo(s2); return num; } }
评论
3 楼
肖泽文
2013-05-30
Luob. 写道
如果重写 Student 的 hashcode 方法 返回一个固定的值,这样 hashcode就不能判断两个对象是否是同个对象了.
@Override
public int hashCode() {
// TODO Auto-generated method stub
return 17;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return 17;
}
谢谢,我懂了!
2 楼
Luob.
2013-05-30
如果重写 Student 的 hashcode 方法 返回一个固定的值,这样 hashcode就不能判断两个对象是否是同个对象了.
@Override
public int hashCode() {
// TODO Auto-generated method stub
return 17;
}
@Override
public int hashCode() {
// TODO Auto-generated method stub
return 17;
}
1 楼
肖泽文
2013-05-30
hashSet是如何保证元素唯一性呢?
* 是通过元素的两个方法, hashCode 和 equals 来完成的
* 如果元素的hashCode值相同,才会判断equals 是否为true
* 如果元素的hashCode值不同,不会调用 equals.
楼主你是不是写错了,如果不是求解释!
hashcode决定的是两者是不是同一个对象,值可以简单理解为对象的值;如果hashcode算法完善无缺,那么它相同则值就一定相同,因为两者就是同一个对象,值能不相同么? hashcode不同,则说明两者不是同一对象,而不同对象也有可能值相等,这就无法确定了。
* 是通过元素的两个方法, hashCode 和 equals 来完成的
* 如果元素的hashCode值相同,才会判断equals 是否为true
* 如果元素的hashCode值不同,不会调用 equals.
楼主你是不是写错了,如果不是求解释!
hashcode决定的是两者是不是同一个对象,值可以简单理解为对象的值;如果hashcode算法完善无缺,那么它相同则值就一定相同,因为两者就是同一个对象,值能不相同么? hashcode不同,则说明两者不是同一对象,而不同对象也有可能值相等,这就无法确定了。
发表评论
-
检测一个字符串是否在jvm的常量池中
2018-12-18 17:34 998public static boolean inPool( ... -
UTC时间, GMT时间 ,夏令时
2017-08-18 15:12 2282经常混淆于此,特地研究了一下,记录在此以备忘。 整个地 ... -
java 反射List
2017-02-18 01:58 5654package com.enhance.reflect; ... -
JDK1.5 Exchange 两个线程互换数据
2016-08-04 18:00 986import java.util.concurrent ... -
JDK1.5 CountDownLatch
2016-08-04 16:25 1055/* * 还有一个利用场景: ... -
java CyclicBarrier 循环障碍阻塞
2016-08-03 23:54 1008//一个同步辅助类,它允许一组线程互相等待,直到到达某个公 ... -
java 信号灯 Semaphore
2016-08-03 23:53 1824更多介绍http://blog.csdn.net/java20 ... -
java 使用读写锁设计一个缓存模型
2016-08-03 23:49 1417import java.util.HashMap; ... -
java 读写锁
2016-08-03 23:46 815import java.util.Random; i ... -
java 多个线程之间同步通信
2016-08-02 17:16 2397import java.util.concurrent ... -
jdk1.5 锁 Lock 和 Condition
2016-08-02 17:03 925// lock 练习 public class Lock ... -
JDK1.5 获取线程执行结果 Callable Future
2016-08-02 15:08 1173import java.util.Random; i ... -
JDK1.5 线程池
2016-08-02 14:48 802import java.util.concurrent ... -
java 多线程ThreadLocal
2016-08-02 00:13 1145import java.util.Random; ... -
java 定时器 Timer
2016-08-01 16:53 3892import java.util.Calendar; ... -
java 多线程同步+通信
2016-08-01 16:48 965/** *父子线程 交替打印10 次, 100次 ... -
java 线程同步
2016-08-01 16:43 1022import java.util.concurrent.l ... -
java多线程练习
2016-08-01 16:35 1841Java 传统多线程 Java 多线程同步 Java 多线 ... -
java 传统多线程
2016-08-01 16:34 1004/** * 传统多线程 */ public ... -
java 图片,剪切,缩放
2016-01-06 10:21 2230package out; import ja ...
相关推荐
Java类集框架是Java编程语言中的核心组成部分,它为开发者提供了高效、灵活的数据存储和...通过"跟我学java26日通 第15天 Java类集框架"的教程,你可以逐步掌握这些关键技能,为成为一名熟练的Java开发者打下坚实基础。
这是一份专为Java初学者准备的学习资源,由魔乐科技提供,旨在帮助用户在18天内建立起坚实的Java编程基础。Typora是一款简洁而高效的Markdown编辑器,使得笔记整理和阅读更加便捷。通过这份笔记,学习者将逐步了解并...
9. **集合框架**:Java集合框架是处理对象数组的强大工具,包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap)等接口及其实现类。 10. **IO流**:Java的IO流系统支持对...
同时,学习集合框架,如List(ArrayList、LinkedList)、Set(HashSet、TreeSet)和Map(HashMap、TreeMap)等,以及它们之间的区别和应用场景。 4. **异常处理**:理解如何使用try-catch-finally语句块来捕获和...
"18天Java学习之经典笔记"是一份专为快速掌握Java基础知识而设计的学习资料,适用于那些希望在短时间内复习、备考或者准备面试的人员。这份笔记涵盖了Java的核心概念,通过18天的学习计划,帮助读者逐步理解并熟练...
《毕向东_Java 25天基础源代码》是一份专为初学者设计的Java编程学习资源,由知名IT教育专家毕向东精心编撰。这个资料包包含了25天的学习计划,每天的学习内容都对应一个具体的Java编程概念或技术,通过源代码的形式...
Java 2 编程21天自学通是一本旨在帮助初学者在短时间内掌握Java编程语言的教程。在21天的学习计划中,你将逐步深入理解Java的核心概念和技术,建立起坚实的编程基础。以下是对Java 2(即Java SE 2)编程的一些关键...
《21天学通Java》是一本非常受欢迎的Java初学者教程,旨在帮助读者在短短21天内掌握Java编程的基础知识。这本书以其系统性、易懂性和实践性深受广大编程爱好者喜爱。以下是对该书内容的一些核心知识点的详细解释: ...
"黑马20天学java视频"可能是一个针对初学者的快速学习课程,旨在帮助学员在短时间内掌握Java的基础知识和核心概念。通过观看这个系列的视频,学习者可以深入理解Java编程的各个方面,并通过整理的思维导图进行巩固。...
以下是一些关于Java学习的关键知识点,这些知识点将在你的十五天学习之旅中扮演重要角色。 1. **Java基础知识**:首先,你需要理解Java的基础语法,包括数据类型(如整型、浮点型、字符型和布尔型)、变量、常量...
《Java 21 Days(下)》是一本专为初学者设计的Java编程入门书籍,旨在帮助读者在21天内逐步掌握Java编程基础。在接下来的内容中,我们将深入探讨这个压缩包文件“java_21Days_master(下)”可能包含的丰富知识点。 1....
18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...
5. **集合框架**:Java集合框架包括List(如ArrayList和LinkedList)、Set(如HashSet和TreeSet)和Map(如HashMap和TreeMap),它们提供了存储和操作对象的高效方法。 6. **I/O流**:Java的I/O流用于读写文件、...
18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...
第一篇 基础篇 第1章 Java简介(精彩视频:33分钟) 21 1.1 Java的平台简介 21 1.2 安装工具包 22 1.2.1 下载JDK 22 1.2.2 安装JDK 24 1.2.3 查看与设置环境变量 25 1.2.4 JDK常用命令 27 1.2.5 Java各个目录含义 28...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
8. **集合框架**:Java集合框架是处理对象集合的工具,包括List(ArrayList、LinkedList)、Set(HashSet、TreeSet)和Map(HashMap、TreeMap)。学习它们的基本操作和使用场景。 9. **IO流**:掌握输入/输出流的...
18、一个用户表中有一个积分字段,假如数据库中有100多万个用户,若要在每年第一天凌晨将积分清零,你将考虑什么,你将想什么办法解决? 107 19、一个用户具有多个角色,请查询出该表中具有该用户的所有角色的其他...