Java 泛型与集合知识点总结
Java 泛型与集合知识点总结
泛型
泛型的应用
在编译时通过一个标识表示类中某个 属性/方法/参数 的类型
编译时,检查添加元素的类型,提高安全性
减少类型转换的次数,提高效率
泛型的语法
1.泛型的声明
泛型类
class 类名<K, V> {}
interface 接口<T> {}
泛型方法
-
泛型方法可以定义于普通类或泛型类(区别方法使用泛型)
public static <T> T getMiddle(T... a) { }
2.泛型的使用
实例化
在类名后面指定类型参数的值(类型):
List<String> strList = new ArrayList<String> ();
调用泛型方法
调用泛型方法时,可以把<具体类型> 放在方法名**前面**:
类.<string>getMiddle()
泛型使用细节
参数类型只能是引用类型,不能是基本类型
不能创建参数化类型的数组
在给泛型指定具体类型后,可以传入该类型或者其子类类型
没有指定类型是,默认泛型是 Object
静态方法不能使用类的泛型
静态和类相关,类加载时,对象还没创建,如果静态方法使用了类的泛型,JVM 就无法完成初始化
泛型不具备继承性
List<Object> list = new ArrayList<String>(); error
通配符
<?> : 表示支持任意泛型
<? extends A>: 支持A 类及A 类的子类,规定了泛型的上限
<? super A>: 支持A 类及A 类的父类,不限于直接父类,规定了泛型的下限
Todo(待补充)
类型擦除(伪泛型)
集合
集合框架体系
迭代器 Iterator
next(), hasNext(), remove()
可以认为Java迭代器位于两元素之间
当调用next 时,迭代器越过下一个元素,并返回越过的元素的引用,remove方法则删除上一次调用next返回的元素
Collection 接口
有些Collection的实现类可以存放重复元素,有些不可以
Collection的实现接口 List 是有序的, Set 是无序的
Collection 没有直接的实现子类,是通过它的子接口List 和 Set 来实现的
Collection接口的元素遍历方式
1.使用迭代器Iterator
2.增强for循环(简化版的iterator)
List 接口
List集合类中元素有序,且可重复
List集合支持索引
常用方法
void add(int i, E element)
void addAll(int i, Collection<? extends E> elements)
E remove(int i) //删除指定位置元素并返回该元素
E get(int i)
E set(int i, E element)
int indexOf(Object element)
int lastIndexOf(Object element)
List 接口的元素的遍历方式
1.iterator迭代器
2.增强for
3.普通for + 索引
List 实现类 ArrayList
底层维护的是一个动态的数组
线程不安全的, Vector与其基本等同,除了Vector是线程安全的
创建和扩容流程 Debug
调用无参构造器时,车市elementData容量为零,第一次添加元素时扩容为10, 若再次扩容,则扩容1.5倍
调用有参构造器时指定容量,则出书elementData容量为所指定的大小,若再次扩容,也是扩容1.5倍
List 实现类 LinkedList
底层维护了一个双向链表
LinkedList中维护了两个属性first, last分别指向 首节点和尾节点
添加和删除效率高
Set 接口
Set集合类中元素无序,且不允许重复,最多只能有一个null
Set集合类不能通过索引获取
Set 接口的元素遍历方式
iterator 迭代器
增强for
Set接口实现类 HashSet
底层是 HashMap(value 值都为空)
不保证顺序,更具hashcode确定索引
不能有重复元素,且只能有一个null
Set接口实现类 LinkedHashSet
是HashSet子类
底层是LinkedHashMap,维护了一个数组 + 双向链表
根据hashCode确定元素的存储位置,同时使用链表维护元素的次序
Queue 接口
双端队列Deque接口
ArrayDeque和LinkedList类实现了Deque接口
常用方法
入队,将给定元素添加到队列的队尾,如果成功就返回true,若队列已满,add会抛出异常,offer会返回false
出队,若队列不为空,删除并返回队列头的元素,若空队列,remove抛出异常,poll返回null
返回队列头元素但不删除,若空队列,第一个抛出异常,第二个方法返回null
element()
peek()
remove()
poll()
add()
offer()
Map 接口
Map 与Collection 并列存在,用于保存具有映射关系的元素
key 和 value 可以是任意引用类型的数据
key不允许重复,value可以重复
key和value都可以为null,但key中只能有一个null
常用String类作为key
Map 接口元素的遍历方式
增强for
迭代器
增强for
迭代器
增强for
迭代器
map.keySet() -> 返回所有的key,再通过map.get(key)获取value
取出所有的values map.values()
通过EntrySet获取 k-v (Map.Entry<K, V>) ==》 Set set = map.entrySet()
Map.Entry 提供的 getKey() 和 getValue()
Map接口的实现类 HashMap
底层维护的是 数组 + 链表 + 红黑树
线程不安全
若添加相同的Key,会覆盖原来的Value
底层机制 Debug
1.HashMap底层维护了Node类型的数组table,默认为null
2.创建对象是,加载因子初始化为0.75
3.添加Key-Value时,通过Key的哈希值得到在table的索引,判断该索引处是否有元素,若无,直接添加;若有,比较两个Key是否相等,若相等,替换value;若不相等还需要判断是树结构还是链表结构,做出相应处理。如果添加时发现容量不足,需要扩容。
4.第一次添加时table数组初始化容量为16,临界值时12(16*0.75),大于等于临界值时扩容
5.以后在次扩容时table扩容为初始的两倍,临界值也发生改变
6.Java8中,如果一条链表元素超过TREEIFY_THRESHOLD(默认8),并且数组table大于等于MIN_TREEIFY_CAPACITY(默认64)时,将树华为红黑树,如果数组大小不满足,则数组扩容
Map接口的实现类 HashTable
线程安全的
Key和Value都不能为null
Map接口的实现类 Properties
继承自HashTable
用于读取.properties配置文件
Collections 工具类
用于操作Set、List、Map等集合的工具类
提供一系列静态方法对集合中元素进行排序、查询和修改等操作