目录
数据结构
数据存储的常用结构有:栈、队列、数组、链表和红黑树。我们分别来了解一下:
栈
-
栈:stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。
简单的说:采用该结构的集合,对元素的存取有如下的特点
-
先进后出
-
栈的入口、出口的都是栈的顶端位置。
队列
-
队列:queue,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。
简单的说,采用该结构的集合,对元素的存取有如下的特点:
-
先进先出
-
队列的入口、出口各占一侧。
数组
-
数组:Array,是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。
简单的说,采用该结构的集合,对元素的存取有如下的特点:
-
查找元素快:通过索引,可以快速访问指定位置的元素
-
增删元素慢
-
指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。
-
指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。
-
红黑树
-
二叉树:binary tree ,是每个结点不超过2的有序树(tree) 。
简单的理解,就是一种类似于我们生活中树的结构,只不过每个结点上都最多只能有两个子结点。
二叉树是每个节点最多有两个子树的树结构。顶上的叫根结点,两边被称作“左子树”和“右子树”。
我们要说的是二叉树的一种比较有意思的叫做红黑树,红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树。也就意味着,树的键值仍然是有序的。
红黑树的约束:
-
节点可以是红色的或者黑色的
-
根节点是黑色的
-
叶子节点(特指空节点)是黑色的
-
每个红色节点的子节点都是黑色的
-
任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同
红黑树的特点:
速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多于二倍
List集合
java.util
接口 List<E>
所有超级接口:
Collection<E>, Iterable<E>
所有已知实现类:
AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnWriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector
public interface List<E>
extends Collection<E>
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
List接口特点:
-
它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。
-
它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
-
集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如下:
-
public void add(int index, E element)
: 将指定的元素,添加到该集合中的指定位置上。 -
public E get(int index)
:返回集合中指定位置的元素。 -
public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。 -
public E set(int index, E element)
:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Demo01List {
public static void main(String[] args) {
//创建对象,多态
List<String> list = new ArrayList<>();
//add方法
list.add("a");
list.add("b");
list.add("c");
list.add("d");
System.out.println(list);
//public void add(int index, E element)`:
// 将指定的元素,添加到该集合中的指定位置上。
list.add(3,"itheima");
System.out.println(list);
//public E remove(int index)`: 移除列表中指定位置的元素,
// 返回的是被移除的元素。
String removeE = list.remove(2);
System.out.println(removeE);
//public E set(int index, E element)`:
// 用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
String setE = list.set(3, "D");
System.out.println(setE);
System.out.println(list);
//`public E get(int index)`:返回集合中指定位置的元素。
//list的三种遍历
//普通遍历
for(int i = 0; i < list.size();i++){
//get方法
String s = list.get(i);
System.out.println(s);
}
//迭代器遍历
Iterator<String> it = list.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
//增强for
for (String s : list) {
System.out.println(s);
}
}
}
ArrayList
public class ArrayList<E>
extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
java.util.ArrayList
集合数据存储的结构是数组结构。
特点是:元素增删慢,查找快
LinkedList集合
java.util.LinkedList
集合数据存储的结构是链表结构。LinkedList是一个双向链表
特点是:方便元素添加、删除的集合。
常用方法:
-
public void addFirst(E e)
:将指定元素插入此列表的开头。 -
public void addLast(E e)
:将指定元素添加到此列表的结尾。 -
public E getFirst()
:返回此列表的第一个元素。private static void show03() { //使用LinkedList集合对象 LinkedList<String> linked = new LinkedList<>(); //使用add添加元素 linked.add("a"); linked.add("b"); linked.add("c"); /* String first = linked.removeFirst(); System.out.println(f);*/ String first = linked.pop(); System.out.println(first); String last = linked.removeLast(); System.out.println(last); System.out.println(linked); } /* public E getFirst()`:返回此列表的第一个元素。 public E getLast()`:返回此列表的最后一个元素*/ private static void show02() { //使用LinkedList集合对象 LinkedList<String> linked = new LinkedList<>(); //使用add添加元素 linked.add("a"); linked.add("b"); linked.add("c"); linked.clear();//清空集合的元素NoSuchElementException if(!linked.isEmpty()){ String first = linked.getFirst(); System.out.println(first); String last = linked.getLast(); System.out.println(last); } } /* public void addFirst(E e)`:将指定元素插入此列表的开头。 public void addLast(E e)`:将指定元素添加到此列表的结尾。==add public void push(E e)`:将元素推入此列表所表示的堆栈。==addFirst */ private static void show01() { //使用LinkedList集合对象 LinkedList<String> linked = new LinkedList<>(); //使用add添加元素 linked.add("a"); linked.add("b"); linked.add("c"); System.out.println(linked); /* linked.addFirst("www"); System.out.println(linked);*/ linked.push("www"); System.out.println(linked); linked.addLast("com"); System.out.println(linked); }
-
public E getLast()
:返回此列表的最后一个元素。 -
public E removeFirst()
:移除并返回此列表的第一个元素。 -
public E removeLast()
:移除并返回此列表的最后一个元素。 -
public E pop()
:从此列表所表示的堆栈处弹出一个元素。 -
public void push(E e)
:将元素推入此列表所表示的堆栈。 -
public boolean isEmpty()
:如果列表不包含元素,则返回true。
private static void show03() {
//使用LinkedList集合对象
LinkedList<String> linked = new LinkedList<>();
//使用add添加元素
linked.add("a");
linked.add("b");
linked.add("c");
/* String first = linked.removeFirst();
System.out.println(f);*/
String first = linked.pop();
System.out.println(first);
String last = linked.removeLast();
System.out.println(last);
System.out.println(linked);
}
/* public E getFirst()`:返回此列表的第一个元素。
public E getLast()`:返回此列表的最后一个元素*/
private static void show02() {
//使用LinkedList集合对象
LinkedList<String> linked = new LinkedList<>();
//使用add添加元素
linked.add("a");
linked.add("b");
linked.add("c");
linked.clear();//清空集合的元素NoSuchElementException
if(!linked.isEmpty()){
String first = linked.getFirst();
System.out.println(first);
String last = linked.getLast();
System.out.println(last);
}
}
/*
public void addFirst(E e)`:将指定元素插入此列表的开头。
public void addLast(E e)`:将指定元素添加到此列表的结尾。==add
public void push(E e)`:将元素推入此列表所表示的堆栈。==addFirst
*/
private static void show01() {
//使用LinkedList集合对象
LinkedList<String> linked = new LinkedList<>();
//使用add添加元素
linked.add("a");
linked.add("b");
linked.add("c");
System.out.println(linked);
/*
linked.addFirst("www");
System.out.println(linked);*/
linked.push("www");
System.out.println(linked);
linked.addLast("com");
System.out.println(linked);
}