1.5 List
1.5.1 ArrayList 在上一篇
1.5.2 LinkedList
1.5.2.1 基本使用
LinkedList:底层是一个双向链表,因为不是连续存储
只是能够找到下一个元素的地址而已,所以进行添加和删除效率较高
但是查询效率较低,因为只能从第一个挨个找
LinkedList list = new LinkedList();创建对象
list.add(1);list.add(11);list.add(111);添加
list.size();个数
list.isEmpty();是否为空
list.remove(0);根据下标删除
list.remove(new Integer(11));根据数据删除
list.clear();清空
list.set(2,1111);更改
list.get(2);获取
for(Object object:list);遍历
1.5.2.2 底层实现
1.5.2.2.1 节点类
链表由节点构成,因为是双向链表,所以节点中有三个属性
1 )上一个节点对象 节点类型
2 )保存的数据 Object
3 )下一个节点对象 节点类型
private static class Node<E>{ 是LinkedList类中的一个内部类
E item; 要保存的数据 E可以理解为Object
Node<E> prev; 上一个节点对象
Node<E> next; 下一个节点对象
Node(Node<E> prev,E element,Node<E> next){ 有参构造方法
this.item = element;
this.prev = prev;
this next = next;
}
}
1.5.2.2.2 LinkedList类
为了首尾添加效率更高,在LinkedList类中保存了首节点和尾结点
transient int size = 0; 已有元素个数
transient Node<E> first; 首节点,也就是第一个节点
transient Node<E> last; 尾节点,也就是最后一个节点
1.5.2.2.3 添加-add
1.5.2.2.4 获取-get
1.6 Set
Set特性:无序 不可重复(*无序指添加和取出顺序不保证一致)
HashSet:底层是散列表
TreeSet:底层是红黑树,添加的元素必须按照一定的格式进行排序
1.6.1 TreeSet
排序规则
数字:默认从小到大
字符串:按每位ASCLL码进行排序
a,aa,aadddd,acadas,caa,d
[1, 10, 2, 3, 4, 5, 6, 7, 8, 9]
日期:自然日期 昨天今天明天
因为TreeSet必须保证元素有序,也就意味着元素类型必须统一
不统一就没有可比性,就不能排序
不可重复,如果重复则不添加
根据内容删除,不能根据索引,因为没有索引
1.6.2 comparable
使用TreeSet的时候,元素必须实现了Comparable接口,因为在添加的时候,会自动调用该接口的compareTo方法进行比较
添加字符串,数字,日期的时候,会进行自动排序,是因为Integer,String,Date都实现了该接口和该方法
如果我们要存储自定类型的时候,就需要让该类去实现对应的接口和方法才能进行存储
因为自己定义的类没有实现对应的Comparable接口,所以在使用TreeSet的时候,会报错
{该方法 返回 0 说明重复,不添加
返回 大于0的值 说明要添加的元素比集合中的大,就往后放
返回 小于0的值 说明要添加的元素比集合中的元素小,就往前放}
1.6.3 comparator
Comparator也是比较器类Comparable也是做比较的 , 如果这两个同时存在,则Comparator优先级高
Comparable : 如果treeSet中保存我们自己定义的类型的时候,使用Comparable
Comparator : 如果treeSet中保存的不是我们写的类型的时候,就要使用Comparator来指定排序规则
比如 Integer 默认是升序排序,假如我们需要降序排序,我们只能使用 Comparator,因为我们不可能去更改Integer的源码
但此时 Integer中是有Comparable接口的实现的,等于两个比较都存在,但是Comparator优先级高,
所以会按照我们定义的规则进行排序
开闭原则 : 对修改关闭,对扩展开发
1.6.4 List排序
该方法会调用对象的Comparable中的compareTo方法或者是Comparator接口中的方法
因为Integer中有compareTo方法,而且是升序,所以才可以使用sort方法
比如想要降序可以使用sort方法重载
Collections.sort(list);