我的JAVA学习(4)——容器总结、思维导图

一、泛型

1.1泛型基本概念
即数据类型的参数化,处理的数据类型不是固定的,而是可以作为参数传入。设置泛型后,在调用泛型时必须传入实际类型。这种参数类型可以用在类、接口和方法中,分别被称为泛型类泛型接口泛型方法
1.2泛型类
是把泛型定义在类上,用户使用该类的时候,才把类型明确下来。泛型类的具体使用方法是在类的名称后添加一个或多个类型参数声明,如:、<T,K,V>。
语法结构:
public class 类名<泛型表示符号> {
}
1.3泛型接口
泛型接口和泛型类的声明方式一致。泛型接口的具体类型需要在实现类中进行声明
语法结构:
public interface 接口名<泛型表示符号> {
}
1.4泛型方法
泛型方法是指将方法的参数类型定义成泛型,以便在调用时接收不同类型的参数。类型参数可以有多个,用逗号隔开,如:<K,V>。定义时,类型参数一般放到返回值前面。
调用泛型方法时,不需要像泛型类那样告诉编译器是什么类型,编译器可以自动推断出类型来。
语法结构:
public <泛型表示符号> void getName(泛型表示符号 name){
}
public <泛型表示符号> 泛型表示符号 getName(泛型表示符号 name){
}
此外,静态方法无法访问类上定义的泛型;如果静态方法操作的引用数据类型不确定的时候,必须要将泛型定义在方法上。
1.5无界通配符
“?”表示类型通配符,用于代替具体的类型。它只能在“<>”中使用。可以解决当具体类型不确定的问题。
上限限定:<? extends 类名>
表示通配符的类型是 T 类以及 T 类的子类或者 T 接口以及 T 接口的子接口。
下限限定:<? super 类名>
下限限定表示通配符的类型是 T 类以及 T 类的父类或者 T 接口以及 T 接口的父接口。
1.6泛型小结
泛型主要用于编译阶段,编译后生成的字节码 class 文件不包含泛型中的类型信息。 类型参数在编译后会被替换成 Object,运行时虚拟机并不知道泛型。此外需要注意:
1.基本类型不能用于泛型。
2.不能通过类型参数创建对象。

二、容器

用来容纳和管理数据
2.1Collection接口
其中 List、Set 是 Collection 的子接口

常用抽象方法:
boolean add(Object element) :增加元素到容器中
boolean remove(Object element) :从容器中移除元素
boolean contains(Object element) :容器中是否包含该元素
int size() : 容器中元素的数量
boolean isEmpty() :容器是否为空
void clear() :清空容器中所有元素
Iterator iterator() :获得迭代器,用于遍历所有元素
boolean containsAll(Collection c) :本容器是否包含 c 容器中的所有元素
boolean addAll(Collection c) :将容器 c 中所有元素增加到本容器
boolean removeAll(Collection c) :移除本容器和容器 c 中都包含的元素
boolean retainAll(Collection c) :取本容器和容器 c 中都包含的元素,移除非交集元素
Object[] toArray() :转化成 Object 数组

2.1.1List接口
特点:有序、可重复

常用方法(除了Collection接口的方法):
void add (int index, Object element): 在指定位置插入元素,以前元素全部后移一位
Object set (int index,Object element): 修改指定位置的元素
Object get (int index): 返回指定位置的元素
Object remove (int index): 删除指定位置的元素,后面元素全部前移一位
int indexOf (Object o): 返回第一个匹配元素的索引,如果没有该元素,返回-1.
int lastIndexOf (Object o): 返回最后一个匹配元素的索引,如果没有该元
素,返回-1

实现类:
(1)ArrayList类:底层是用数组实现的存储。 特点:查询效率高,增删效率低,线程不安全。
(2)Vector类:底层是用数组实现的,相关的方法都加了同步检查,因此“线程安全,效率低”。
(3)LinkedList 容器类:底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。

LinkedList 的使用(非 List 标准):
void addFirst(E e): 将指定元素插入到开头
void addLast(E e): 将指定元素插入到结尾
getFirst(): 返回此列表的第一个元素
getLast(): 返回此列表的最后一个元素
removeFirst(): 移除此列表中的第一个元素,并返回这个元素
removeLast(): 移除此列表中的最后一个元素,并返回这个元素
E pop(): 从此列表所表示的堆栈处弹出一个元素,等效于 removeFirst()
void push(E e): 将元素推入此列表所表示的堆栈 这个等效于 addFisrt(E e)
boolean isEmpty(): 判断列表是否包含元素,如果不包含元素则返回 true

2.1.2Set接口
Set 接口中没有新增方法,方法和 Collection 保持完全一致。特点:无序、不可重复。常用的实现类有:HashSet、TreeSet等。

HashSet类:是一个没有重复元素的集合,不保证元素的顺序。而且 HashSet 允许有 null 元素。HashSet 是采用哈希算法实现,底层实际是用 HashMap 实现的(HashSet 本质就是一个简化版的 HashMap),因此,查询效率和增删效率都比较高。
HashSet 是一个不保证元素的顺序且没有重复元素的集合,是线程不安全的。

TreeSet类:TreeSet 是一个可以对元素进行排序的容器。底层实际是用 TreeMap 实现的,内部维持了一个简化版的 TreeMap,通过 key 来存储 Set 的元素。 TreeSet 内部需要对存储的元素进行排序,因此,我们需要给定排序规则。
排序规则实现方式:
1.通过元素自身实现比较规则。
2.通过比较器指定比较规则。

2.2Map接口
Map 接口定义了双例集合的存储特征,它并不是 Collection 接口的子接口。双例集合的存储特征是以 key 与 value 结构为单位进行存储。体现的是数学中的函数 y=f(x)感念。

常用方法:
V put (K key,V value): 把 key 与 value 添加到 Map 集合中
void putAll(Map m): 从指定 Map 中将所有映射关系复制到此 Map 中
V remove (Object key): 删除 key 对应的 value V get(Object key) 根据指定的 key,获取对应的 value
boolean containsKey(Object key): 判断容器中是否包含指定的 key
boolean containsValue(Object value): 判断容器中是否包含指定的 value
Set keySet(): 获取 Map 集合中所有的 key,存储到 Set 集合中
Set<Map.Entry<K,V>> entrySet(): 返回一个 Set 基于 Map.Entry 类型包含 Map 中所有映射。
void clear(): 删除 Map 中所有的映射

实现类:HashMap类、TreeMap类

2.2.1HashMap类
采用哈希算法实现,是 Map 接口最常用的实现类。 由于底层采用了哈希表存储数据,所以要求键不能重复,如果发生重复,新的值会替换旧的值。 HashMap 在查找、删除、修改方面都有非常高的效率。

2.2.2TreeMap类
TreeMap 和 HashMap 同样实现了 Map 接口,所以,对于 API 的用法来说是没有区别的。HashMap 效率高于 TreeMap;TreeMap 是可以对键进行排序的一种容器,在需要对键排序时可选用 TreeMap。TreeMap 底层是基于红黑树实现的。
在使用 TreeMap 时需要给定排序规则:
1、元素自身实现比较规则
2、通过比较器实现比较规则

2.3小结(思维导图)
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值