1 List集合存储数据的结构
(1)栈
(2)队列
(3)数组
(4)链表
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点出来的)
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Dog other = (Dog) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
3.2 LinkedHashSet
LinkedHashSet是Set接口下面的一个实现类。
内部除了有一个哈希表之外,还有一个链表。
这个链表的作用是可以保证有序。
注意:Set接口特点是无序,但是他不能保证下面所有的集合都无序。
特点:有序。
4 ArrayList里面的contains和HashSet里面的contains
ArrayList 里面的contains: 仅仅调用equals方法进行比较。
HashSet里面的contains: 先调用hashCode求出哈希值进行比较,然后再使用equals进行比较。