List、Set、数据结构、Collections

学习目标

  • 能够说出常见得数据结构有哪些及其特点
  • 能够说出数组结构特点
  • 能够说出栈结构特点
  • 能够说出数组结构特点
  • 能够说出单向链表结构特点
  • 能够说出红黑树特点
  • 能够说出list集合特点
  • 能够说出Set集合的特点
  • 能够说出哈希表的特点
  • 使用HashSet集合存储自定义元素
  • 能够说出可变参数的格式
  • 能够使用集合工具类
  • 能够使用Comparator比较器进行排序

1.栈结构特点

又称堆栈,它是运算受限得线性表,只允许一端进行插入和删除(只有一个口,先进后出,类似弹夹)

2.队列结构特点

队列只允许一端插入一端删除(两个口,先进先出,类似安检)

3.数组结构特点

数组,在内存中开辟一段连续的内存空间。特点是查询快,增删慢。原因是查询数组中长度固定并连续,知道开头位置和偏移量就能知道元素具体地址;增删慢是因为需要重新创建新数组,复制删除或增加的其他元素到新数组中,在指定位置进行添加和删除操作。

image

4.链表结构特点

链表,查询慢,增删快。因为链表地址非连续,必须重头开始查询,当增加/删除元素对链表结构没有影响,所以增删快。

  • 单向列表:链表中只有一个链子,不能保证元素顺序

  • 双向列表:链表中有两条链子,专门纪录元素顺序,是一个有序集合。

    image

    image

5.红黑树特点

红黑树,趋近于平衡树,查询得速度非常快,查询叶子节点最大次数和最小次数不能超过2倍

image

6.list接口特点

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) :用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
  • ArrayList集合 底层是一个数组结构,查询快,增删慢。
  • 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。
  • Vector集合单线程集合

7.Set接口的特点

无序集合,不允许重复元素。没有索引,没有带索引得方法,不能for循环遍历

  • HashSet是 Set 接口的一个实现类,不允许重复元素,存取顺序可能不一致。
  • hash值:是一个十进制整数,系统随机给出(是逻辑地址,不是真实得存储物理地址)

HashSet存储数据结构(哈希表),jdk>=1.8 哈希表=数组+红黑树 ,jdk<1.8 哈希表=数组+链表。

1.Hashset存储数据步骤:

  • 第一步,开辟数组空间,先计算元素得hash值
  • 第二步,不同哈希值放在数组空间内,相同hash值形成链表(红黑树)==【当链表长度超过8位,会把链表转成红黑树】==

2.set元素不允许存储重复元素原理

set元素在调用add()方法时,add()方法会调用元素得hashcode方法和equals方法,判断是否重复。


image

3.HashSet存储自定义类型元素

需求:同名同年龄,视为同一个人,只能存储一次。

回答:重写equals()和hashCode()方法。

代码如下:

public class Student { 

    private String name; 
    private int age;
    public Student() {}
     public Student(String name, int age) {
        this.name = name;
        this.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 == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    
}


 public class HashSetDemo2 {
        public static void main(String[] args) {
            //创建集合对象 该集合中存储 Student类型对象
            HashSet<Student> stuSet = new HashSet<Student>();
            //存储 
            Student stu = new Student("于谦", 43);
            stuSet.add(stu);
            stuSet.add(new Student("郭德纲", 44));
            stuSet.add(new Student("于谦", 43));
            stuSet.add(new Student("郭麒麟", 23));
            stuSet.add(stu);
            for (Student stu2 : stuSet) {
            System.out.println(stu2);
            }
        }
    }
    
    执行结果:
    Student [name=郭德纲, age=44]
    Student [name=于谦, age=43] 
    Student [name=郭麒麟, age=23]

4.LinkedHashSet集合特点

继承Hashset集合,不重复,底层是哈希表(数组+链表/红黑树)+链表(纪录元素得存储位置),保证元素有序。

5.可变参数

jdk1.5之后出现的新特性,方法类型已知,个数未知.(数据类型 ...),其原理底层是一个数组,根据传递参数不同,创建不同长度数组来存储参数个数。

8.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> ) :将集合中元素按照指定规则排 序。

1.Comparator比较器

public static <T> void sort(List<T> list) :将集合中元素按照默认规则排序。

  Collections.sort(list, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.charAt(0) ‐o1.charAt(0);
            }
        });
        
  public class Student implements Comparable<Student> {

        @Override
        public int compareTo(Student o) {
            return this.age‐o.age;//升序 } }
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,565评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,021评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,003评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,015评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,020评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,856评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,178评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,824评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,264评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,788评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,913评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,535评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,130评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,102评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,334评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,298评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,622评论 2 343

推荐阅读更多精彩内容