集合(三)
set部分代码及集合总结
1.Set(掌握)
(1)无序(元素的存储和取出顺序),唯一。
(2)Set体系图
Set
|--HashSet
底层数据结构是哈希表。
唯一,无序。
怎么保证唯一性的?
依赖两个方法:hashCode()和equals()
首先判断hashCode()是否相同:
同:继续比较equals()方法
如果true:说明元素存在。
如果false:就直接添加。
不同:就直接添加。
|--LinkedHashSet
底层数据结构是哈希表和链表。
唯一,有序。
由哈希表保证唯一。
由链表保证有序。
|--TreeSet
底层数据结构是二叉树。
唯一,有序。
怎么保证唯一性的?
根据自然排序或者比较器返回的值是否是0。
两种实现方案:
A:元素具备比较性 实现Comparable接口 自然排序
B:集合具备比较性 实现Comparator接口 比较器
一般推荐使用B方案。
(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;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
@Override
public int hashCode()
{
return this.name.hashCode()+this.age*13;
}
@Override
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;
}
}
public class HashSetDemo
{
public static void main(String[] args)
{
HashSet<Student> hs = new HashSet<Student>();
Student s1 = new Student("zhangsan",20);
Student s2 = new Student("lisi",30);
Student s3 = new Student("wangwu",40);
Student s4 = new Student("zhaoliu",25);
Student s5 = new Student("zhangsan",20);
hs.add(s1);
hs.add(s2);
hs.add(s3);
hs.add(s4);
hs.add(s5);
for(Student s : hs)
{
System.out.println(s.getName()+"***"+s.getAge());
}
}
}
(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;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setAge(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
}
public class TreeSetDemo
{
public static void main(String[] args)
{
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>(){
@Override
public int compare(Student s1,Student s2)
{
int num = s1.getName().length()-s2.getName().length();
int num2 = (num==0)?s1.getName().compareTo(s2.getName()):num;
int num3 = (num2==0)?s2.getAge()-s1.getAge():num2;
reutrn num3;
}
});
Student s1 = new Student("zhangsan",20);
Student s2 = new Student("lisi",30);
Student s3 = new Student("wangwu",40);
Student s4 = new Student("zhaoliu",25);
Student s5 = new Student("zhangsan",20);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for(Student s : ts)
{
System.out.println(s.getName()+"***"+s.getAge());
}
}
}
2.Collection集合的总结
Collection (add,size,iterator,remove,contains)
|--List (get,set)
元素有序,可重复。
|--ArrayList
底层数据结构是数组,查询块,增删慢。
线程不安全,效率高。
|--Vector
底层数据结构是数组,查询块,增删慢。
线程安全,效率低。
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
|--Set
元素无序,唯一。
|--HashSet
底层数据结构是哈希表。
唯一,无序。
怎么保证唯一性的?
依赖两个方法:hashCode()和equals()
首先判断hashCode()是否相同:
同:继续比较equals()方法
如果true:说明元素存在。
如果false:就直接添加。
不同:就直接添加。
|--LinkedHashSet
底层数据结构是哈希表和链表。
唯一,有序。
由哈希表保证唯一。
由链表保证有序。
|--TreeSet
底层数据结构是二叉树。
唯一,有序。
怎么保证唯一性的?
根据自然排序或者比较器返回的值是否是0。
两种实现方案:
A:元素具备比较性 实现Comparable接口 自然排序
B:集合具备比较性 实现Comparator接口 比较器
一般推荐使用B方案。
3.使用哪种集合。
元素是否重复:
是:List
线程是否安全:
是:Vector
不是:ArrayList,或者LinkedList
查询多:ArrayList
增删多:LinkedList
如果不知道,用ArrayList
否:Set
是否排序:
是:TreeSet
否:HashSet
如果不知道,用HashSet
如果不知道,用ArrayList。
4.常见的数据结构
ArrayXxx : 底层数据结构是数组,查询块,增删慢。
LinkedXxx :底层数据结构是链表,查询慢,增删快。
HashXxx :底层数据结构是哈希表,想到两个方法:hashCode()和equals()
TreeXxx : 底层数据结构是二叉树,想到两种方式:自然排序(Comparable),比较器(Comparator)
5.可变参数(理解)
(1)参数个数不固定。
(2)格式:
修饰符 返回值类型 函数名(数据类型... 变量名)
{
}
注意:
这个变量其实是一个数组。
如果一个函数有多个参数,可变参数只能放在最后边。
(3)举例:
public static int sum(int... x)
{
int result = 0;
for(int i : x)
{
result+=i;
}
return result;
}
6.Arrays工具类的使用
(1)对数组进行操作的工具类
(2)要掌握的功能:
A:toString()
B:sort()
C:binarySearch()
(3)把数组变成集合的功能
asList(T... t)
注意:把数组转成集合后不能添加和删除。但是可以修改。
(1)对Collection集合进行操作的工具类
(2)面试题:Collection和Collections的区别
前者是集合的顶层接口,里面定义了集合的常见功能。
后者是对集合操作的工具类,里面定义了排序,查找等功能。
(3)需要了解
A:排序
B:查找
C:最大值
D:反转
E:随机置换
(4)案例:
模拟发牌
模拟点名
验证码的变化
7.Collections工具类的使用