java进阶 03

数据结构

1.数据存储的常用结构有:栈、队列、数组、链表和红黑树。

1.stack,又称堆栈,它是运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作。
2.采用该结构的集合,对元素的存取有如下的特点:
(1)先进后出(即存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹 夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。
(2)栈的入口、出口的都是栈的顶端位置.
在这里插入图片描述
注:
(1)压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
(2)弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

队列

1.queue,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入, 而在表的另一端进行删除。
2.采用该结构的集合,对元素的存取有如下的特点:
(1)先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。例如,小火车过山 洞,车头先进去,车尾后进去;车头先出来,车尾后出来。
(2)队列的入口、出口各占一侧。例如,下图中的左侧为入口,右侧为出口。
在这里插入图片描述

数组

1.Array,是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。就像是一排出 租屋,有100个房间,从001到100每个房间都有固定编号,通过编号就可以快速找到租房子的人。
2.采用该结构的集合,对元素的存取有如下的特点:
(1)查找元素快:通过索引,可以快速访问指定位置的元素。
在这里插入图片描述
(2)增删元素慢:
指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。如下图:
在这里插入图片描述
指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。如下图:
在这里插入图片描述

链表

1.linked list,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成。每 个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。我们常说的 链表结构有单向链表双向链表

单向链表

1.采用该结构的集合,对元素的存取有如下的特点:
(1)多个结点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次 类推,这样多个人就连在一起了。
在这里插入图片描述
(2)查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素。
(3)增删元素快:
增加元素:只需要修改连接下个元素的地址即可。
在这里插入图片描述
删除元素:只需要修改连接下个元素的地址即可。
在这里插入图片描述

红黑树

1.二叉树:binary tree ,是每个结点不超过2的有序树(tree) 。
2.二叉树是每个节点最多有两个子树的树结构。顶上的叫根结点,两边被称作“左子树”和“右子树”。
在这里插入图片描述
3.红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树。也就意味着,树的键值仍然是有序的。
4.红黑树的约束:
(1) 节点可以是红色的或者黑色的
(2) 根节点是黑色的
(3) 叶子节点(特指空节点)是黑色的
(4) 每个红色节点的子节点都是黑色的
(5) 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同.
5.红黑树的特点:速度特别快,趋近平衡树,查找叶子元素最少和最多次数不多于二倍。

List集合

1.List接口特点:
(1)它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、 22、33的顺序完成的)。
(2)它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
(3)集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

List接口中常用方法

1.List作为Collection集合的子接口,继承了Collection接口中的全部方法,还增加了一些根据元素索引来操作集合的特有方法,如下:
(1)public void add(int index, E element) : 将指定的元素,添加到该集合中的指定位置上。
(2)public E get(int index) :返回集合中指定位置的元素。
(3)public E remove(int index) : 移除列表中指定位置的元素, 返回的是被移除的元素。
(4)public E set(int index, E element) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。

import java.util.ArrayList;
import java.util.List;

public class ListDemo {
    public static void main(String[] args) {
    // 创建List集合对象
        List<String> list = new ArrayList<String>();
    // 往 尾部添加 指定元素
        list.add("你");
        list.add("我");
        list.add("他");
        System.out.println(list);
    // add(int index,String s) 往指定位置添加
        list.add(1,"你们");
        System.out.println(list);
    // String remove(int index) 删除指定位置元素 返回被删除元素
    // 删除索引位置为2的元素
        System.out.println("删除索引位置为2的元素");
        System.out.println(list.remove(2));
        System.out.println(list);
    // String set(int index,String s)
    // 在指定位置 进行 元素替代(改)
    // 修改指定位置元素
        list.set(0, "我们");
        System.out.println(list);
    // String get(int index) 获取指定位置元素
    // 跟size() 方法一起用 来 遍历的
        for(int i = 0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    //复习增强for
        for (String string : list) {
            System.out.println(string);
        }
    }
}

运行结果:
在这里插入图片描述

List的子类

1.ArrayList集合java.util.ArrayList 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为 查询数据、遍历数据,所以 ArrayList 是最常用的集合。
2. LinkedList集合java.util.LinkedList 集合数据存储的结构是链表结构。方便元素添加、删除的集合。
3.LinkedList是一个双向链表
在这里插入图片描述
4.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。

扫描二维码关注公众号,回复: 11627948 查看本文章
import java.util.LinkedList;

public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList<String> link = new LinkedList<String>();
//添加元素
        link.addFirst("abc1");
        link.addFirst("abc2");
        link.addFirst("abc3");
        System.out.println(link);
// 获取元素
        System.out.println(link.getFirst());
        System.out.println(link.getLast());
       
// 删除元素
        System.out.println(link.removeFirst());
        System.out.println(link.removeLast());
        while (!link.isEmpty()) { //判断集合是否为空
            System.out.println(link.pop()); //弹出集合中的栈顶元素
        }
        System.out.println(link);
    }
}

