Collection集合
1.1 集合概述
集合:集合是java中提供的一种容器,可以用来存储多个数据。
数组和集合的区别:数组的长度是固定的。集合的长度是可变的。
数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不
一致。在开发中一般当对象多的时候,使用集合进行存储。集合提供了很多方法,功能更强大。
1.2 集合框架
学习集合的目标:
1.会使用集合存储数据
2.会遍历集合,把数据再取出来
3.掌握每种集合的特性
集合框架的学习方式:
1.学习顶层:学习顶层(接口/抽象类)中共性的方法,所有的子类都可以使用
2.使用底层:顶层不是接口就是抽象类,无法创建对象使用,需要使用底层的子类创建对象使用
集合按照其储存结构可以分为两大类
分别是单列集合java.util.Collection和双列集合java.util.Map
Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,他有两个重要的子接口,分别是
java.util.List和java.util.Set。
其中,List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。
List接口的主要实现类有java.util.ArrayList和java.util.LinkedList
Set接口的主要实现类有java.util.HashSet和java.util.reeSet
1.3 Collection集合常用方法
Collection接口是所有单列集合最顶层的接口,里面定义了所有单列集合共性的方法
任意的单列集合都可以使用Collection集合方法
共性方法:
public boolean add(E e) : 把给定的对象添加到当前集合中 。
public boolean remove(E e) : 把给定的对象在当前集合中删除。
集合中存在元素,删除元素,返回true
集合中不存在元素,删除失败,返回false
集合中有相同的元素,只会删除第一个
public boolean contains(E e) : 判断当前集合中是否包含给定的对象。
public boolean isEmpty() : 判断当前集合是否为空。
public int size() : 返回集合中元素的个数。
public Object[] toArray() : 把集合中的元素,存储到数组中。
public void clear() :清空集合中所有的元素,不会把集合删除。
二、Iterator迭代器
2.1 Iterator<E>接口:迭代器(对集合进行遍历)
Iterator接口的常用方法如下:
public E next() :取出集合中的元素。
public boolean hasNext() :判断是否到达集合末尾,是就返回false,否则返回 true
Iterator是一个接口,我们无法直接使用,需要使用Iterator接口的实现类对象
获取实习的方式比较特殊
Collection接口中有一个方法,叫iterator(),这个方法返回的就是迭代器的实现类对象
Iterator<E> iterator() 返回在此 collection 的元素上进行迭代的迭代器。
迭代器的使用步骤(重点):
1.使用集合中的方法iterator(),获取迭代器的实现类对象,使用Iterator接口接收实现类(多态)
2.使用Iterator接口中的方法hasNext判断是否到达了集合的末尾
3.使用Iterator接口中的方法next取出集合中的元素
//使用迭代器 遍历 每个集合对象都有自己的迭代器
Iterator<String> it = coll.iterator();
// 泛型指的是 迭代出 元素的数据类型
while(it.hasNext()){ //判断是否有迭代元素
String s = it.next();//获取迭代出的元素
System.out.println(s);
}
增强for循环
for(String str:数组){
System.out.println(str);
}
增强for循环底层就是一个迭代器
迭代器的并发修改异常:ConcurrentModificationException
在使用迭代器的过程中,修改了集合的长度(添加元素,删除元素),就会抛出并发修改异常
并发:两件事情同时发生(1.迭代,2.修改集合长度)
并发修改异常的解决方法:
1.在迭代的过程中,不对集合的长度进行修改
2.了解:
Iterator接口有一个子接口ListIterator接口(只有List接口下边的集合可以使用)
ListIterator接口中定义了add方法和remove方法,可以对集合添加/删除元素
如果使用ListIterator接口中的add/remove方法对集合添加/删除元素,那么迭代器自己添加/删除的, 就不会抛出异常了
三、泛型
泛型:是一种未知的数据类型,当我们不知道用什么数据类型的时候,就可以使用泛型
泛型也可以看成是一个变量,用来接收数据类型
创建集合对象的时候,就会确定泛型的数据类型
泛型的使用
创建集合对象,使用泛型
好处:
1.避免了类型转换的麻烦,存储数据是什么类型,取出数据就是什么类型
2.把运行期异常(代码运行之后会抛出异常),提升到了编译期(写代码的时候会报错)
弊端:
泛型是什么类型,只能存储什么类型的数据
创建集合对象,不使用泛型
好处:
集合不使用泛型,默认的数据类型就是Object类型,可以存储任意数据类型的数据
弊端:
不安全,会引发异常
含有泛型的方法
定义格式:修饰符 <代表泛型的变量> 返回值类型 方法名(参数){ }
使用格式:调用方法时,确定泛型的类型
含有泛型的接口....
定义格式:修饰符 interface接口名<代表泛型的变量> { }
使用格式:
1、定义类时确定泛型的类型
2、始终不确定泛型的类型,直到创建对象时,确定泛型的类型
泛型通配符
泛型的通配符:
?:代表任意的数据类型
使用方式:
不能创建对象使用
只能作为方法的参数使用
定义一个方法,能遍历所有类型的ArrayList集合
这时候我们不知道ArrayList集合使用什么数据类型,可以使用泛型通配符?来接收数据类型
注意:泛型没有继承概念的
通配符高级使用----受限泛型泛型的上限:
格式: 类型名称 <? extends 类 > 对象名称
意义: 只能接收该类型及其子类
泛型的下限:
格式: 类型名称 <? super 类 > 对象名称
意义: 只能接收该类型及其父类型
比如:现已知Object类,String 类,Number类,Integer类,其中Number是Integer的父类
Map集合
1.1 概述
Collection 中的集合:元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
Map 中的集合:元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的
值。
Collection 中的集合称为单列集合, Map 中的集合称为双列集合。
注意:Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
Map集合特点:
1.Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
2.Map集合中的元素,key和value的数据类型可以相同,也可以不同
3.Map集合中的元素,key是不允许重复的,value是可以重复的
4.Map集合中的元素,key和value是一一对应
1.2 Map常用子类
java.util.HashMap<k,v>集合 implements Map<k,v>接口
HashMap集合的特点:
1.HashMap集合底层是哈希表:查询的速度特别的快
JDK1.8之前:数组+单向链表
JDK1.8之后:数组+单向链表|红黑树(链表的长度超过8):提高查询的速度
2.hashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
java.util.LinkedHashMap<k,v>集合 extends HashMap<k,v>集合
LinkedHashMap的特点:
1.LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
2.LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的
1.3 Map接口中的常用方法
public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中。
返回值:v
存储键值对的时候,key不重复,返回值V是null
存储键值对的时候,key重复,会使用新的value替换map中重复的value,返回被替换的value值
public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
返回值:V
key存在,v返回被删除的值
key不存在,v返回null
public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
返回值:
key存在,返回对应的value值
key不存在,返回null
boolean containsKey(Object key) 判断集合中是否包含指定的键。
包含返回true,不包含返回false
public Set<K> keySet() : 获取Map集合中所有的键,存储到Set集合中。
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)。
Map集合的第一种遍历方式:通过键找值的方式
Map集合中的方法:
Set<K> keySet() 返回此映射中包含的键的 Set 视图。
实现步骤:
1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
2.遍历set集合,获取Map集合中的每一个key
3.通过Map集合中的方法get(key),通过key找到value
1.5 Entry键值对对象
Map.Entey<K,V>:在Map接口中有一个内部接口Entry
作用:当Map集合一创建,那么就会在Map集合中创建一个Entry对象,用来记录键与值(键值对对象,键与值的映射关系)-->结婚证
Map集合遍历的第二种方式:使用Entry对象遍历
Map集合中的方法:
Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的 Set 视图。
实现步骤:
1.使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
2.遍历Set集合,获取每一个Entry对象
3.使用Entry对象中的方法getKey()和getValue()获取键与值
java.util.LinkedHashMap<K,V> entends HashMap<K,V>
Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。(有序的)
底层原理:
哈希表+链表(记录元素的顺序)
Hashtable<K,V>集合
java.util.Hashtable<K,V>集合 implements Map<K,V>接口
Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快
HashMap集合(之前学的所有的集合):可以存储null值,null键
Hashtable集合,不能存储null值,null键
Hashtable和Vector集合一样,在jdk1.2版本之后被更先进的集合(HashMap,ArrayList)取代了
Hashtable的子类Properties依然活跃在历史舞台
Properties集合是一个唯一和IO流相结合的集合
|
|