JavaSE集合之数据结构day10

JavaSE集合之数据结构day10

第一章 数据结构

1.1常见的数据结构

1.1.1栈
  • 栈:stack,又称堆栈,它是运输受限的的线性表,其限制是仅允许在标的同一端进行插入和删除操作,不允许在其他任何位置进行添加,查找,删除,等操作
  • 先进后出
  • 栈的入口,出口都是栈的顶端位置
  • 栈的图像理解

1.1.2 队列
  • 队列:queue,简称队,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。
  • 先进先出
  • 队列的入口,出口各占一侧
  • 队列的图型理解

1.1.3 数组
  • 数组:Array,是有序的元素序列,数组是在内存中开辟一段连续的空间,并在次空间存放元素。
  • 查找速度快
  • 增删元素慢
  • 快慢的图形理解

1.1.4 链表
  • 链表:linked list,由一系列结点node(链表中每一个元素称为结点)组成,结点可以动态生成,每一个结点包含两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

  • 查找元素慢

  • 增删元素快

  • 快慢图形理解

1.1.5红黑树
  • 二叉树:binary tree,是每个结点不超过2的有序树(tree)。

  • 树的概念和理解

第二章 List集合

1. List接口介绍

  • List接口的特点
    1. 它是一个元素存取有序的集合。
    2. 它是一个带索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)
    3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素

2.List接口1中常用方法

  • public void add(int index,E element): 将指定的元素,添加到该集合的指定位置上

  • public E remove(int index):移除列表中指定的位置元素,返回的是被移除的元素

  • public E set(int index, E element); 用指定的元素替换集合中指定位置的元素,返回值的更新前的元素

package collective.List;

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

/*
   java.util.list 接口,Collection 接口
   List接口的特点:
       1.有序的集合,存储元素和取出元素的顺序是一致的(存储123  取出123)
       2.有索引,包含了一些带索引的方法
       3.允许存储重复的元素
   注意:
       操作索引的时候,防止索引越界异常
 */
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);//不是地址重写了toString

        //public void add(int index,E element): 将指定的元素,添加到该集合的指定位置上
        //在c,d之间添加呆呆哥
        list.add(3,"呆呆哥");
        System.out.println(list);

        //public E remove(int index):移除列表中指定的位置元素,返回的是被移除的元素
        String remove= list.remove(2);
        System.out.println("被移除的元素是:"+remove);
        System.out.println(list);

        //public E set(int index, E element); 用指定的元素替换集合中指定位置的元素,返回值的更新前的元素
        String set =list.set(3,"呆大哥");
        System.out.println("被替换的元素是:"+set);
        System.out.println(list);

        //List集合遍历有三种方式
        //使用普遍的for循环
        for (int i = 0; i < list.size(); i++) {
            //public E get(int index):返回集合中指定位置的元素
            String s =list.get(i);
            System.out.print(s+"\t");
        }
        System.out.println();
        System.out.println("===========");
        //使用迭代器
        Iterator<String> it = list.iterator();
        while (it.hasNext()){
            String s = it.next();
            System.out.print(s+"\t");
        }
        System.out.println();
        System.out.println("=========");
        //使用增强for循环
        for (String s : list) {
            System.out.print(s+"\t");
        }
        System.out.println();
    }
}


结果:
[a, b, c, d, a]
[a, b, c, 呆呆哥, d, a]
被移除的元素是:c
[a, b, 呆呆哥, d, a]
被替换的元素是:d
[a, b, 呆呆哥, 呆大哥, a]
a	b	呆呆哥	呆大哥	a	
===========
a	b	呆呆哥	呆大哥	a	
=========
a	b	呆呆哥	呆大哥	a	

第三章 List的子类

3.1 ArrayList集合

java.util.ArrayList 集合数据结构存储的结构是数据结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据,遍历数据,所以ArrayList是最常用的集合。

3.2 LinkedList集合

  • public void addFirst(E e) 将指定元素插入此列表的开头。

  • public void addLast(E e)将指定元素添加到此列表的结尾。

  • public void push(E e)将元素推入此列表所表示的堆栈。换句话说,将该元素插入此列表的开头。 此方法等效于 addFirst(E)。

  • public E getFirst()返回此列表的第一个元素。

  • public E getLast()返回此列表的最后一个元素。

  • public E removeFirst()移除并返回此列表的第一个元素。

  • public E removeLast()移除并返回此列表的最后一个元素。

  • public E pop()从此列表所表示的堆栈处弹出一个元素。换句话说,移除并返回此列表的第一个元素。此方法等效于 removeFirst()。

  • public boolean isEmpty(): 如果列表不包含元素,则返回true

