12. collection
Why collection?
集合其实也是一种容器。和数组一样是用来存储多个数据的容器
- 对比着数组来讲:
1、集合中的大小不固定。随着向集合中存储的元素增加,集合的大小也随着增加
2、集合中可以存储引用类型的任何数据(可以存储不同类型的引用数据)
3、集合除了可以通过角标操作外,还具有其它操作元素的方式
- 集合和数组的区别:
1、 从存储元素的大小上:
数组中的大小是固定的
集合中的大小是可改的
2、 从存储类型上:
数组中只能存储相同类型的元素
集合中可以存储不同类型的引用元素
3、 从存储内容上:
数组中可以存储基本类型数据,还可以存储引用类型数据
String[] strs=new String[3]; int[] arr=new int[3];
集合中只能存储引用类型数据
引用类型有:Integer、Long、Double、Character、String、….
小结:集合是一个容器,是用来存储和获取数据的
collection‘s function?
boolean add(E e): 添加元素
boolean remove(Object o):从集合中移除元素
void clear():清空集合中的元素
boolean contains(Object o):判断集合中是否存在指定的元素
boolean isEmpty():判断集合是否为空,为空时返回true
int size():集合的长度,也就是集合中元素的个数
boolean addAll(Collection c): 将一个集合所有的数据添加到另一个集合
boolean containsAll(Collection c): 判断集合中是否包含另一个集合中的所有元素
说明:Collection集合中不具有对集合中某个元素进行修改,或获取指定的某个元素
如果想要修改集合中的元素或查找集合中的元素:
1、对Collection集合进行遍历。在遍历的过程中,找到相应的元素并修改//iterator
2、把集合转换为数组 Object[] toArray()// T[] toArray(T[] a)
拥有Collection 的所有方法
public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
public E get(int index) :返回集合中指定位置的元素。
public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
//注意:只要集合遍历过程中执行删除,就必须让索引–
Set集合的特点:1.无序(存取数据无序) 2.没有索引 3.不能重复
Set是Collection的子接口,所以它拥有Collection接口的所有功能,并且不能直接使用,只能使用它的
实现类:HashSet
13.Map
Interface Map<K,V>
参数类型
K - map集合中键的类型
V - map集合中值的类型
常用的实现类:hashMap
Map集合的常用方法
public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定的值,则返回 true 。
public Set keySet() : 获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
04_HashSet存储自定义对象,去重
总结-要对自定义对象进行去重,必须在类中重写hashCode和equals,自动生成即可
13.1Map集合的第一种遍历方式(键找值)
/*
07_Map集合的第一种遍历方式(键找值)
Map接口没有iterater方法,它没有迭代器,所以不能通过迭代器直接遍历
我们可以可以通过一个方法来间接遍历,获取所有的键之后,遍历键,从而获取值
public Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。
*/
public class MapDemo02 {
public static void main(String[] args) {
Map<Integer, String> maps = new HashMap<>();
maps.put(1, "刘备");
maps.put(2, "关羽");
maps.put(3, "张飞");
maps.put(4, "吕布");
Set<Integer> keys = maps.keySet();
//方式一:迭代器
Iterator<Integer> iterator = keys.iterator();
while (iterator.hasNext()) {
Integer key = iterator.next();
String value = maps.get(key);
System.out.println(key+"-"+value);
}
//方式二:foreach循环
for (Integer key : keys) {
String value = maps.get(key);
System.out.println(key+"-"+value);
}
}
}
13.2_Map集合的第二种遍历方式(键值对遍历)
/*
08_Map集合的第二种遍历方式(键值对遍历)
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
*/
public class MapDemo03 {
public static void main(String[] args) {
Map<Integer, String> maps = new HashMap<>();
maps.put(1, "刘备");
maps.put(2, "关羽");
maps.put(3, "张飞");
maps.put(4, "吕布");
//调用entryset方法,将所有的键值对保存到Set集合中
Set<Map.Entry<Integer, String>> entries = maps.entrySet();
//增强for循环
for (Map.Entry<Integer, String> entry : entries) {
System.out.println(entry.getKey()+"-"+entry.getValue());
}
}
}
—|Collection(接口): 单列集合
—|List(接口): 有存储顺序, 可重复
—|ArrayList(实现类): 数组实现, 查找快, 增删慢
由于是数组实现, 在增和删的时候会牵扯到数组
增容, 以及拷贝元素. 所以慢。数组是可以直接
按索引查找, 所以查找时较快
—|LinkedList(实现类): 链表实现, 增删快, 查找慢
由于链表实现, 增加时只要让前一个元素记住自
己就可以, 删除时让前一个元素记住后一个元
素, 后一个元素记住前一个元素. 这样的增删效
率较高但查询时需要一个一个的遍历, 所以效率
较低
—|Vector(实现类): 和ArrayList原理相同, 但线程安全, 效率略低
和ArrayList实现方式相同, 但考虑了线程安全问
题, 所以效率略低
—|Set(接口): 无存储顺序, 没有索引,数据不可重复
—|HashSet(实现类)(原理(数组+链表+红黑树),先判断hash值,然后判断内容是否相同,然后决定是否保存,如果相同hash值,内容不同,使用链表实现。)
—|TreeSet(实现类)
—|LinkedHashSet(实现类)有存储顺序, 没有索引,数据不可重复
—| Map(接口): 键值对(key 不能重复,value 可以重复
—|HashMap(实现类)
—|TreeMap
—|HashTable
—|LinkedHashMap
vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。这时原有指向旧内存空间的迭代器已经失效,所以当操作容器时,迭代器要及时更新。(与arraylist 类似,只是arraylist时增加50%,而vector是增加1倍)。
泛型:
Collection c = new arraylist<>();