目录
文章目录
泛型
- 即参数化类型,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
- 把类型明确的工作推迟到创建对象或调用方法时才去明确的特殊类型。
List<E> //<E>就是泛型,常和集合对象一起使用
泛型(Generics)是JDK 1.5 的一个新特性,是为了给编译器提供更好的可读性。
- 通过泛型的语法定义,约束集合元素的类型,进行安全检查,把错误显示在编译期。
- 编译通过后就被删除,不会出现在JVM中。
泛型声明
泛型可以在接口、方法、返回值上使用
//泛型接口、类
public interface Colle<E>{
//泛型方法
public <E> void method(E e);
//在方法返回值前声明了一个<E> 表示后面出现的E是泛型,而不是普通的java变量
}
常用名称
- E – Element :在集合中使用
- T – Type:java类
- K – Key:键
- V – Value:值
- N – Number:数值类型
- ? – 表示不确定的java类型
private static void method() {
Integer [] a = {1,2,3,4,5};
print(a);
Double[] b = {1.0,2.0,3.0,4.0,5.0,6.0};
print(b);
}
//T[] :传入Integer时代表Integer;传入Double时代表Double。
public static <T> void print(T[] arr) {//<T> 也可以是具体类型,来约束
System.out.println(Arrays.toString(arr));
}
集合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-21jTIKYL-1609346490478)(D:\0000note\1基础note\img\集合.png)]
Collection类
概述
是用来存放对象的结构,其长度可变,且可以存放不同类型的对象。
(数组缺点:长度固定不变,访问方式单一,插入、删除等操作繁琐)
集合的继承结构
Collection 接口
--List接口:数据有序,可以重复。
--ArrayList子类
--LinkedList子类
--Set接口:数据无序,不可重复
--HashSet子类
--Map接口:键值对存数据
--HashMap子类
Collections工具类
常用方法
方法 | 用处 |
---|---|
add(E e) | 向集合添加元素 |
addAll(Collection c) | 添加指定集合所有元素 |
clear() | 删除所有元素 |
contains(Object o) | 若集合包含o,则返回true |
containsAll(Collection<?> c) | 若集合包含c中所有元素,返回true |
isEmpty() | 若集合没有元素,返回true |
remove(Object o) | 从集合中删除第一个o |
removeAll(Collection c) | 删除集合中包含所有c的元素 |
retainAll(Collection c) | 仅保留集合中包含在指定集合中的元素 |
size() | 返回此集合中的元素数 |
toArray(T[] a) | 返回包含此集合中所有元素的数组 |
iterator() | 返回集合中的迭代器 |
Iterator < E >方法
//迭代器
Iterator<Integer> it = c.iterator();
while(it.hasNext()) {//有更多元素返回true
ystem.out.println(it.next());//返回迭代器中下一个元素。
}
List接口
概述
有序的Collection,此接口可以精确地控制元素,用户可以根据元素的索引访问元素。
- 数据有序
- 允许存放重复元素,允许存多个null
- 元素都有索引
常用方法
方法 | 用处 |
---|---|
add(int i, E e) | 在列表中指定位置插入元素 |
addAll(int i, Collection c) | 将c集合的所有元素从指定位置开始插入(注意索引越界) |
subList(int formIndex, int toIndex) | 返回一个List:formIndex(包括)到toIndex(不包括) |
get(int i) | 返回列表中指定位置的元素 |
indexOf(Object o) | 返回列表中第一次出现指定元素的索引,不包含返回-1 |
ListIterator< E > listIterator() | 返回此列表元素的列表迭代器(按适当顺序)。 |
ListIteratror< E> listIterator(int i) | 从列表的指定位置开始,返回此列表元素的列表迭代器(按适当顺序)。 |
ArrayList
概述
- 底层用数组存放数据,每个对象都有下标。
- 内部数组默认初始容量是10,超出会以1.5倍扩容。
- 在动态数组中,要在某一个位置添加或者删除一个元素,剩下的每个元素都要相应地往前或往后移动,效率就比较低。
创建对象
ArrayList<Integer> list = new ArrayList<>();
常用方法
private static void method() {
ArrayList<Double> list = new ArrayList<>();
list.add(2.1);
list.add(2.1);
list.add(2.1);
System.out.println(list); //打印集合
System.out.println(list.size()); //获取集合长度
System.out.println(list.get(1)); //根据下标获取元素
System.out.println(list.remove(1)); //根据下标删除元素
//遍历
for (int i = 0;i<list.size();i++){
System.out.println(list.get(i));
}
//迭代器遍历
Iterator<Double> it=list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
}
LinkedList
概述
- 底层是双向链表实现的,默认初始为空。
- 链表是可以占用一段不连续的内存空间的
- 双向链表有前驱节点和后驱节点,里面存储的是上一个元素和后一个元素所在的位置。
- 当我们需要执行插入的任务,比如第一个元素和第二个元素之间,只需要改变他们的前驱节点和后驱节点的指向就可以了。
- 因为是不连续的内存空间,当需要执行查找,需要从第一个元素开始查找,直到找到我们需要的数据。
与ArrayList相比
-
LinkedList增删效率高,ArrayList查找效率高。
-
LinkedList更加节省内存,而ArrayList则需要预留空间来增加数据。
-
链表遍历慢,因为存储空间不连续。
业务一次赋值,不常改变,顺序遍历,就采用数组;
业务频繁变化,有替换,有删除,则链表更加适合。
创建对象
LinkedList<Integer> list = new LinkedList<>();
常用方法
方法 | 用处 |
---|---|
addFirst(E e)/addLast(E e) | 在列表开头、结尾插入元素 |
contains(Object o) | 包含指定元素,返回true |
get(int i) | 获取指定位置的元素 |
getFirst()/getLast() | 获取第一个、最后一个元素 |
remove() | 检索并删除此列表的头(第一个元素)。 |
removeFirst() | 从此列表删除并返回第一个元素 |
remove(Object o) | 删除指定元素,第一次出现 |
Set接口
概述
- 不包含重复元素。(null也只能有一个)
- 数据无序。(由于数据无序,常用来给数据去重)
常用方法
方法 | 用处 |
---|---|
add(E e) | 添加元素 |
addAll(Collection c) | 添加c的所有元素 |
contains(Object o) | 包含指定元素,返回true |
isEmpty() | 集合没有元素,返回true |
(Iterator< E> )iterator() | 迭代器 |
remove(Object o) | 移除指定元素 |
size() | 返回元素个数 |
toArray() | 返回Object数组 |
HashSet
概述
- 底层是哈希表(散列表)。
- 包装了HashMap相当于向HashSet中存入数据时,会把数据作为K,存入内部的HashMap中。当然K仍然不许重复。
TreeSet
TreeSet:底层是TreeMap,红黑树的形式,便于查找数据。
Map接口
概述
- 也叫哈希表、散列表,常用于存键值对结构的数据。
- 键不能重复,值可以重复。
- 存放的是无序数据,初始容量是16,默认的加载因子是0.75
常用方法
方法 | 用处 |
---|---|
clear() | 从此映射中移除所有映射关系 |
containsKey(Object key) | 若此映射包含指定键的映射关系,返回true |
containsValue(Object value) | 若此映射将一个或多个键映射到指定值,返回true |
get(Object key) | 返回指定键所映射的值 |
isEmpty() | 若此映射未包含键-值映射关系,返回true |
put(K key,V value) | 将指定的值与此映射中的指定键关联 |
putAll(Map m) | 从指定映射中将所有映射关系复制到此映射中 |
remove(Object key) | 若存在一个键的映射关系,则将其从此映射中删除 |
size() | 返回此映射中的键-值映射关系数 |
keySet() | 返回此映射中包含键的Set视图 |
entrySet() | 返回此映射所包含的映射关系Set视图 |
//遍历
Set set = map.keySet(); //把key放入set集合
Iterator it = set.iterator();
while(it.hasNext()) {
String key = (String) it.next();
String val = (String) map.get(key);
System.out.println(key+"="+val);
}
//遍历方式2
Set set2 = map.entrySet(); //把 Entry<K,V>对象放入Set集合
Iterator it2 = set2.iterator();
while(it2.hasNext()) {
Entry en = (Entry) it2.next();
String key = (String) en.getKey();
String value = (String) en.getValue();
System.out.println(key+"=="+value);
}
HashMap
概述
- 底层是一个Entry数组,当存放数据时会根据hash算法计算数据的存放位置。(hash(key)%n,n是数组长度)
- 当计算的位置没有数据时,直接存放;有数据则用链表处理
- 在对应的数组位置存放表的头结点。
- 对链表而言,新加入的节点会从头结点加入。