package collective.List;

import java.util.LinkedList;

/*
     java.util.LinkedList集合 implement list 接口
     LinkedList集合的特点:
         1.底层是一个链表结构:查询慢,增删快
         2.里面包含了大量的操作首尾元素的方法
         注意:使用了LinkedList集合的方法,不能使用多态
 */
public class Demo02List {
    public static void main(String[] args) {
        show01();
    }
    public static void show01(){
        //创建LinkedList集合对象
        LinkedList<String> linked  = new LinkedList<>();
        //使用add方法往集合中添加元素
        linked.add("a");
        linked.add("b");
        linked.add("c");
        System.out.println(linked);

        //public void addFirst(E e) 将指定元素插入此列表的开头。
        linked.addFirst("呆呆哥");
        System.out.println(linked);

        //public void addLast(E e)将指定元素添加到此列表的结尾。
        linked.addLast("呆小妹");
        System.out.println(linked);

        //public void push(E e)将元素推入此列表所表示的堆栈。换句话说,
        // 将该元素插入此列表的开头。 此方法等效于 addFirst(E)。
        linked.push("呆大哥");
        System.out.println(linked);

        //public E getFirst()返回此列表的第一个元素。
        //public E getLast()返回此列表的最后一个元素
        String first = linked.getFirst();
        System.out.println("第一个数是:"+first);
        String last = linked.getLast();
        System.out.println("最后一个数是:"+last);

        // public E removeFirst()移除并返回此列表的第一个元素。
        //public E removeLast()移除并返回此列表的最后一个元素。
        //public E pop()从此列表所表示的堆栈处弹出一个元素。换句话说
        //移除并返回此列表的第一个元素。此方法等效于 removeFirst()。
        String refirst = linked.removeFirst();
        System.out.println("移除第一个是:"+refirst);
        String  relast = linked.removeLast();
        System.out.println("移除最后一个是:"+relast);
        String  pop = linked.pop();
        System.out.println("移除最后一个是:"+pop);

        //public boolean isEmpty(): 如果列表不包含元素,则返回true
        System.out.println("列表中不存在元素:"+linked.isEmpty());
        System.out.println(linked);


    }
}


结果:
[a, b, c]
[呆呆哥, a, b, c]
[呆呆哥, a, b, c, 呆小妹]
[呆大哥, 呆呆哥, a, b, c, 呆小妹]
第一个数是:呆大哥
最后一个数是:呆小妹
移除第一个是:呆大哥
移除最后一个是:呆小妹
移除最后一个是:呆呆哥
列表中不存在元素:false
[a, b, c]

第四章 Set接口

java.uitl.Set接口和java.util.List接口一样,同样继承Collection接口中的方法基本一致。

java.util.Set接口 extends Collection接口

  • Set接口的特点:

    1. 不允许存储重复的元素

    2. 没有索引,没有带索引的方法,也不能使用普通的for循环遍历

4.1 HashSet集合介绍

java.util.HashSet集合 implements Set接口

  • HashSet特点:

    1. 不允许存储重复的元素

    2. 没有索引,没有带索引的方法,也不能使用普通的for循环遍历

    3. 是一个无序的集合,存储元素和取出元素的顺序有可能不一致

    4. 底层是一个哈希表结构(查询的速度非常快)

package collective.Set;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/*
     java.util.Set接口 extends Collection接口
     Set接口的特点:
         1.不允许存储重复的元素
         2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
     java.util.HashSet集合 implements Set接口
     HashSet特点:
         1.不允许存储重复的元素
         2.没有索引,没有带索引的方法,也不能使用普通的for循环遍历
         3.是一个无序的集合,存储元素和取出元素的顺序有可能不一致
         4.底层是一个哈希表结构(查询的速度非常快)
 */
