集合与数组的对比
长度:
集合的长度是可以改变的。
数组的长度是固定的。
存储类型:
数组可以存储基本数据类型和引用数据类型。
集合只可以存储引用数据类型,如果想存储基本数据类型需要把它们变成包装类。
集合的特点:
(1)集合的大小不固定,启动后可以动态变化,类型也可以选择不固定。
(2)集合非常适合做元素个数不确定,且要进行删除操作的业务场景。
(3)集合提供了许多丰富,好用的功能,而数组的功能很单一。
集合使用最多的类:ArrayList类
1:创建集合的对象
ArrayList<引用数据类型> 对象名=new ArrayList<>();
ArrayList<基本数据类型的包装类> 对象名=new ArrayList<>();
注意:集合可以存储自定义类型的对象
ArratList<类名> 对象名=new ArrayList<>();集合容器中存储的是每个对象在堆内存中的地址值。
ArrayList<E>:其实就是一个泛型类,可以在编译阶段约束集合对象只能操作某种数据类型。
集合支持泛型。
集合和泛型不支持基本类型,只支持引用数据类型。
2:ArrayList常用成员方法
boolean add(E e) 作用:添加元素,返回值表示是否添加成功
boolean remove(E e) 作用:删除指定元素,返回值表示是否删除成功。如果集合中有相同的元素,只会删除第一次出现的元素。
E remove(int index) 作用:删除指定索引的元素,返回被删除元素
E set(int index,E e) 作用:修改指定索引下的元素,返回原来的元素
E get(int index) 作用:获取指定索引对的元素
int size() 作用:集合的长度,也就是集合中元素的个数
ArrayList遍历并删除元素:(1)从前往后边遍历边删除元素之后,马上后退一步i--就可以了
(2)从后往前遍历,边遍历边删除。
Collection集合体系
集合的代表是Collection接口。
接口:Collection 容器接口,List 列表接口,Set 集合接口
Collection包括List,Set.
List | Set |
ArrayList 数组列表类 | HashSet 哈希集合类 |
LinkedList 链表类 | SortedSet 有序集合接口(包括TreeSet树集合类) |
Collection集合特点:
List系列集合:添加的元素是有序,可重复,有索引。
ArrayList,LinekdList:有序,可重复,有索引。
Set系列集合:添加的元素是无序,不重复,无索引。
HashSet:无序,不重复,无索引;
LinkedHashSet:有序,不重复,无索引;
TreeSet:按照大小默认升序排序,不重复,无索引。
TreeSet集合自定义排序规则有几种方式?
两种。(1)类实现Comparable接口,重写比较规则。
(2)集合自定义Comparator比较器对象,重写比较规则。
Set去重复原因:先判断哈希值,再判断equals.
如果想让Set集合认为两个内容相同的对象是重复的应该重写对象的hashCode和equals方法。
Collection集合:
Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。
Collection集合的遍历方式:
方式一:迭代器
方式二:foreach/增强for循环
方式三:lambda表达式
迭代器遍历概述:
遍历就是一个一个的把容器中的元素访问一遍;
迭代器在Java中的代表是Iterator,迭代器是集合的专用遍历方式。
Iterator<E> iterator(): 得到迭代器对象,默认指向当前集合的索引0
增强for循环:
增强for循环:既可以遍历集合也可以遍历数组。
它是JDK5之后出现的,其内部原理是一个Iterator迭代器,遍历集合相当于是迭代器的简化写法。
实现Iterable接口的类才可以使用迭代器和增强for,Collection接口已经实现Iterable接口。
格式:for(元素数据类型 变量名:数组或者Collection集合){
//在此处使用变量即可,该变量就是元素
}
Lambda表达式遍历集合:
Collection结合Lambda遍历的API:
default void forEach(Consumer<?super T>action): 结合Lambda遍历集合。
遍历举例:
Collection<String> lists=new ArrayList<>();
lists.forEach(s->{System.out.println(s);});
数据结构:
数据结构概述:
数据结构是计算机底层存储,组织数据的方式。是指数据相互之间是以什么方式排列在一起的。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。
常见的数据结构:
栈:执行特点为后进先出,先进后出。
队列:执行特点为先进先出,后进后出。
数组:数组是一种查询快,增删慢的模型。
(1)查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同。
(2)删除效率低:要将原始数据删除,同时后面每个数据前移。
(3)添加效率极低:添加位置后的每个数据后移,再添加元素。
链表:链表是一种查询慢,增删相对快的模型。链表有单向链表和双向链表两个种类。
(1)链表中的元素是在内存中不连续存储的,每个元素节点包含数据值和下一个元素的地址。
(2)链表查询慢。无论查询哪个数据都要从头开始找。
(3)链表增删相对快。
二叉树
二叉查找树:又称二叉排序树或二叉搜索树。
特点:(1)每一个节点上最多有两个子节点。
(2)左子树上所有节点的值都小于根节点的值。
(3)右子树上所有节点的值都大于根节点的值。
平衡二叉树:是在满足查找二叉树的大小规则下,让树尽可能矮小,以此提高查数据的性能。
红黑树:(1)每一个节点或是红色的,或者是黑色的,根节点必须是黑色。
(2)如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,叶节点是黑色的。
(3)如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)
(4)对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点。
不可变集合
特点:定义完成后不可以修改,或者添加,删除。
在List,Set,Map接口中,都存在of方法,可以创建一颗不可变的集合。
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对象。