1. 回顾
栈:
后进先出 LIFO表
队列:
先进先出 FIFO表
数组:
查询快,增删慢
链表:
查询慢,增删快
哈希表:
树
List
-- ArrayList
数组,查询快,增删慢
线程不安全,效率高
-- Vector
数组,查询快,增删慢
线程安全,效率低
addElement(Object obj) -- add(Object obj)
-- LinkedList
链表,查询慢,增删快
线程不安全,效率高
addFirst(Object obj)
addLast(Obejct obj)
了解面试题:用LinkedList模拟栈结构。面向对象。
根据具体需求选择使用哪一个。如果不知道,请使用ArrayList。
增强for
for(String str : list)
{
sysout(str);
}
泛型:明确数据类型的工作放到创建对象或者调用方法的时候。
泛型类
泛型接口
泛型方法
备份的思想!!!
2. Set体系
特点:元素唯一,无序
HashSet
TreeSet
3. HashSet的add源码:
HashSet 封装的是HashMap实现的, 走add方法 ,其实是走的HashMap的put方法;
put方法里面,先做了是否为null的判断之后,就去算了一个hash值。这个值跟对象的hashCode() 方法相关。
然后看下面这句代码:
if (e.hash == hash && (e.key == key||key.equals(k))) { }
看上面的判断代码,如果hash值不一样,就直接返回了fasle,认为元素不重复,添加到集合去了。
只有hash值不一样,再去比较对象的地址值(为了效率), 再去走equals方法,它也返回true。这时才能说明元素重复了。
所以结论:
HashSet集合存储自定义对象保证元素唯一依赖于对象所属类的两个方法:
hashCode()
equals()
4. TreeSet
特点:保证元素唯一,也不保证元素存储和取出的顺序。但是它可以按元素的自然顺序排序。
使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。
TreeSet存储自定义对象,保证元素唯一且实现排序:
方式1(让元素具备比较性):
自然排序:
让元素所属类实现Comparable接口,重写compareTo() 方法。根据方法的返回值:
如果是正数: 元素往后放
如果是负数: 元素往前方
如果是0: 元素重复,不添加
方式2:(让集合具备比较性)
使用TreeSet的带参构造。
自定义类实现Comparator接口, 重写compare()方法。
创建此实现类的对象,使用TreeSet(Comparator comparator)构造,将对象作为参数传递进去
匿名内部类:
格式:
new 接口名(){
// 重写接口中的方法
};
本质: 实现了接口的匿名子类对象。
5. Collections 工具类
sort(List list)
int binarySearch(List list, T key)
reverse(List list)
max(Collection c)
min(Collection c)
shuffle(List list)
|
|