1 Collection的概念
Collection
表示一组对象Collection
函数库是在java.util
包下的一些接口和类,类是用来产生对象存放数据用的,而接口是访问数据的方式Collection
函数库与数组的不同- 数组容量有限制,
Collection
函数库可以自动调节容量大小 Collection
函数库只能用来存放对象,而数组没有这样的限制
- 数组容量有限制,
Collection
接口是Collection
层次结构中的根接口,定义了最基本的访问方式Collection
,Collection
函数库和Collection
接口Collection
代表一组对象Collection
函数库是Java中的集合框架Collection
接口是这个集合框架中的根接口
- 存放在
Collection
函数库中的数据,被称为元素(element) Collection
函数库的API接口层次如下图:
注:
1. Set:无序且不可重复
2. List:有序可以重复
3. Map:键(key)值(value)对
2 List容器的几种实现
List
的定义
List array_list = new ArrayList(); // 底层使用数组实现,查询快,修改、插入、删除慢,线程不安全
List linked_list = new LinkedList(); // 底层使用链表实现,查询慢,修改、插入、删除,线程不安全
List vector = new Vector<Object>(); // 底层使用数组实现,线程安全,效率低
3 Map
-
Map
底层采用数组和链表结合的方式进行数据存放,数组的每一个单元对应一个对象的HashCode
,链表的每一个单元存放键值对,这样做可以提高效率,同时数组配合链表,可以防止出现HashCode
冲突的问题。寻找某个键值对时,先取该对象的哈希值,之后直接去数组对应的[哈希值]单元读取链表并找到对应的链表节点即可。 -
Java中规定,两个内容相同的对象具有相同的哈希值
-
Map
的定义
Map map1 = new Hashtable<Object, Object>(); // 效率低,线程安全
Map map2 = new HashMap<Object, Object>(); // 效率高,线程不安全
4 Set
- 容器内元素无序且不可重复,相当于数学上的集合,取值的时候可以用迭代器或者循环遍历
Set
的定义
Set set = new HashSet<Object>(); // 底层使用HashMap实现
5 equals()和hashCode()
- 默认情况下,定义一个类时,
equals()
方法会比较两个对象的地址是否相等,如果地址不相等,则会返回false
,但是有的场景下,用户需要比较两个对象中的属性值是否相同,这个时候,需要重写父类Object.equals()
方法。 Object.hashCode()
方法使用native
进行修饰,依赖本地的操作系统,针对对象的地址值,有的场景需要根据对象中的属性生成哈希值时,需要对Object.hashCode()
方法进行重写。
class Student {
private int id;
private String name;
/*
* native:本地,该关键字修饰的方法,会根据不同的操作系统,进行本地化操作
* Object父类中提供的hashCode()方法,该方法使用native关键字
*
* @see java.lang.Object#hashCode()
*/
public native int hashCode();
/*
* Object父类中提供的equals()方法,是比较两个对象的地址是否相同 无法比较两个对象中的属性是否相同
*
* @see java.lang.Object#equals
*/
public boolean equals(Object obj) {
return (this == obj);
}
/*
* 重写父类中的hashCode()方法实现散列
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
/*
* 重写父类中的equals()方法,此时可以进行对象的内容(属性)比较
*/
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
6 迭代器(iterator)
- 所有实现了
Collection
接口的容器类都有一个iterator
方法用于返回一个实现了Iterator
接口的对象
List list = new ArrayList<Object>();
for (int i =0; i<10;i++){
list.add(i);
}
// 创建迭代器
Iterator<Object> iter = list.iterator();
while (iter.hasNext()){ // 判断是否有下一个元素
System.out.println(iter.next()); // 获取下一个元素
}