数据结构,List,Set,Collections的理解

数据结构,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.HashSetjava.util.LinkedHashSet

Set集合元素不重复原理
在这里插入图片描述

HashSet集合

java.util.HashSetSet接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。

其底层实现是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, 12);
        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 //降序
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值