目录
集合:(集合会自动扩容)
Collection(单列)
List(可重复):ArrayList,LinkedList
Set(不可重复):HashSet,TreeSet
Map(双列)
HashMap,TreeMatp
Collection,List,Set,Map:是接口
ArrayList,LinkedList,HashSet,TreeSet,HashMap,TreeMatp:是实现类
小结:
1,数组的长度是不可变的,集合的长度是可变的。
2,数组可以存储基本数据类型和引用数据类型
集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类。
Collection集合概述和使用
Collection集合概述:
Collection是单列集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
JDK不提供此接口的任何直接实现,它提供更具体的子接口(Set和List)实现
船舰Collection集合的对象
多态的方式
具体的实现类ArrayList
Collection集合常用方法
方法名 | 说明 |
boolean add(E e); | 添加元素 |
boolean remove(Object o); | 从集合中移除指定的元素 |
boolean removeif(Object o); | 根据条件进行删除 |
void clear(); | 清空集合 |
boolean contains(Object o); | 判断集合中是否存在指定的元素 |
boolean isEmpty(); | 判断集合是否为空 |
int size(); | 集合的长度,也就是集合中元素的个数 |
boolean removeif(Object 0 ) 根据条件进行删除
removeif底层会遍历集合,得到集合中的每一个元素
s依次表示集合中的每一个元素
就会把者每一个元素都到lambda表达式中判断一下
如果返回是true,则删除
如果返回是false,则保留不删除
Collection<String> collection = new ArrayList<>();
collection.removeIf(
(String s)->{
return s.length() == 3;
}
);
Collection集合的遍历
Iterator :迭代器,集合的专用遍历方式
Iterator<E> iterator(); 返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引。
Iterator中的常用方法
Iterator<E> iterator();创建迭代器对象,默认指向当前集合的0索引
boolean hasNext();判断当前位置是否有元素可以被取出
E next();获取当前位置的元素
将迭代器对象移向下一个索引位置
增强for循环
增强for:简化数组和collection集合的遍历
它是JDK5以后出现的,其内部原理是一个Iterator迭代器
实现Iterable接口的类才可以使用迭代器和增强for
增强for的格式:
for(元素数据类型 变量名:数组或者collection集合){
//在此处使用变量即可,该变量就是元素
}
ArrayList<String> list = new ArrayList<>();
for(String s:list){
System.out.pringln(s);
}
//1,数据类型一定是集合或者数组中的元素类型
//2,s仅仅是一个变量名而已,在循环的过程中,依次表示集合或则数组中的每一个元素
//3,list就是要遍历的集合或者数组
三种循环的使用场景
如果需要操作索引,使用普通for循环
如果在遍历过程中需要删除元素,使用迭代器
如果仅仅是遍历,那么使用增强for
list集合概述和特点
List集合概述
有序集合,这里的有序指的是存取顺序
用户可以精确控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
List集合特点
有序:存储和取出的元素顺序一致
有索引:可以通过索引操作元素
可重复:存储的元素可以重复
List集合特有方法
方法名 | 说明 |
void add(int index ,E element); | 在此集合中的指定位置插入指定的元素 |
E remove(int index); | 删除指定索引处的元素,返回被删除的元素 |
E set(int index ,E element) | 修改指定索引处的元素,返回被修改的元素 |
E get(int index) ; | 返回指定索引处的元素 |
添加元素后,原来位置上的元素往后挪一个索引
List集合中有两个remove方法:
第一个:删除指定的元素,返回值表示当前元素是否删除成功
第二个:删除指定索引的元素,返回值表示实际删除的元素
List集合常用实现类
List集合常用子类
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(); | 从此列表中删除并返回最后一个元素 |
泛型概述
泛型:是JDK5中引入的特性,它提供了编译时类型安全检测机制
泛型的好处:
把运行时期的问题提前到了编译期间
避免了强制类型转换
泛型可以使用的地方:
类后面----->泛型类
方法申名后面--->泛型方法
接口后面----->泛型接口
泛型类的总结
如果一个类的后面有<E> ,表示这个类是一个泛型类
创建泛型类的对象时,必须要给这个泛型确定具体的数据类型
泛型的定义格式:
<类型>:指定一种类型的格式。
尖括号里面可以任意书写,按照变量的定义规则即可,一般只写一个字母。
比如:<E>,<T>,<Q>,<M>
<类型1,类型2....>:指定多种类型的格式,多种类型之间用逗号隔开
比如:<E,T>,<Q,M>,<K,V>
泛型类
泛型类的定义格式:
格式:修饰符class类名<类型>{}
范例:public class Generic<T>{}
泛型方法
泛型方法的定义格式:
格式:修饰符<类型> 返回值类型方法名(类型,变量名){}
范例:public <T> void show(T t){}
泛型接口
泛型接口的使用方式:
实现类也不给泛型
实现类确定具体的数据类型
泛型接口的定义格式:
格式:修饰符 interface 接口名<类型>{}
范例:public interface Generic<T>{}
类型通配符
类型通配符:<?>
ArrayList<?>:表示元素类型未知的ArrayList,它的元素可以匹配任何的类型
但是并不能把元素添加到ArrayList中了,获取出来的也是父类(Object)类型
类型通配符上限:<? extends 类型>
ArrayList <? extends Number>:它表示的类型是Number或者其子类型
类型通配符上限:<? super 类型>
ArrayList<? super Number>:它表示的类型是Number或者其父类型
Set集合概述和特点
set集合特点
可以去除重复
存取顺序不一致
没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除set集合里面的元素。
TreeSet集合概述和特点
TreeSet集合特点
不包含重复元素集合
没有带索引的方法
可以将元素按照规则进行排序(想要使用TreeSet需要制定排序规则)
自然排序Comparable的使用
使用空参构造创建TreeSet集合
自定义的Student类实现Comparable接口
重写里面的compareTo方法
自然排序简单原理
1,如果返回值为负数,表示当前存入的元素是较小值,存左边
2,如果返回值是0,表示当前存入的元素跟集合中元素重复了,不存
3,如果返回值为正数,表示当前存入的元素是较大值,存右边
重写compareTo方法
比较器排序Compartor的使用
TreeSet的带参数构造方法使用的是比较器排序对元素进行排序的
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compar(T O1,T O2)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
两种方法总结:
1,自然排序:自定义实现Comparable接口,重写compareTo方法,根据返回值进行排序
2,比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法根据返回值进行排序
3,在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序
Hashset集合
hash集合特点:
底层数据结构是哈希表
不能保证存储和去除的顺序一致
没有带索引的方法,所以不能使用普通for循环遍历
由于是set集合,所以元素唯一
哈希值:
哈希值:是jdk根据对象的地址或者属性值,算出来的int类型的整数
Object类中有一个方法可以获取对象的哈希值
public int hashCode();根据对象的地址值计算出来的哈希值
我们可以对Object类中的Hashcode方法进行重写,在重写之后,就一般是根据属性值来计算哈希值的。此时跟对象的地址值就没有任何关系
常见数据结构哈希表
哈希表
JDK8之前,底层采用数组+链表实现
数组的长度默认为16,加载因子为0.75,
首先会先获取元素的哈希值,计算出在数字中应存入的索引
判断索引处是否为null
如果时null,直接添加
如果不是null,则于链表中的所有元素通过equals放法比较属性值有一个相同, 就不存,如果都不一样,才会存入集合。
JDK8以后,由数组+链表+红黑树实现
当在下面的元素过多,那么不利于添加,也不利于查询,所以在JDK8以后,
当量表长度超过8的时候,自动转换为红黑树
存储过程:1,计算元素的哈希值
2,计算应存入的索引值
3,判断是否为空
如果为空:直接存,不为空判断结构:链表或者红黑树
set集合小结:
Map集合概述和使用
Map集合是双列集合,一对数据是由键值对组成的,键不能重复,值可以重复
键和值是一一对应的关系,每一个键只能找到自己对应的值
(键+值)这个整体,通常称为键值对或者键值对对象,java中叫做“Entry对象”
Map集合的基本功能
Map集合的获取功能
1,
通过keyset获取键值并存入set集合中,再通过get方法和set集合中的键值获取值。
2, 先通过entrySet方法获取所有键值对对象的集合,再通过getKey(),getValue()获取键值。
HashMap的特点
HashMap是Map里面的一个实现类
直接使用Map里面的方法就可以
HashMap跟HashSet一样底层是哈希表结构的
依赖hashCode方法和equals方法保证键的唯一
如果存储的是自定义对象,需要重写hashCode方法和equals方法
TreeMap的特点
TreeMap是Map里面的一个实现类
直接使用Map里面的方法就可以
TreeMap跟TreeSet一样地层是是红黑树结构的
依赖自然排序或者比较器排序,对键进行排序
如果键存储的是自定义对象,需要实现Comparable接口或者再创建TreeMap对象时候给出比较器排序的规则