黑马程序员--集合Set总结--java
2015-08-07 22:25
465 查看
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
集合Set总结
01、Set集合的特点元素无序,唯一。
注意:这里的顺序是指存储和取出顺序。
02、HashSet集合的特点
(1)HashSet:不保证元素的迭代顺序。并且,不保证该顺序恒久不变。
(2)HashSet如何保证元素唯一性
HashSet底层数据结构是哈希表。
通过分析源码,确定跟以下语句判断有关
e.hash == hash && ((k = e.key) ==key || key.equals(k))
以上语句说明依赖两个方法:hashCode()和equals()
顺序:
首先,判断hashCode()值是否相同。
相同:
继续走equals()方法,根据其返回值:
true:说明元素重复,不添加到集合。
false:说明元素不重复,添加到集合。
不同:直接添加到集合。
(3)怎么重写hashCode()和equals()方法呢?
hashCode():
把对象的所有成员变量值相加即可。
如果是基本类型,就加值。如果是引用类型,就加哈希值。
equals():
A:this==obj
B:! ( obj instanceof Student )
C:所有成员变量的值比较。基本类型用==,引用类型用equals()。
(4)开发中怎样重写hashCode()和equals()?
自动生成,右键“source”,然后选择“Generate hashCode() and equals()”
注意:HashSet集合存储自定义对象时,需要去重写hashCode()和equals()
(4)案例:
HashSet存储字符串并遍历案例:
import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class SetDemo { publicstatic void main(String[] args) { //创建集合对象 //Collection<String> c = new HashSet<String>(); //Set<String> set = new HashSet<String>(); //HashSet<String> hs = new HashSet<String>(); Set<String>set = new HashSet<String>(); //创建并添加元素 set.add("hello"); set.add("world"); set.add("java"); set.add("world"); //遍历 Iterator<String>it = set.iterator(); while(it.hasNext()) { Strings = it.next(); System.out.println(s); } System.out.println("--------------"); for(String s : set) { System.out.println(s); } } }
03、TreeSet集合的特点
(1)TreeSet:根据构造方法的不用,选择使用自然排序或者比较器排序。
按照实际的需求,可以对元素进行排序。并且保证唯一。
(2)怎么保证的呢?
排序:底层结构是二叉树。按照树节点进行存储和取出。
两种实现:
A:自然排序(元素具备比较性)
TreeSet的无参构造,要求对象所属的类实现Comparable接口。
自定义Student类实现Comparable实例:
public class Student implements Comparable<Student>{ privateString name; privateint age; publicStudent() { } publicStudent(String name, int age) { this.name= name; this.age= age; } publicString getName() { returnname; } publicvoid setName(String name) { this.name= name; } publicint getAge() { returnage; } publicvoid setAge(int age) { this.age= age; } //需求:我想按照对象的年龄排序,从小到大排序。怎么做? //@Override //public int compareTo(Student s) { //// 需求是比较年龄 //int num = this.age - s.age; //// 由于对象有多个成员变量,你不能根据其中的某一个决定其他的。 //// 当某一个相同的时候,你还需要判断其他的是不是也是相同的。 //int num2 = (num == 0) ? (this.name.compareTo(s.name)) : num; //return num2; //} //需求:我想按照姓名的长度排序,从小到大排序。怎么做? @Override publicint compareTo(Student s) { //姓名的长度 intnum = this.name.length() - s.name.length(); // System.out.println(num); //很多时候,别人给我们的需求其实只是一个主要需要 //还有很多的次要需求是需要我们自己进行分析的。 //比较姓名的内容 intnum2 = (num == 0) ? (this.name.compareTo(s.name)) : num; //继续分析,姓名长度和内容都相同的情况下,年龄还可能不一样呢? //所以,当姓名长度和内容都相同的时候,我们在比较下年龄就好了 intnum3 = (num2 == 0) ? (this.age - s.age) : num2; returnnum3; } }
B:比较器排序(集合具备比较性)
TreeSet的带参构造,要求构造方法接收一个实现了Comparator接口的对象。
唯一:根据返回值是否为0。
比较器排序实现方法一:自定义MyComparator类实现Comparator接口
import java.util.Comparator; public class MyComparator implements Comparator<Student> { @Override publicint compare(Student s1, Student s2) { //按年龄排序,从小到大 intnum = s1.getAge() - s2.getAge(); //次要条件 intnum2 = (num == 0) ? (s1.getName().compareTo(s2.getName())) : num; returnnum2; } }
比较器排序实现方法二:匿名内部类
import java.util.Comparator; public class MyComparator implements Comparator<Student> { 4000 @Override publicint compare(Student s1, Student s2) { //按年龄排序,从小到大 intnum = s1.getAge() - s2.getAge(); //次要条件 intnum2 = (num == 0) ? (s1.getName().compareTo(s2.getName())) : num; returnnum2; } }
注意:
如果同时有两种方案,以比较器为主。
04、Collections工具类的使用
面试题:
Collection和Collections的区别?
A:Collection是Collection体系的顶层接口,里面定义了这个体系中的共性方法.
B:Collections是针对Collection集合操作的工具类 里面一定了一些对集合操作的方法
比如 排序,查找,反转,最值,置换
public static void sort ( List list )
排序
public static <T> int binarySearch( List list, T key )
二分查找
public static void reverse( List list )
反转
public static T max( Collection coll )
最大值
public static void shuffle( List list )
随机置换.
相关文章推荐
- 剑指offer面试题19——二叉树的镜像
- 黑马程序员---OC基础补充---补充:copy与mutableCopy、单例模式
- 黑马程序员————java基础之Io一
- (Java面试之知识点串烧)
- 黑马程序员——Java基础——命名规则、标识符、关键字和运算符
- 请大胆的和你职业相关的人保持沟通
- 剑指Offer面试题28(java版):字符串的排列
- 程序员风格的修真小说
- 国外程序员整理的 PHP 资源大全
- 数组A包含0到n的所有整数,但其中缺了一个,且数组A里的整数都是用二进制形式存储,求这个缺失的整数
- IBM总架构师寇文东谈程序员的职业规划
- 黑马程序员---OC基础---Foundation(下)
- 通向码农的道路(开源 libevent min_heap 实现)
- 黑马程序员 oc随机 点语法
- 【黑马程序员】Java笔记--反射
- sql面试题详解
- 【剑指Offer面试题】 九度OJ1371:最小的K个数
- 面试常见问题及回答 面试技巧及注意事项
- java感悟之继承和封装(不要做码农)
- 黑马程序员-----OC学习之Foundation中的结构体