回顾:
List体系
栈:
队列:
数组:
链表:
List体系的三个子类
ArrayList -- 数据结构 数组
Vector -- 数据结构 数组
特有功能
LinkedList -- 数据结构 链表
特有功能
First
Last
面试题: 模拟栈结构
泛型:明确数据类型的工作放在创建对象 或者 调用方法的时候
类型转换异常
三个应用:泛型接口 泛型类 泛型方法
Arrays工具类
toString()
sort()
binarySearch()
1、 Set
特点:元素无序 , 唯一
注意这个顺序,指的是元素存入和取出的顺序
set是一个不包含重复元素的 collection
HashSet它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。
HashSet元素无序的解释:
要理解这个问题应该考虑到Set是个接口。接口的规则很单纯,不会做过多的保证。
Set的规则重点就是“元素不重复的集合”,而对顺序不做保证。
实现该接口的类既可以提供有序的实现,也可以提供无序的实现。
HashSet在保存数据的时候显然还是得按一定顺序放入其中(通过hash算法),但顺序不是用户可控制的,对用户来说就是“无序”。
HashSet add源码分析
HashSet 里面封装了 hashMap
调用HashSet的 add() 实际走 hashMap的put()
put()方法里面 首先去算了对象的hash值 -- 调用对象的hashCode()
(e.hash == hash && ((k = e.key) == key||key.equals(k)))
如果hash值不等,直接断定元素不一样,添加
如果相等,走后面的判断 e.key == key || key.equals(k) 依赖于equals() 方法。
如果equals返回的也是true,那么元素重复了。
结论:HashSet保证元素唯一 依赖于元素的 hashCode() 和 equals() 方法
HashSet 重复的元素,添加失败。
TreeSet 重复的元素,也是添加失败的。
TreeSet 里面对元素进行了自然排序。
TreeSet 对元素进行排序:
1.让元素具有比较性 -- 实现Comparable 接口
根据compareTo()方法的返回值,来判断元素的顺序,并保证元素的唯一。
正数:元素往后放
负数:元素往前放
0:表示元素重复,不添加。
2.让集合具备比较性 , 使用集合的带参构造
TreeSet(Comparator comparator)
-- 建议大家使用这种方式:开发原则 -- 对修改关闭,对扩展开放。
自定义比较器去实现Comparator接口。
构造一个新的空 TreeSet,它根据指定比较器进行排序。
需求:我想按学生的年龄排序:
this.age - s.age
需求1:按照对象的年龄排序,从小到大排序
public int compareTo(Student s) {
// 需求是比较年龄
int num = this.age - s.age;
// 由于对象有多个成员变量,你不能根据其中的某一个决定其他的。
// 当某一个相同的时候,你还需要判断其他的是不是也是相同的。
int num2 = (num == 0) ? (this.name.compareTo(s.name)) : num;
return num2;
}
}
需求2:按照对象的姓名长度,从小到大排序,怎么做?
TreeSet 底层数据结构是二叉树
满二叉树 完全二叉树
保存数据的时候: 第一个元素先放到跟节点。其他的元素进来 与根节点比较
如果小,放左边
如果大,放右边。
如果一样,替换。
取出:从根节点开始拿,按照左中右的顺序。
匿名内部类回顾:
格式:
new 接口或抽象类名 () {
// 重写抽象方法
}
Collections 工具类:
排序: sort(List list)
二分查找:binarySearch(List list)
反转 : reverse(List list)
随机置换: shuffle(List list)
最值:max / min (Collection c)
|
|