1 集合概述
集合就是java为我们存放对象提供的容器,集合长度不固定,可以存放不同类型数据。
集合有两个根接口,分别是Collection接口和Map接口。Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。下图是集合体系图。
2 Collection 接口
- Collecton接口常用的子接口有:List接口、Set接口
- List接口常用的子类有:ArrayList类、LinkedList类
- Set接口常用的子类有:HashSet类,LinkedHashSet类
list 接口
list存储数据有两种数据结构,数组结构和链表结构。
数组结构:通过索引找到数据真正存储地址,直接访问元素,访问速度非常快。查询快,增删慢。ArrayList集合就是使用数组结构的list集合查询速度快。
链表结构:不能直接查出元素地址,需要通过一个元素推导下一个元素地址,查询速度慢,增删快。LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。
set 接口
set集合通过元素的equals方法,来判断是否为重复元素,它是个不包含重复元素的集合。HashSet、LinkedHashSet是常用的两个set集合。
HashSet
HashSet集合存储数据的结构(哈希表)。哈希表底层使用的也是数组机制,数组中也存放对象,而这些对象往数组中存放时的位置比较特殊,当需要把这些对象给数组中存放时,那么会根据这些对象的特有数据结合相应的算法,计算出这个对象在数组中的位置,然后把这个对象存放在数组中。而这样的数组就称为哈希数组,即就是哈希表。保证HashSet集合元素的唯一,其实就是根据对象的hashCode和equals方法来决定的。
3 Map 接口
Map接口集合主要使用HashMap集合、LinkedHashMap集合。
- HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
- LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
- 注意:Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。
HashMap Demo
练习:每位学生(姓名,年龄)都有自己的家庭住址。那么,既然有对应关系,则将学生对象和家庭住址存储到map集合中。学生作为键, 家庭住址作为值。
注意,学生姓名相同并且年龄相同视为同一名学生。
- 学生类
public class Student {
private String name;
private int age;
//编写构造方法,文档中已省略
//编写get,set方法,文档中已省略
//编写toString方法,文档中已省略
}
- 测试类
public class HashMapTest {
public static void main(String[] args) {
//1,创建hashmap集合对象。
Map<Student,String> map = new HashMap<Student,String>();
//2,添加元素。
map.put(new Student("lisi",28), "上海");
map.put(new Student("wangwu",22), "北京");
map.put(new Student("zhaoliu",24), "成都");
map.put(new Student("zhouqi",25), "广州");
map.put(new Student("wangwu",22), "南京");
//3,取出元素。键找值方式
Set<Student> keySet = map.keySet();
for(Student key : keySet){
String value = map.get(key);
System.out.println(key.toString()+"....."+value);
}
//取出元素。键值对方式
Set<Map.Entry<Student, String>> entrySet = map.entrySet();
for (Map.Entry<Student, String> entry : entrySet) {
Student key = entry.getKey();
String value = entry.getValue();
System.out.println(key.toString()+"....."+value);
}
}
}
LinkedHashMap Demo
引入:知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保证有序,还要速度快怎么办呢?
在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构。
public class LinkedHashMapDmeo {
public static void main(String[] args) {
LinkedHashMap<String, String> map = new LinkedHashMap<String,String>();
map.put("邓超", "孙俪");
map.put("李晨", "范冰冰");
map.put("cyy", "新垣结衣");
Set<Entry<String,String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey()+" "+entry.getValue());
}
}
}
结果:
邓超 孙俪
李晨 范冰冰
cyy 新垣结衣