集合体系结构.png

1 List集合存储数据的结构

(1)栈

栈结构.png

(2)队列

队列.png

(3)数组

数组.png

(4)链表

链表.png

2 List接口

List 是Collection的一个子接口。

这个接口下面的集合有以下特点:
1. 有序。(有序不是顺序,有序指的是怎么存,就怎么取。)
2. 有索引。
3. 可以存放重复元素。

List接口下面的实现类。
ArrayList,LinkedList,Vector

List接口中的常见方法:
boolean add(E e): 在集合的尾部添加元素。
void add(int index, E element): 在指定位置添加元素。
void clear(): 清除所有元素。
boolean contains(Object o):是否包含。
E get(int index):根据索引获取元素。
boolean isEmpty():如果集合中没有任何元素,返回true。
E remove(int index):根据索引删除元素。
boolean remove(Object o):删除指定元素。
E set(int index, E element):替换指定索引位置的元素。
int size() :获取集合的大小。
Object[] toArray():把集合转成数组。

2.1 ArrayList集合

ArrayList 是我们用的最多的一个集合,没有之一。

ArrayList 内部使用【数组】存储数据。
所以说这个集合的特点: 【查询快,增删慢】。

2.2 Vector集合(被淘汰了)


Vector 也是 List接口的一个实现类。
内部也是使用数组去存储数据。
特点: 查询快,增删慢。

但是Vector里面做了一些线程同步的操作。可以保证线程安全,牺牲效率,所以这个集合整体的性能非常低。

这个集合现在已经【被淘汰了】

使用方式和ArrayList一样。

2.3 LinkedList集合

LinkedList 也是List的一个实现类。

内部是由双向链表组成的。
因为是链表这种结构,所以他的特点是: 查询慢, 增删快。

LinkedList内部还有一些【特有】的方法,支持对集合的首尾进行操作

void addFirst(E e): 将数据添加到集合的开头。
void addLast(E e): 将数据添加到集合的尾部。
E getFirst(): 获取集合的首个元素。
E getLast(): 获取集合的最后一个元素。
E removeFirst(): 删除集合中的第一个元素。 返回的被删除的元素
E removeLast(): 删除集合中的最后一个元素。返回的被删除的元素
void push(E e): 压入。 把数据添加到集合的首部。
E pop(): 弹出。 把集合的第一个元素删除,并返回这个元素。

3 Set接口

Set是一个接口,是Collection下面的一个子接口。

Set接口特点:
1. 无序。(怎么存不一定怎么取)
2. 没有索引,不能通过索引获取元素。
3. 不能存放重复的元素。

Set接口下面的常用实现类:
HashSet(常用), LinkedHashSet

3.1 HashSet集合

HashSet 是Set接口下面的一个实现类。
满足Set接口的所有的特点: 1. 无序。 2. 没有索引。 3. 不能重复。

HashSet 内部采用的是哈希表进行存储。效率非常高。

因为HashSet没有索引,所以不能使用普通for循环进行遍历。

如何遍历HashSet集合。
1. 迭代器。
2. 增强for循环。

3.1.1 用HashSet保存自定义对象

使用HashSet保存Dog对象。

如果想要让对象的属性相同,就当做是同一个对象,该怎么解决?
因为HashSet判断唯一性是先调用hashCode再调用equals,所以重写这两个方法就可以了。

【如果要对自定义对象进行去重,一定要重写hashCode和equals】
里面的规则一定要根据属性值去生成。 使用快捷键生成的hashCode和equals方法都是根据属性值的得来
例如:在Dog类中重写这两个方法(Ctrl+Shift+s点出来的)

  1. @Override
  2. public int hashCode() {
  3. final int prime = 31;
  4. int result = 1;
  5. result = prime * result + age;
  6. result = prime * result + ((name == null) ? 0 : name.hashCode());
  7. return result;
  8. }
  9. @Override
  10. public boolean equals(Object obj) {
  11. if (this == obj)
  12. return true;
  13. if (obj == null)
  14. return false;
  15. if (getClass() != obj.getClass())
  16. return false;
  17. Dog other = (Dog) obj;
  18. if (age != other.age)
  19. return false;
  20. if (name == null) {
  21. if (other.name != null)
  22. return false;
  23. } else if (!name.equals(other.name))
  24. return false;
  25. return true;
  26. }

3.2 LinkedHashSet

LinkedHashSet是Set接口下面的一个实现类。

内部除了有一个哈希表之外,还有一个链表。
这个链表的作用是可以保证有序。

注意:Set接口特点是无序,但是他不能保证下面所有的集合都无序。

特点:有序。

4 ArrayList里面的contains和HashSet里面的contains

ArrayList 里面的contains: 仅仅调用equals方法进行比较。
HashSet里面的contains: 先调用hashCode求出哈希值进行比较,然后再使用equals进行比较。