集合可以说是java中最常用类,学好集合对后续学习java事半功倍。
集合分为 单列集合(顶级接口Collection)和双列集合(顶级接口Map);
Collection没有具体的实现,有List和 Set两个子接口
List特点:
List主要的实现类有ArrayList、LinkedList和Vector(了解)
ArrayList集合 底层是数组结构实现,查询快、增删慢 LinkedList集合 底层是链表结构实现,查询慢、增删快
List三种遍历方式(以ArrayList举例)
先插入元素
List<T> list= new ArrayList<>();
list.add(t1);
list.add(t2);
list.add(t3);
迭代器遍历
Iterator<T> iterator = list.iterator();
while(iterator.hasNext()){
T t = iterator.next();
}
普通for循环(因为List有索引所以可以使用get(索引)来获取元素)
for (int i = 0; i < list.size(); i++) {
T t=list.get(i);
}
增强for循环(底层原理还是迭代器)
for (T t : list) {
//t就是我们 每次遍历到的元素;
}Set特点
Set 的主要的实现类有HashSet、LinkedHashSet、TreeSet
底层数据结构是哈希表,对集合的迭代顺序不作任何保证,不保证存储和取出的元素顺序一致,没有带索引的方法,不包含重复元素的集合
哈希表和链表实现的Set接口,具有可预测的迭代次序,由链表保证元素有序,没有重复的元素
底层是红黑树,元素有序,不包含重复元素的集合
Set集合的两种遍历方式(以hashSet举例)
添加元素
Set<T> set= new HashSet<>();
set.add(t1);
set.add(t2);
set.add(t3);
迭代器遍历
Iterator<T> iterator = set.iterator();
while(iterator.hasNext()){
T t = iterator.next();
}
增强for循环
for(T t:set){
//t就是我们遍历到的每一个元素
}
Map集合的特点 键值对映射关系 一个键对应一个值 键不能重复,值可以重复 元素存取无序
Map我们常用的实现类是HashMap
Map的两种遍历方式
插入元素
Map<K,V> map= new HashMap<>();
map.put(k1,v1);
map.put(k2,v2);
map.put(k3,v3);
通过键找值方式(遍历set使用增强for)
Set<K> keys=map.getKeys();
for(K k:keys){
V v= map.get(k);
//k是我们遍历到的每个键,v是我们通过map.get(K)找到的值
}
通过键值对集合遍历
Set<Map.Entry<K,V>> entries= map.getEntrySet();
for(Map.Entry<K,V> entry: entries){
K k= entry.getKey();
V v= entry.getValue();
//entry是我们每一个键值对组合,通过getKey找到k,getValue()得到v;
}
以上是我们集合中最重要的 知识;
最后再说一下泛型
泛型概述 是JDK5中引入的特性,它提供了编译时类型安全检测机制,该机制允许在编译时检测到非法的类型 它的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,然后在使用/调用时传入具体的类型。这种参数类型可以用在类、方法和接口中,分别被称为泛型类、泛型方法、泛型接口 泛型定义格式
<类型>:指定一种类型的格式。这里的类型可以看成是形参 <类型1,类型2…>:指定多种类型的格式,多种类型之间用逗号隔开。这里的类型可以看成是形参 将来具体调用时候给定的类型可以看成是实参,并且实参的类型只能是引用数据类型
泛型的好处
把运行时期的问题提前到了编译期间 避免了强制类型转换
|
|