集合存储的类型:
集合可以存储引用数据类型,不可以存储基本数据类型。若要存储基本数据类型,实际是存储基本数据类型的包装类;
结构:
集合类体系结构
-
单列 collection(接口):
-
可重复 List(接口):
-
ArrayList(实现类)
-
LinkdeList(实现类)
-
-
不可重复 Set(接口):
-
HashSet(实现类)
-
TreeSet(实现类)
-
-
-
双列 Map(接口):
-
HashMap(实现类)
-
TreeMap(实现类)
-
collection(接口)中的方法
——>创建对象:接口对象指向实现类的实例
成员方法:
-
boolean add(E e) 添加元素
-
boolean remove(object o) 从集合中移除指定的元素
-
boolean removeif(object o) 根据条件进行删除
-
void clear() 清空集合
-
boolean contains(object o) 判断集合中是否存在指定的元素
-
boolean isEmpty() 判断集合是否为空
-
int size() 集合的长度,也就是集合中元素的个数
迭代器:i terator(集合的专用遍历方式)
-
获取迭代器对象:
iterator<E> iterator():放回集合中的迭代器对象,该迭代器默认指向当前集合的0索引;
-
方法:
-
Boolean hasNext(): 判断当前位置是否有元素可以被取出
-
E next():取出 当前位置的元素,将迭代器对象向下一个索引位置;
-
default void remove():从底层集合中删除此迭代器返回的最后一个元素;
-
增强for循环:
增强for:简化数组和collection集合的遍历:
-
原理是一个Iterator迭代器
-
只有实现iterable接口的类才可以使用迭代器和增强for(所有的单列集合都可以使用增强for)
增强for的格式
-
格式:
for(元素数据类型 变量名:数组或者Collection集合){
//在此处使用变量即可,该变量就是元素
}
注意:增强for的使用原理是Iterator;所以在for循环中修改变量的值不会影响到数组或集合,只会影响到第三方变量(iterator中获取到的数据);
-
数据类型一定是集合或者数组中元素的 类型
List集合:
List集合概述:
-
有序集合,这里的有序是指存储顺序
-
用户可以精确控制序列中的没个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素
-
与set集合不同,列表通常允许重复元素
List集合特点
-
有序:存储和取出的元素顺序一致
-
有索引:可以通过索引操作元素
-
可重复:储存的元素可以重复;
List集合中的方法:
-
void add(int index,E element) 在此集合中的指定位置插入指定的元素
-
E remove(int index) 删除指定索引处的元素,返回被删除的元素
-
E set(int index, E element) 修改指定索引处的元素,返回被修改的元素
-
E get(int index) 返回指定索引处的元素
ArrayList集合
ArrayList:底层数据结构是数组,查询块,增删慢;
LinkedList集合
底层数据结构是双向链表链表,增删块,查询慢;
LinkedList集合的特有功能:
方法名 | 说明 |
---|---|
public void addFirst(E e) | 在该列表开头插入指定的元素 |
public void addLast(E e) | 将指定的元素追加到该列表的末尾 |
public E getFirst() | 返回此列表中的第一个元素 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E removeLast() | 从此列表中删除并返回最后一个元素 |
1.Set集合的概述和特点:
Set集合的特点:
-
可以去除重复
-
存取顺序不一致
-
没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里的元素
TreeSet集合概述和特点
-
不包含重复元素的集合
-
没有带索引的方法
-
可以将元素按照规则进行排序
注意:想要使用TreeSet,需要制定排序规则
comparable<T> :参数类型:可以将此对象与之进行比较的对象的类型
方法:public int compareTo(T o):将此对象与指定的对象进行比较以进行排序
原理
-
如果返回值为负数,表示当前存入的元素是比较小值,存左边
-
如果返回值为0,表示当前存入的元素跟集合中的元素重复了,不存
-
如果返回值为正数,表示当前存入的元素是比较大值,存右边;
字符串中的比较:
public int compareTo(String anotherString) 按照字典比较两个字符串
//首先比较第一个字母,如果第一个字母是一样的,那么继续比较后面的字母
//当不一样的时候,就拿着对应的码表值进行比较;
比较器排序Compatator的使用
-
TreeSet的带参构造方法使用的是比较器排序对元素进行排序
-
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1.T o2方法{o1: 现在要存入的那个元素;o2: 现在已经存入集合中那个}
-
重写方法时,一定要注意排序规则必须按照要要求的主要条件和次要条件来写
两种比较方式小结:
-
自然排序:自定义类是实现Comparable接口,重写compareTo方法,根据放回值进行排序
-
比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compara方法,根据放回值进行排序
TreeSet的原理:红黑树
-
二叉树
-
二叉查找树(二叉排序树或二叉搜索树):
-
每个节点上最多有两个子节点
-
每个节点的左节点都时小于自己的
-
每个节点的右节点都是大于自己的
-
-
平衡二叉树:左右子节点树高之差不会超过1{通过左旋或右旋保证平衡}
-
左旋:
-
右旋:
-
-
红黑树:平衡二叉b树:通过红黑规则平衡:
HashSet集合特点:
-
底层数据结构时哈希表
-
存取顺序不完全一致
-
没有带索引的方法
-
由于是Set集合,所以元素唯一
在object类中可以获取对象的哈希值
-
public int hashCode() : 根据对象的地址值计算出来的哈希值
对象的哈希值特点
-
如果没有重写hashCode方法,那么是根据对象的地址值计算出哈希值
-
如果重写了hashCode方法,一般都是通过对象的属性值计算出哈希值
注意:如果hashSet要存储自定义对象,必须要重写hashCode()方法和equeals()方法
2.Map集合概述
-
Interface Map<K,V> k:键的数据类型;V:值的数据类型
-
键不能重复,值可以重复
-
键和值是一一对应的,每一个键只能找到自己对应的值
-
(键+值)这个整体 我们称之为"键值对"或者"键值对对象",在java 中叫做”entry对象“
创建Map集合的对象
-
多态的方法
-
具体的实现类HashMap
Map集合常用的方法:
方法名 | 说明 |
---|---|
V put(K key,V value) | 添加元素 |
V remove(Object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(Object key) | 判断集合是否包含指定的键 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长队,也就是集合中键值对的个数 |
注意点:
-
put方法:如果要添加的键不存在,那么会把键值对都会添加到集合中
-
如果要添加的键是存在的,那么会覆盖原先的值,把原先的值当做返回值进行返回;
Map集合的获取功能一
方法名 | 说明 |
---|---|
Set <k> Keyset() | 获取所有键的集合 |
V get(Object key) | 根据键获取值 |
Map集合的获取功能二
方法名 | 说明 |
---|---|
Set<Map.Entry<K,V>>entrySet() | 获取所有键值对对象的集合 |
K getKey() | 获取键 |
V getValue() | 获取值 |
Map集合的获取功能二:
foreach(lamda排序)
HashMap小结
-
HashMap底层是哈希表结构的
-
依赖hashCode方法和equals方法保证键的唯一
-
如果键要储存的是自定义对象,需要重写hashCode和equals方法
TreeMap小结:
-
TreeMap底层是红黑树结构
-
依赖自然排序或者比较器排序,对键进行排序
-
如果键存储的是自定义对象,需要实现Comparable接口或者在创建TreeMap对象的时候给出比较器排序规则
可变参数:
可变参数:就是形参的个数是可以变化的
-
格式:修饰符 返回值类型 方法名(数据类型…变量名){}
-
范例:public static int sum(int...a){}
注意:
-
这里的可变参数其实是一个数组
-
如果一个方法有多个参数,包含可变参数,可变参数要放在最后
创建不可变集合:
方法名 | 说明 |
---|---|
static<E> List<E> of(E...elements) | 创建一个具有指定元素的List集合对象 |
static<E> Set<E> of(E...elements) | 创建一个具有指定元素的Set集合对象 |
Static<K,V> Map<K,V> of(E...elements) | 创建一个具有指定元素的Map集合对象 |
-
在List、Set、Map接口中,都存在of方法,可以创建一个不可变的集合
-
这个集合不
-
但是可以结合集合的带参构造,实现集合的批量 添加
常见的数据结构
-
栈:先进后出
-
队列:先进先出
-
数组:添加块,增删慢的模型
-
链表:增删快,查询慢{}
栈:
泛型:
好处:
-
把运行时期的问题提前到了编译期间
-
避免了强制类型转换
泛型可以使用的地方:
-
类后面——>泛型类
-
方法声明上——>泛型方法
-
接口后面——>泛型接口
泛型的定义格式:
-
<泛型>:指定一种类型的格式。
-
<类型1,类型2……>:定义多种类型的格式,多种类型之间用逗号隔开。
java中的泛型类:
定义:public class Person<T>{};
泛型的本质就是将现在代码中所有的特定类型转换成类型占位符;
Java中的泛型方法:
toArray(T[] a):以正确的顺序返回一个包含此列表中所有元素的数组;
自定义方法:
定义格式:
格式:修饰符<类型>返回值类型方法名(类型 变量名){}
范例:public <T> void show(T t){}
注意:与泛型类不同,泛型类是在创建对象的时候有具体的类型的,而泛型方法是在调用的时候才有具体的类型的;
泛型接口:
泛型接口的使用方式:
-
实现类也不给泛型(也定义为接口)
-
实现类确定具体的数据类型
类型通配符
-
类型通配符:<?>
-
ArrayList<?>:表示元素的类型未知的ArraylList,它的元素可以匹配任何的类型
-
但是并不能把元素添加到ArrayList中了,获取出来的也是父类类型
-
类型通配符上限:<?extends类型>
-
比如:ArrayList<?extends Number>:它表示的类型是Number或其子类型
-
类型同配符下限:<?super 类型》