public class Demo01Set {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        //添加元素add
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(1);
        set.add(5);
        //使用迭代器遍历
        Iterator<Integer> it =set.iterator();
        while (it.hasNext()){
            Integer integer = it.next();
            System.out.print(integer+"\t");
        }
        System.out.println();
        System.out.println("=============");
        //增强for循环
        for (Integer integer : set) {
            System.out.print(integer+"\t");
        }
    }

}


结果:
1	2	3	5	
=============
1	2	3	5

4.2 哈希值

  • 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址不是数据实际的物理地址)在Object类有一个方法,可以获取对象的哈希码值

  • hashCode方法的源码:

    ​ public native int hashCode();

    ​ native:代表该方法调用的是本地操作系统方法

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

  • 什么是哈希表?

    • 在JDK1.8之前,哈希表底层采用数组+链表实现
    • 在JDK1.8中,哈希表存储采用数组+链表+红黑树实现,当链表超过阙值(8)时,将链表转换成红黑树,减少时间
  • 图形理解

4.3 HashSet存储自定义类型元素

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

package collective.Set;

import java.util.HashSet;

public class Demo02HashSetString {
    public static void main(String[] args) {
        //创建HashSet集合对象
        HashSet<String> set = new HashSet<>();
        String s1 =new String("abc");
        String s2 =new String("abc");
        set.add(s1);
        set.add(s2);
        set.add("重地");
        set.add("通话");
        System.out.println(set);
    }
}

结果:
    [重地, 通话, abc]
  • 自定义元素
package collective.Set;

import java.util.Objects;

public class Person {
    private String name;
    private  int age ;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person person = (Person) o;
        return getAge() == person.getAge() &&
                Objects.equals(getName(), person.getName());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getName(), getAge());
    }
}

package collective.Set;

import java.util.HashSet;

/*
     HashSet存储自定义类型元素

     set集合抱错元素唯一
       存储元素(String Integer,.....)必须重写hasCode方法和equals方法
     要求:
         同名同年纪的人只能存储一次。
 */
public class Demo03HashSetPerson {
    public static void main(String[] args) {
       //创建HashSet集合存储Person
        HashSet<Person> set =new HashSet<>();
        Person p1 = new Person("呆呆哥",22);
        Person p2 = new Person("呆呆哥",22);
        Person p3 = new Person("呆呆妹",21);
        set.add(p1);
        set.add(p2);
        set.add(p3);
        System.out.println(set);
    }
}




结果:
[Person{name='呆呆哥', age=22}, Person{name='呆呆妹', age=21}]

4.4 LinkedHashSet集合

  • 它是链表和哈希表组合的一个数据存储结构(有序)
package collective.Set;

import java.util.HashSet;
import java.util.LinkedHashSet;

/*
     java.util.LinkedHashSet 集合extends HashSet
     LinkedHashSet集合特点:
        底层是一个哈希表(数组+链表/红黑树)+链表:
        多了一条列表(记录元素的存储顺序),保证元素有序
 */
public class Demo04LinkedHashSet {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("呆大哥");
        set.add("呆小妹");
        set.add("abc");
        set.add("abc");
        set.add("呆呆哥");
        System.out.println(set);//无序,不允许重复

        System.out.println("=================");
        LinkedHashSet<String> linked  = new LinkedHashSet<>();
        linked.add("呆大哥");
        linked.add("呆小妹");
        linked.add("abc");
        linked.add("abc");
        linked.add("呆呆哥");
        System.out.println(linked);//有序不重复
    }
}




结果:
[呆大哥, abc, 呆呆哥, 呆小妹]
=================
[呆大哥, 呆小妹, abc, 呆呆哥]

总结

​ 今天很认真的在学,收获到了也很多表现不错,给自己一个摸摸哒。明天的话就可以把集合看完,然后就可以进攻I/O流了。今天还写了一个斗地主的案例,虽然在程序里跑出来,但是感觉还是不错的。这个是集合类的结合,下来可以以写斗地主为例子来联系和巩固集合类的知识。今天还发现了一个最傻瓜的问题就是我他喵的把Demo写成了Doem,你他喵的是没入门蛮。这么简单的单词都写错了,这个以后经常用到。以后写错了别人还以为你是一个菜鸡,所以说细节是很重要滴。加油哦!!!

​ 2020/7/21 23:04

​ 二号楼 314

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值