1 常见的数据结构
1.1 栈
栈是运算受限的线性表。受限表现为仅在一端进行插入和删除操作。
栈的特点:
1.先进后出。
2.栈的入口和出口都在栈的顶端。
栈的结构图如下:
压栈:存元素。
弹栈:取元素。
1.2 队列
队列是运算受限的线性表。受限表现为在一端进行插入,在另一端进行删除。
队列的特点:
1.先进先出。
2.队列的入口和出口各占一侧。
队列的结构图:
1.3 数组
数组是有序的元素序列。
数组的特点:
1.查找元素快。(按索引查找)
2.增删元素慢。(每次增删数据,都会创建一个新的数组对象)
1.4 链表
链表由一系列结点构成。结点由数据域和指针域构成。
链表特点:
1.多个结点之间通过地址连接。
2.查找元素慢。(每次都要从头开始查找)
3.增删元素快。(只需修改连接元素的地址即可)
链表结构:
1.5 红黑树
二叉树是结点不超过2的有序树。
结构图:
红黑树本身是二叉树。
红黑树的约束:
1.节点可以是红色的或者黑色的。
2.根节点是黑色的。
3.叶子节点(特指空节点)是黑色的。
4.每个红色节点的子节点都是黑色的。
5.任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同。
2 List集合
List接口继承Collection接口。
List集合的特点:
1.元素存取有序的集合。
2.带索引,可以通过索引访问数据。
3.可以有重复元素。
2.1 常用方法
public void add(intindex,Eelement);将指定的元素,添加到该集合中的指定位置上。
public E get(intindex);返回集合中指定位置的元素。
public E remove(intindex);移除列表中指定位置的元素,返回的是被移除的元素。public E set(intindex,Eelement);用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
2.2 List的子类
1 ArrayList(详情见上篇)
内部是数组结构。
2 LinkedList
内部是双向链表结构。
因为查找首位元素方便,所以其中有大量的针对首尾元素的方法。
较为常用的有:
public void addFirst(E e);将指定元素插入此列表的开头。
public void addLast(E e);将指定元素添加到此列表的结尾。
public E getFirst();返回此列表的第一个元素。
public E getLast();返回此列表的最后一个元素。
public E removeFirst();移除并返回此列表的第一个元素。
public E removeLast();移除并返回此列表的最后一个元素。
public boolean isEmpty();如果列表不包含元素,则返回true。
3 Set集合
Set集合中元素无序,并且元素不能重复。
3.1 HashSet集合
1 内部结构:
HashSet集合内部采用哈希表结构。哈希表底层又是由数组加链表组成,后版本中,当同一哈希值的不同对象超过8,则会将链表变为红黑树。
2 存储流程:
先调用hashCode方法,获得对象的哈希值,在数组中寻找有无此哈希值,没有,则存入。如果有,则调用equals方法判断对象是否与已存的对象相同,如果相同,则不存入。如果不同,则存入。
3 存储自定义元素
存储自定义元素,需重写hashCode方法和equals方法,建立自己的比较方式,才能使对象唯一。
3.2 LinkedHashSet集合
内部由数组加链表的结构组成。与HashSet的区别在于,它存进去的元素是有序的。
4 可变参数
如果一个方法需要接受多个类型相同的参数,并且个数不确定,这使就可以使用可变参数。
定义格式如下:
修饰符 返回值类型 方法名(参数类型... 形参名){ }
注意事项:
1.其内部结构是数组。
2.如果方法有多个参数,并且有可变参数,则可变参数必须在最后一个,并且只能有一个。
5 Collections工具类
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> );将集合中元素按照指定规则排序。
2 Comparator接口
public static void sort(List list);这个方法排序,默认被排序的类型实现了Comparable接口。例如String类型,它实现了Comparable接口,但已经写死,不能修改。如果想自定义排序规则,则需用到Comparator接口。
例如:
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.charAt(0) - o1.charAt(0);
}
});
与Comparable的区别
Comparatable:强行对实现它的每个类的对象进行整体排序。类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。
Comparator:强行对某个对象进行排序。可以将Comparator 传递给sort方法(如Collections.sort或 Arrays.sort),从而允许在排序顺序上实现精确控制。