定义:集合是java中存储对象数据的一种容器
①集合的大小不固定,数据类型不固定。
②集合非常适合做元素的增删操作
注意:集合只能存储引用数据类型,如果要存储基本数据类型则要使用包装类
问题:
①数组和集合的元素存储的个数问题
数组定义后类型确定,长度固定
而集合类型可以不固定,长度是可变的
②数据和集合存储元素的数据类型的问题
数组可以存储基本数据类型和引用数据类型
而集合只能存储引用数据类型
集合分为collection单列集合和map双列集合(键值对)
collection单列集合,每个元素只包含一个值
map双列集合,每个元素包含两个值,即键值对
collection分为list和set和map,list分为ArrayList和LinkedList,set分为HashSet和TreeSet,其中HashSet又分为LinkedHashSet,map分为HashMap
其中collection,list和set和map是属于接口,其他的都是实现类
List系列集合:添加的元素都是有序的,可重复有索引
ArrayList,LinkedList:有序可重复,有索引
Set系列集合:添加的元素都是无序,不可重复无索引的
HashSet:无序,不重复,五索引
TreeSet:按大小默认升序排序,不重复,无索引
LinkedHashSet是有序,不重复无索引
集合都是支持泛型的,可以再编译阶段约束集合只能操作某种数据类型 <数据类型>
collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的
collection API如下
public boolean add(E e) 把给定的对象添加到当前集合中
public void clear() 清空集合中所有的元素
public boolean remove(E e) 把给定的对象在当前集合中删除
public boolean contains(Object object) 判断当前集合中是否包含给定的对象
public boolean isEmpy() 判断当前集合是否为空
public int size() 返回集合中元素的个数
public Object[] toArray() 把集合中的元素,存储到数组中
遍历就是一个一个的把容器中的元素访问一遍
迭代器在Java中的代表是Iterator,迭代器是集合的专用
Collectionlist = new ArrayList<>(); list.add("张三"); list.add("张三"); list.add("张三"); Iterator ite = list.iterator(); while(ite.hasNext){ //判断是否还有元素可以迭代,返回true String str = ite.next();//返回迭代的下一个元素 System.out.println(str); } 一般需要进行单个修改的就用迭代器(判断为哪个再删除或者其他操作)
Collectionlist = new ArrayList<>(); list.add("张三"); list.add("张三"); list.add("张三"); for(String str:list){ System.out.println(str); } foreach底层是迭代器实现的,一般遍历所有的就用foreach
for(int i = 0;i④Lambda表达式遍历集合
简写 list.forEach(System.out:println);五、数据结构
数据结构是计算机底层存储,组织 数据的方式。是指数据相互之间是以什么方式排列在一起的。
通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率
常见的数据结构有:栈,队列,数组,链表,二叉树,二叉查找树,平衡二叉树,红黑树...
5.1栈(stack)
栈数据结构的执行特点:后进先出,先进后出
分为进栈(push)和出栈(pop)
5.2队列
特点:先进先出,后进后出
有入队列和出队列
5.3数组(增删慢,改查快)
查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同(元素在内存中是连续存储的)
删除效率低:要将原始数据删除,同时后面的每个数据前移
添加效率极低:添加位置后的每个数据后移,再添加元素
5.4链表(增删快,改查慢)
链表的特点:
①链表中的元素是在内存中不连续存储的,每个元素节点包含数据值和下一个元素的地址
②链表中的元素是游离存储的,每个元素节点包含数据值和下一个元素的地址
③链表查询慢,无论查询哪个数据都要从头开始找
④链表增删相对快
链表的种类:单向链表,双向链表(主要用)
5.5二叉树
特点:
①只能有一个根节点,每个节点最多支持2个直接子节点
②节点的度:节点拥有的子树的个数,二叉树的度不大于2叶子节点,度为0的节点也被称为终端节点(度就是分支)
③高度:叶子节点的高度为1,叶子节点的父节点高度为2,以此类推,根节点的高度最高
④层:根节点在第一层,以此类推
⑤兄弟节点:拥有共同父节点的节点叫兄弟节点
特点:1.每一个节点上最多有两个子节点
2.左子树上所有节点的值都小于根节点的值
3.右子树上所有的节点的值都大于根节点的值
目的:提高检索数据的性能
平衡二叉树的要求
任意节点的左右两个子树的高度差不超过1,任意节点的左右两个子树都是一颗平衡二叉树
5.6红黑树
红黑树是一种自平衡的二叉查找树,是计算机科学中用到的一种数据结构
每一个节点可以是红或者黑,红黑树不是通过高度平衡的,它的平衡是通过红黑规则进行实现的
红黑规则:
1.每个节点或是红色的,或者是黑色的,根节点必须是黑色的
2.如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为Nil,这些Nil视为叶节点,叶节点是黑色的
3.如果某一个节点是红色的,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)
4.对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
红黑树的真删改查的性能都很好
添加节点:
添加的节点的颜色:可以是红色的,也可以是黑色的
默认用红色效率高(交替)
六、List集合特有方法(E是集合名)
list是有序可重复有索引的集合
void add(int index,E element)在此集合中的指定位置插入指定元素
E remove(int index) 删除指定索引处的元素,返回被删除元素
E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
E get(int index) 获取,返回指定索引处的元素
长度:list.size();
5.7.1 ArrayList集合底层原理:
线程不安全
扩容机制:原长度的1.5倍,如果待添加的数据比扩容长度要大,就用待添加数据长度,如果超过int类型最大长度-8,则使用Integer类型最大长度
常用API:
add,remove,set,get,clear,contains,isEmpty,size
ArrayList集合是基于数组实现的,根据索引定位元素快,增删需要做元素的移位操作
第一次创建集合并添加第一个元素的时候,在底层创建一个默认长度为10的数组
5.7.2LinkedList的特点
不需要扩容
底层数据结构是双链表,查询慢,首尾操作的速度是极快的,所有多了很多首尾操作的特有API(不需要扩容)
LinkedList集合的特有功能
public void addFirst(E e) 即push(“张三”) 在该列表开头插入指定的元素
public void addLast(E e) 在该列表的元素插入到末尾
public E getFirst() 返回此列表的第一个元素
public E getLast() 返回此列表的最后一个元素
public E removeFirst() 即pop() 从此列表中删除并返回第一个元素
public E removeLast() 从此列表中删除并返回最后一个元素
5.7.3Vector
线程安全的,底层也是基于数组的,相对于ArrayList和LinkedList都要慢
ArrayList和LinkedList的区别
1.ArrayList基于数组,LinkedList基于双向链表
2.ArrayList查询快,修改快,LinkedList增加删除快
通配符
?extends Car (上限,能筛选)
如果希望set集合认为2个内容相同的对象是重复的该怎么办?
答:重写对象的hashcode和equals方法
七、Set集合概述和特点
set:无序不可重复集合
HashSet底层使用的是HashMap(无序不可重复)
TreeSet底层使用的是TreeMap(有序不可重复),是基于红黑树实现的,增删改查性能都很好
TreeSet集合自定义排序规则
①类实现comparable接口,重写比较规则
②集合自定义comparator比较器对象,重写比较规则
※ 判断对象是否重复是依据对象的hashcode和equals方法
7.1Treeset
①不重复,无索引,可排序
②可排序:按照元素大小默认升序(由小到大)排序
③TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都较好
④注意:TreeSet集合是一定要排序的,可以将元素按照指定的规则进行排序
TreeSet集合默认的规则:
①对于数值类型:Integer,Double官方默认按照大小进行升序排序
②对于字符串类型,默认按照首字符的编号升序排序
③对于自定义类型如Student对象,TreeSet无法直接排序
如果TreeSet集合存储的对象有实现比较规则,集合也自带比较器,默认使用集合自带的比较器排序(就近原则)