---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
1:Set集合
?(1)Set集合的特点:元素无序,唯一。
?(2)Set的子类:
??Set
???|--HashSet
????底层数据结构是哈希表。
????是如何保证元素的唯一性的呢?
?????依赖两个方法:hashCode()和equals()。
?????首先判断hashCode()值是否相同。
??????是:
???????继续判断equals()的返回值
????????true:元素重复。
????????false:添加到集合。
??????否:
???????直接添加到集合。
????|--LinkedHashSet
?????底层数据结构是哈希表和链表。
?????由哈希表保证元素的唯一。
?????由链表保证元素的有序。
???|--TreeSet
????底层数据结构是二叉树。
????是如何保证元素的唯一性和排序的呢?
?????是根据自然排序或者比较器的返回值是否是0决定。
?????排序有两种方式:
??????自然排序:
???????对象具备比较性,自定义类实现Comparable接口
??????比较器排序:
???????集合具备比较性,接收Comparator的构造参数
?(3)HashSet代码体现 :
??需求:存储自定义对象,要求成员变量值都相同即为同一个对象。
??public class Student
??{
//姓名
???private String name;
//年龄
???private int age;
//无参构造方法
???public Student(){}
//有参构造方法
???public Student(String name,int age)
???{
????this.name = name;
????this.age = age;
???}
???
???//...getXxx()/setXxx()
//复写hashCode()方法
???public int hashCode()
???{
????return this.name.hashCode()+this.age*13;
???}
???public boolean equals(Object obj)
???{
//判断是否是同一个对象
????if(this==obj)
????{
?????return true;
????}
//判断是否属于本类对象
????if(!(obj instanceof Student))
????{
?????return false;
????}
//对对象进行类型转换
????Student s = (Student)obj;
????return this.name.equals(s.name) && this.age == s.age;
???}
??}
??实际操作代码自己补齐:
???
?(4)TreeSet代码体现:
??public class Student
??{
//姓名
???private String name;
//年龄
???private int age;
//无参构造
???public Student(){}
//有参构造方法
???public Student(String name,int age)
???{
????this.name = name;
????this.age = age;
???}
???
???//...getXxx()/setXxx()
??}
??public class TreeSetTest
??{
???public static void main(String[] args)
???{
//创建TreeSet集合对象并创建匿名内部类实现Comparator接口
????TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>(){
//实现接口中的compare方法
?????public int compare(Student s1,Student s2)
?????{
??????//...
?????}
????});
????//创建元素
????//添加元素
????//遍历
???}
??}
??
??源码分析:
???TreeSet(Comparator c) -- TreeMap -- put()
???TreeSet(传递一个具体的实现。)
?
???public class TreeMap
???{
????private Comparator c;
????public TreeMap(Comparator c)
????{
?????this.c = c;
????}
????public ? put()
????{
?????
????}?
???}
2:Collection集合的体现概述:
?Collection
??|--List
???|--ArrayList
???|--Vector
???|--LinkedList
??|--Set
???|--HashSet
????|--LinkedHashSet
???|--TreeSet
????Comparable
????Commparator
3:常见的数据结构特点
?ArrayXxx:底层数据结构是数组,查询快,增删慢。
?LinkedXxx:底层数据结构是链表,查询慢,增删快。
?HashXxx:底层数据结构是哈希表。保证唯一依赖两个方法:hashCode()和equals()
?TreeXxx:底层数据结构是二叉树。保证唯一依赖自然排序或者比较器排序。同时还能够保证有序。
4:我们到底什么时候使用谁
?是否唯一:
??是:Set
???是否排序:
????是:TreeSet
????否:HashSet
??用HashSet。
??不是:List
???是否线程安全:
????是:Vector
????否:ArrayList,LinkedList
?????查询多:ArrayList
?????增删多:LinkedList
??用ArrayList。
?用ArrayList。
5:遍历:
?List:
??迭代器
??普通for
??到底用谁?
???一般遍历的时候,肯定选择迭代器。
???但是,如果你在操作的过程中,要用到索引的值,请用普通for。
?Set:
??迭代器