数据结构部分:
栈:后进先出
队列:先进先出
数组:
查询快:数组的地址是连续的,我们可以通过数组的首地址找到数组,通过数组的索引可以快速查找某一个元素
增删慢:数组的长度是固定的,我们想要增加/删除一个元素,必须创建一个新数组,把原数组的数据复制过来
链表:
查询慢:链表中的地址不是连续的,每次查询元素,都必须从头开始查询
增删快:链表结构,增加或者删除一个元素,对链表的整体结构没有影响,所以增删快。
单向链表:链表只有一条链子,不能保证元素的顺序(存储元素和取出元素的顺序可能不一致)
双向链表:链表中有两条链子,有一条链子是专门记录元素的顺序,是一个有序的集合。
红黑树:特点:趋近于平衡树,查询的速度非常快,查询叶子节点最大次数和最小次数不能超过2倍
约束条件:
1.节点可以是红色的或者黑色的
2.根节点是黑色的
3.叶子结点(空节点)是黑色的
4.每个红色的节点的子节点都是黑色的
5.任何一个节点到其每一个叶子节点的所有路径上黑色节点数量相同(数据结构内容很少,详细可以看对应书籍)
List集合:
/* * java.util.List接口extends Collection接口 * List接口的特点: * 1.有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出123) * 2.有索引,包含了一些带索引的方法 * 3.允许存储重复的元素 * * 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):用指定元素替换集合中指定位置的元素,返回值的更新前的元素 * 注意事项: * 操作索引的时候,一定要防止索引越界异常 * IndexOutOfBoundsException:索引越界异常,集合会报 * ArrayIndexOutOfBoundsException:数组索引越界异常 * StringIndexOutOfBoundsException:字符串索引越界异常 * */ public class Demo01List { public static void main(String[] args) { //创建一个List集合对象,多态 List<String> list=new ArrayList<>(); //使用add方法往集合中添加元素 list.add("a"); list.add("b"); list.add("c"); list.add("d"); list.add("a"); System.out.println(list);//[a, b, c, d, a],不是地址,重写了toString方法 //public void add(int index,E element):将指定的元素,添加到该集合的指定位置上 //c,d之间添加元素 list.add(3,"haha"); System.out.println(list);//[a, b, c, haha, d, a] //public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素 //移除c元素 String remove = list.remove(2); System.out.println("被移除的元素:"+remove);//被移除的元素:c System.out.println(list);//[a, b, haha, d, a] //public E set(int index,E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素 //把最后一个a,替换为A String setE = list.set(4, "A"); System.out.println("被替换的元素:"+setE);//被替换的元素:a System.out.println(list);//[a, b, haha, d, A] //List集合遍历有三种方式 //使用普通for循环 for (int i = 0; i <list.size(); i++) { //public E get(int index):返回集合中指定位置的元素 String getE = list.get(i); System.out.println(getE); } System.out.println("--------"); //使用迭代器 Iterator<String> it=list.iterator(); while (it.hasNext()){ String s = it.next(); System.out.println(s); } System.out.println("----------"); //使用增强for循环 for (String s : list) { System.out.println(s); } } }
ArrayList集合:集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据所以ArrayList是最常用的集合。但需要增删时,应慎重选择。
LinkedList集合:
/* * java.util.LinkedList集合 implements List接口 * LinkedList集合的特点: * 1.底层是一个链表结构:查询慢,增删快 * 2.里面包含了大量操作首尾元素的方法 * 注意:使用LinkedList集合特有的方法,不能使用多态 * addFirst(E e) :在该列表开头插入指定的元素。 * addLast(E e) :将指定的元素追加到此列表的末尾。 * push(E e) :将元素推送到由此列表表示的堆栈上。 * getFirst(): 返回此列表中的第一个元素。 * getLast() :返回此列表中的最后一个元素 * removeFirst() :从此列表中删除并返回第一个元素。 * removeLast() :从此列表中删除并返回最后一个元素。 * pop() :从此列表表示的堆栈中弹出一个元素。 * */ public class Demo02LinkedList { public static void main(String[] args) { //show01(); //show02(); show03(); } /*removeFirst() :从此列表中删除并返回第一个元素。 * removeLast() :从此列表中删除并返回最后一个元素。 * pop() :从此列表表示的堆栈中弹出一个元素。 * */ private static void show03() { //创建LinkedList集合对象 LinkedList<String> linked = new LinkedList<>(); //添加元素 linked.add("a"); linked.add("b"); linked.add("c"); linked.add("d"); System.out.println(linked); //String first = linked.removeFirst(); String first = linked.pop();//和上面一行作用相同 System.out.println("被移除的第一个元素"+first);//被移除的第一个元素a String last = linked.removeLast(); System.out.println("被移除的最后一个元素"+last);//被移除的最后一个元素d System.out.println(linked); } private static void show02() { //创建LinkedList集合对象 LinkedList<String> linked = new LinkedList<>(); //添加元素 linked.add("a"); linked.add("b"); linked.add("c"); linked.add("d"); //linked.clear();//清空集合中的元素,再获取集合中的元素会抛出NoSuchElementException异常 //添加判断 isEmpty方法 if(!linked.isEmpty()){ String first = linked.getFirst(); System.out.println(first);//a String last = linked.getLast(); System.out.println(last);//d } } /*addFirst(E e) :在该列表开头插入指定的元素。 * addLast(E e) :将指定的元素追加到此列表的末尾。 * push(E e) :将元素推送到由此列表表示的堆栈上。 * */ private static void show01() { //创建LinkedList集合对象 LinkedList<String> linked = new LinkedList<>(); //添加元素 linked.add("a"); linked.add("b"); linked.add("c"); linked.add("d"); System.out.println(linked);//[a, b, c, d] //addFirst(E e) :在该列表开头插入指定的元素。 //linked.addFirst("haha"); linked.push("haha");//效果与上一个相同 System.out.println(linked);//[haha, a, b, c, d] //addLast(E e) :将指定的元素追加到此列表的末尾。 linked.addLast("world"); System.out.println(linked);//[haha, a, b, c, d, world] } }