数据结构,List,Set,Collections
常见的数据结构
数据存储的常用结构有:栈、队列、数组、链表和红黑树。
栈
栈:stack,也称为堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。
采用该结构的集合,堆元素的存储有下面这些特点
先进后出:即最开始存进去的元素,是最后才能被取出的。举例弹夹,最开始的子弹被压在最下面,只有上面的子弹打完才能轮到它
栈的入口、出口都是栈的顶端位置
**压栈:**存元素,即把元素存到顶端位置,就是最上面的位置,栈中已有元素往栈底移动
**弹栈:**取元素,即把栈的顶端元素取出,栈中已有元素往栈顶移动
队列
queue
先进先出:车头先出来,车尾后出来
数组
Array,有序的元素序列,按照索引值来排位
特点:查询快,增删慢
链表
linked list:由一系列结点node(链表中每一个元素称为结点)组成
结点包括两个部分:一是存储数据的数据域,另一个是存储下一个结点地址的指针域
链表结构有单向链表与双向链表
单向链表
(数据域)data|next(指针域)
采用该结构的集合,对元素的存取有如下的特点:
多个结点之间,通过地址进行连接
查找元素慢:需要通过连接的结点,依次查询
增删元素快:只需要修改连接下个元素的地址即可
红黑树
二叉树:binary tree ,是每个结点不超过2的有序树(tree)
树的键值是有序的
红黑树约束:
节点可以是红色或者是黑色
结根点是黑色的
叶子节点(空节点)是黑色的
每个红色节点的子节点都是黑色的
任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同
红黑树的特点:
速度特别快,查找叶子元素最少和最多次数不多于二倍
List集合
(java.util.List
集合、java.util.Set
集合)
list接口
java.util.List
接口继承自Collection
接口,是单列集合的一个分支。
List集合允许出现重复的元素,所有元素都以一种线性方式进行存储,特点 元素有序,存入顺序和取出顺序一致。
List接口特点
1.元素存取有序的集合
2.带有索引的集合(与数组索引一样)
3.集合中可以有重复的元素 可通过equals方法进行判断元素是否重复
List接口中的常用方法
public void add(int index, E element)
: 将指定的元素,添加到该集合中的指定位置上。public E get(int index)
:返回集合中指定位置的元素。public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。public E set(int index, E element)
:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
public class ListDemo{
public static void main(String[] args){
//创建List对象
List<String> List = new ArrayList<String>();
// 往尾部添加指定元素
list.add("轩nb");
System.out.println(list);
// add(int index,String s) 往指定位置添加
list.add(3,"轩");
System.out.println(list);
//String remove(int index) 删除指定位置元素 返回被删除元素
//删除索引位置为2的元素
System.out.println(list.remove(2));
// String set(int index,String s)
//在指定位置 进行 元素替代(改)
list.set(0, "轩哥");
System.out.println(list);
// String get(int index) 获取指定位置元素
list.get(2);
}
}
List的子类
ArrayList集合
java.util.ArrayList
集合数据存储的结构是数组结构。元素增删慢,查找快。通常用到,查询数据,遍历数据
LinkedList集合
java.util.LinkedList
集合数据存储的结构是链表结构(双向链表)。方便元素添加、删除的集合。
public void addFirst(E e)
:将指定元素插入此列表的开头。public void addLast(E e)
:将指定元素添加到此列表的结尾。public E getFirst()
:返回此列表的第一个元素。public E getLast()
:返回此列表的最后一个元素。public E removeFirst()
:移除并返回此列表的第一个元素。public E removeLast()
:移除并返回此列表的最后一个元素。public E pop()
:从此列表所表示的堆栈处弹出一个元素。public void push(E e)
:将元素推入此列表所表示的堆栈。public boolean isEmpty()
:如果列表不包含元素,则返回true。
Set接口
java.util.Set
接口和java.util.List
接口一样,同样继承自Collection
接口。
Set接口中元素无序,并且保证存入的元素不重复
Set集合有多个子类,其中介绍两个java.util.HashSet
、java.util.LinkedHashSet
Set集合元素不重复原理
HashSet集合
java.util.HashSet
是Set
接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。
其底层实现是java.util.HashMap
支持
HashSet是根据对象的哈希值来确定元素在集合中的存储位置,保证元素唯一性的方式依赖于:`hashCode`与`equals`方法。
哈希表
JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里
JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
HashSet存储自定义类型元素
给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法
LinkedHashSet
在HashSet下面有一个子类java.util.LinkedHashSet
,它是链表和哈希表组合的一个数据存储结构。
可变参数
在JDK1.5之后,如果我们定义一个方法需要接受多个参数,并且多个参数类型一致
修饰符 返回值类型 方法名(参数类型... 形参名){ }
前者可以直接传递数据
等价于
修饰符 返回值类型 方法名(参数类型[] 形参名){ }
后面这种定义,在调用时必须传递数组
… 用在参数上,称之为可变参数
Tip:如果在方法书写时,这个方法拥有多参数,参数中包含可变参数,可变参数一定要写在参数列表的末尾位置
Collections
常用功能
java.utils.Collections
是集合工具类,用来对集合进行操作。部分方法如下:
public static <T> boolean addAll(Collection<T> c, T... elements)
:往集合中添加一些元素。public static void shuffle(List<?> list) 打乱顺序
:打乱集合顺序。public static <T> void sort(List<T> list)
:将集合中元素按照默认规则排序。public static <T> void sort(List<T> list,Comparator<? super T> )
:将集合中元素按照指定规则排序。
public class CollectionsDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
//原来写法
//list.add(12);
//list.add(14);
//采用工具类完成往集合中添加元素
Collections.addAll(list, 10, 22, 1,2);
System.out.println(list);
//排序方法
Collections.sort(list);
System.out.println(list);
}
}
结果:
[10, 22, 1, 2]
[1, 2, 10, 22]
Comparator比较器
public static <T> void sort(List<T> list)
:将集合中元素按照默认规则排序。
public static <T> void sort(List<T> list,Comparator<? super T> )
:将集合中元素按照指定规则排序。
`public static <T> void sort(List<T> list)`
sort(List<T> list)使用前提
被排序的集合里存储的元素,必须实现Comparable,重写接口中的方法comparaTo定义排序的规则
Comparable接口的排序规则:
自己(this)- 参数:升序
参数 - 自己(this):降序
如果使用自定义类型,则一定需要重写
Comparable和Comparator两个接口的区别基本描述
Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较comparaTo方法
Comparator:相当于找了一个第三方,来比较两个,
o1 - o2 //升序
o2 - o1 //降序
序的规则
Comparable接口的排序规则:
自己(this)- 参数:升序
参数 - 自己(this):降序
如果使用自定义类型,则一定需要重写
### Comparable和Comparator两个接口的区别基本描述
```java
Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较comparaTo方法
Comparator:相当于找了一个第三方,来比较两个,
o1 - o2 //升序
o2 - o1 //降序