一、Collecion集合体系
Collecion接口
--List接口:有索引、有序、可以重复
ArrayList类:数组结构、查询快增删慢
LinkedList类:链表结构、查询慢增删快
--Set接口:无索引、无序、不可重复
HashSet类:哈希表(数组+链表+红黑树)、可以对元素去重(原理:
重写hashCode和equals方法)
LinkedHashSet类:哈希表(数组+链表+红黑树)+双向链表、
包装存取顺序、可以去重(原理:重写hashCode和equals方法)
TreeSet类:红黑树结构、对元素排序
排序方式1:让元素类实现Comparable接口,重写compareTo方法
排序方式2:给TreeSet集合传递Comparator比较器,重写compare方法
【注意:如果同时存在,优先使用比较器】
常用方法:
public boolean add(E e)
添加元素到集合末尾
public boolean remove(Object e)
删除元素
public void clear()
清空集合
public boolean contains(Object e)
判断集合是否包含某一个元素
public boolean isEmpty()
判断集合是否为空
public int size()
获取集合的长度(元素的个数)
public Object[] toArray()
把集合转换为数组
集合的通用遍历方式:
1)迭代器遍历
Iteartor<元素类型> it = 集合.iterator();
while(it.hasNext()){
元素类型 变量 = it.next();
}
2)增强for遍历
for(元素类型 变量名: 集合/数组){
}
3)forEach遍历
集合.forEach(s->System.out.println(s));
二、常见数据结构特点
栈结构:先进后出(子弹夹)
队列结构:先进先出(排队买票)
数组结构:查询快增删慢
链表结构:查询慢增删快
二叉树:一个节点最多只有两个子节点
二叉查找树:
一个节点最多只有两个子节点,每一个节点左子节点都比自己小,右子节点都比自己大
二叉平衡树
一个节点最多只有两个子节点,每一个节点左子节点都比自己小,右子节点都比自己大
对于任意一个节点,左右两个子树的高度差不超过1
红黑树:有自己的平衡规则
1)对于任意一个节点,要么是红色,要么是黑色
2)根节点是黑色
3)如果一个节点没有子节点或者父节点,这个节点则指向Nil,Nil称之为叶子节点,
叶子节点是黑色的
4)任意一个节点如果是红色,它的子节点必须是黑色(不能两个红色节点相连)
5)任意一个节点到其叶子节点的简单路径上,包含相同数目的黑色节点
三、List系列集合
区别:List系列集合相比于Collection来说,多了一些针对索引操作的方法
常用方法:
public void add(int index, E e)
在指定的索引为位置添加元素
public E remove(int index)
在指定的索引位置删除元素,把被删除的元素返回
public E set(int index, E e)
在指定的索引位置修改元素,把旧的元素返回
public E get(int index)
在指定的索引位置获取元素
List接口的实现类有ArrayList、LinkedList,这两种集合的用法是一样的,
只是底层原理不一样。
四、Set系列集合
和List集合的区别:主要就是没有索引、无序、不重复
它没有特有方法,它的全都来自Collection集合
HashSet、LinkedHashSet和TreeSet集合的用法都是一样的,只是底层原理不一样。
五、泛型
概述:泛型表示一种不确定的数据类型,用<字母>定义。可以用来类上、方法上、接口上
1.泛型类
//<T>表示类中不确定的数据类型
public class 类名<T>{
}
//类上的泛型在创建类的对象时确定
类名<String> 变量名 = new 类名<>();
2.泛型方法
//<T>表示方法中有不确定的数据类型
public <T> void 方法名(T t){
}
//方法上的泛型什么时候确定?调用的时候确定
方法名("hello");
方法名(100);
3.泛型接口
//<T>表示接口中不确定的数据类型
public interface 接口名<T>{
public void test(T t);
}
//接口上的泛型在实现类中确定
public class 实现类 implements 接口名<String>{
public void test(String t){
...
}
}
4.泛型通配符:限定泛型数据类型的泛型
<?> 表示可以匹配所有数据类型
<? extends 具体类型> 表示指定类型或者指定类型的子类
<? super 具体类型> 表示指定类型或者指定类型的父类
【注意:一般我们不直接定义泛型,而是使用API中已有的类、方法、接口时,
会确定泛型的具体类型就行】
六、可变参数
概述:让方法的参数可以接收多个的技术
//本质:就是一个数组,在方法中把可变参数当做数组用即可。
public static void 方法名(参数类型... 参数名){
}
七、Collections工具类
Collection和Collections区别
Collection: 单列集合的接口,一般表示所有的单列集合
Collections:操作单列集合的工具类
public static <T> void addAll(Collection<? super T> c, T... arr)
可以往任意的Collection集合中,添加多个T类型的元素
public static void shuffle(List<?> list)
对List集合打乱顺序
public static void sort(List<?> list)
对List集合排序
public static void sort(List<?> list, Comparator<?> c)
按照指定的比较器对集合中的元素排序
八、Map集合
概述:Map指的是双列集合,每一个元素是一对一对的,称之为【键值对】
1.Map集合的体系结构
Map接口:定义了所有双列集合共性的方法
HashMap类特点:键无序、不可重复、没有索引
LinkedHashMap类特点:键有序、不可重复、没有索引
TreeMap类特点:键可以排序、不可重复、没有索引
2.Map集合的常用方法
public V put(K key, V v)
添加键值对到集合,如果键重复,会用新的值覆盖旧的值,并且返回旧值
public V remove(K key)
根据键删除键值对,把被删除的值返回
public V get(K key)
根据键获取值
public boolean containsKey(K key)
判断Map集合中是否包含键
public int size()
获取键值对的个数
3.Map集合的遍历方式(三种)
HashMap<String,String> map = new HashMap<>();
map.put("新疆", "葡萄干");
map.put("安徽", "法式鹅肝");
map.put("云南", "野生菌");
//1.先找键,再找值
Set<String> keys = map.keySet();
for(String key: keys){
String value = map.get(key);
System.out.println(key+"="+value);
}
//2.直接获取【键值对对象】,键值对对象用Map.Entry表示
Set<Map.Entry<String,String>> entrys = map.entrySet();
for(Map.Entry<String,String> entry: entrys){
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value);
}
//3.forEach方法
map.forEach((key, value)->{
System.out.println(key+"="+value);
});