输出结果:
在这里插入图片描述

Set接口

  1. Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
    2.Set 集合有多个子类,介绍其中的 java.util.HashSetjava.util.LinkedHashSet 这两个集合。

HashSet集合

1.java.util.HashSet 是 Set 接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序 不一致)。
2.HashSet 是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCode 与 equals 方法。

HashSet集合存储数据的结构(哈希表)

1.哈希表是由数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的。
在这里插入图片描述
存储流程图:
在这里插入图片描述

HashSet存储自定义类型元素

1.给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保 证HashSet集合中的对象唯一。

public class LinkedHashSetDemo {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<String>();
set.add("bbb");
set.add("aaa");
set.add("abc");
set.add("bbc");
Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}

结果:
bbb
aaa
abc
bbc

LinkedHashSet

1.在HashSet下面有一个子类 java.util.LinkedHashSet ,它是链表和哈希表组合的一个数据存储结构。

可变参数

1.JDK1.5以后。出现了简化操作。… 用在参数上,称之为可变参数。

修饰符 返回值类型 方法名(参数类型... 形参名){ }

2.代码演示:

public class ChangeArgs {
public static void main(String[] args) {
int[] arr = { 1, 4, 62, 431, 2 };
int sum = getSum(arr);
System.out.println(sum);
// 6 7 2 12 2121
// 求 这几个元素和 6 7 2 12 2121
int sum2 = getSum(6, 7, 2, 12, 2121);
System.out.println(sum2);
}
/*
* 完成数组 所有元素的求和 原始写法
public static int getSum(int[] arr){
int sum = 0;
for(int a : arr){
sum += a;
}
return sum;
}
*/
//可变参数写法
public static int getSum(int... arr) {
int sum = 0;
for (int a : arr) {
sum += a;
}
return sum;
}
}

Collections

1.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> ) :将集合中元素按照指定规则排 序。
2.代码演示:

public class CollectionsDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
//原来写法
//list.add(12);
//list.add(14);
//list.add(15);
//list.add(1000);
//采用工具类 完成 往集合中添加元素
Collections.addAll(list, 5, 222, 12);
System.out.println(list);
//排序方法
Collections.sort(list);
System.out.println(list);
}
}

结果:
[5, 222, 1, 2]
[1, 2, 5, 222]

Comparator比较器

1.默认的规则排序:AVA中提供了两种比较实现的方式。
一种是比较死板的 采用 java.lang.Comparable 接口去实现。
一种是灵活的当我需要做排序的时候在去选择的 java.util.Comparator 接口完成。
3.public static <T> void sort(List<T> list,Comparator<? super T> ) 方法灵活的完成,这个里面就涉及到了 Comparator这个接口,位于位于java.util包下,排序是comparator能实现的功能之一,该接口代表一个比较器,比 较器具有可比性!顾名思义就是做排序的,通俗地讲需要比较两个对象谁排在前谁排在后,那么比较的方法就是:
public int compare(String o1, String o2) :比较其两个参数的顺序。如果要按照升序排序, 则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数) 如果要按照 降序排序 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)
操作如下:

public class CollectionsDemo3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("cba");
list.add("aba");
list.add("sba");
list.add("nba");
//排序方法 按照第一个单词的降序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.charAt(0) ‐ o1.charAt(0);
}
});
System.out.println(list);
}
}

Comparable和Comparator两个接口的区别。

1.Comparable:强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,无需指定比较器。
2.Comparator:强行对某个对象进行整体排序,允许在排序顺序上实现精确控制

猜你喜欢

转载自blog.csdn.net/Ulrica_Amaris/article/details/107740792