我的学习之路_第七章_list集合,set集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的学习之路_第七章_list集合,set集合相关的知识,希望对你有一定的参考价值。

【List集合】

List集合存储数据的结构

堆栈:先进后出(先存进来的元素,最后取出) 例如:子弹压进弹夹

队列:先进先出(先存进来的元素,先取出来) 例如:排队

『ArrayList』 数组:查找元素快,增删元素慢 有索引

『LinkedList』 链表:查找元素慢,增删元素快 没有索引,连接的是节点 例如:手拉手

List接口方法_带索引的

add(int index ,E e) 在指定的索引上添加元素

remover(int index) 移除并返回指定索引上的元素

set(int index,E e) 修改并返回指定索引上的元素

get(int index) 返回列表中指定位置的元素

ArrayList集合


ArrayList集合存储的结构是 数组结构 ,由于日常发开中最多的功能是查询数据,遍历数据,所以ArrayList是最常用的集合.

Vector集合

Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合.Vector中提供了一种独特的取出方式就是
枚举,也就是早期的迭代器.Vector集合已被ArrayList集合替代,枚举Enumeration已被迭代器Iterator替代.

LinkedList集合

LinkedList集合采用的是链表结构,方便元素添加 删除的集合.实际开发中对一个集合元素的添加与删除经常涉及到首尾操作
而LinkeList提供了大量首尾操作的方法

addFirst(E e) 没有返回值 将置顶元素插入列表开头

addLast(E e) 没有返回值 将制定元素添加到列表的结尾

getFirst() 返回元素 返回列表中第一个元素
getLast() 返回元素 返回列表中最后一个元素

remoberFirst() 返回元素 移除并返回此列表的第一个元素
removerLast() 返回元素 移除并返回此列表中的最后一个元素

pop() 返回元素 从列表所表示的堆栈处弹出一个元素

push(E e) 没有返回值 将元素推入此列表所表示的堆栈

isEmpty() 返回一个boolean值 如果列表不包含元素,则返回true


【Set集合】

通过元素的equals方法,来判断是否为重复元素,它是个不包含重复元素的集合.set集合取出元素的方式可以采用:迭代去 增强for
set集合有多个子类,最常用的就是HashSet LinkenHashSet 这两个集合

★HashSet集合

HashSet集合中存储javaAPI提供的类型元素时,不需要重写hashCode 和equals方法. 自定义类型需要重写.

HashSet集合的自身特点: 底层数据结构是哈希表
存储和取出元素比较快
线程是不安全的,运行速度快

哈希值:哈希值是java利用操作系统底层计算得到的一个十进制数字

java中所提供的类型,都重写了hashcode

哈希值就是保证HashSet集合元素的唯一,其实就是根据对象的hashcode和equals方法来决定的.如果我们往集合中存放自定义的对象
,那么保证其唯一,就必须复写hashcode和equals方法建立属于当前对象的比较方法.


★LinkenHashSet集合

LinkendHashSet集合采用了链表和哈希表组合的一个数据存储结构,所以这个集合的特点就是,保证了数据的唯一性,还是一个有序集合.


判断集合元素唯一的原理


1. ArrayList的contains方法,可以判断元素是否重复(比较麻烦,一般不用)
返回一个boolean值 contains(Object o) 如果列表中包含指定的元素,则返回true

ArrayList的contains方法会使用方法调用是,传入的元素的equals方法依次和集合中的就元素所比较,从而根据返回的布尔值判断
是否有重复元素.当
当ArrayList集合存放的是自定义类型时,由于自定义类型为重写equals方法前,判断是否重复的依据是地址值,所以如果想根据内容
判断是否为重复元素,需要重写元素的equals方法.

2.HashSet的add/contains等方法判断冤死是否重复原理

返回一个boolean值 add(E e) 如果此set中为包含指定元素,则添加指定元素
返回一个boolean值 contains(Object o) 如果此set包含指定元素,则返回true.

set集合不能存放重复元素,其添加方法在添加时会判断是否有重复元素,有重复不添加,没重复则添加.
Hashset集合由于是无序的,起判断唯一的依据是元素类型的hashcode与equals方法的返回结构.

规则如下:先判断新元素与集合内已经有的旧元素的hashcode值
●如果不同,说明是不同元素,添加到集合.
●如果相同,在判断equals比较结果.返回true则相同元素;返回false则不同元素,添加到集合.

所以在使用hashset存储自定义类型时要重写hashcode和equals.


Collection类

List : 可以存储重复元素,有序的 有索引

ArrayList 底层数据结构是数组,查询快,增删慢 线程不安全,效率高
LinkedList 底层数据结构是链表,查询慢,增删快 线程不安全,效率高

Set :不能存储重复元素

HashSet 无序的 元素唯一不能重复,底层是哈希表结构 自定义类型要重写hashcode和equals
LinkedHashSet 有序的,双向链表 底层是哈希表结构+链表结构 元素唯一不能重复


面试题:

两个对象 person p1 p2

问题1:如果两个对象的哈希值相同,p1.hashcode()==p2.hashcode()
两个对象的equals一定会返回true吗? p1.equals(p2)一定是true吗?

答案:不一定

问题2:如果两个对象的equals方法返回true,p1.eqyals(p2)=true
两个对象的哈希值一定相同吗?

答案:一定(hashCode 的常规协定)

 

以上是关于我的学习之路_第七章_list集合,set集合的主要内容,如果未能解决你的问题,请参考以下文章

Python学习之路:集合的使用

PYTHON学习之路_PYTHON基础

我的学习之路_第六章_迭代器,泛型

Python学习笔记六:集合

[知了堂学习笔记]_集合接口list与集合接口set的区别

Python之路12-集合