我的学习之路_第七章_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 的常规协定)

时间: 06-10

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

我的学习之路_第二十三章_HTML

Html : 超级文本语言 ( Hyper text Markup Language ) HTML 文件扩展名是 * .html HTML 结构都是有标签组成 通常情况下标签有开始标签和结束标签组成 例如 : <a> </a> 围堵标记 如果没有结束标签,不能写文本 例如<img/> 空标记 标签中可以有属性 属性的书写格式: 属性名= "属性值"; 文字类标签: <hn> </hn> n是一个可变参数 n的取值范围1-6 ,

我的学习之路_第二十七章_jQuery

jQueryjs类库 把常用对象或者方法封装起来,让我们写代码效率更高 1.jQuery 2.extjs [jQuery入门] jQuery的引入: 通过script标签的src属性引入 入门: 获取jQuery对象 $(选择器) == jQuery(选择器) 获取值 jQuery.val(); jQuery对象和Dom对象的转换 Dom对象转jQuery对象 : var jQuery对象 = $(dom对象); jQuery对象换Dom对象 : 方式一: var Dom = jQuery对象[

我的学习之路_第十七章_JavaUtils

[BeanUtils工具类] javaBaen : Java和数据库所对应关系实体类 表(Utils)-->类(User) 表中的列-->类中字段(属性) 表中的行-->根据类创建的对象 javaBean包含: 1.私有的成员变量 2.公共的getter/setter方法 3.空参数构造方法 4.toSting方法 5.实现序列化接口 BeanUtils工具类的三个方法:(工具类的方法都是静态的,直接类名.方法调用) 没有返回值 setProperty(Object obj ,Strin

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

[Collection] 类 接口类 所属包:java.util.Collection Collection类是集合的最顶层的接口,定义了集合共性的方法. 接口无法创建对象,使用多态的方式创建对象 Collection<集合中的数据类型(泛型)> 变量名 = new ArrayList<集合中的数据类型(泛型)>(); Collection接口常用子类接口有: List接口 set接口 List接口常用子类有: ArrayList类 LinkedList类 set接口常用的子类有:

我的学习之路_第五章_Data,正则

Date 类 (时间类) 所属包:java.util.Date 构造方法: public Date() 返回的是当前时间 也就是1970-1-1到电脑目前的时间值,用毫秒来表示 public Date(long 毫秒值) 返回指定毫秒值的时间 方法: 返回值 long getTime() 返回当前时间的毫秒值 没有返回值 setTime(long 毫秒值) 设置当前时间的毫秒值 java中的时间原点为:1970-1-1 00:00:00毫秒值的换算: 1秒=1000毫秒 DateFormat (

我的学习之路_第三章_匿名内部类

final: final是最终修饰符,可以修饰类.成员方法.变量. final修饰的类无法被继承. final修饰的方法无法被重写. final修饰的变量无法被再次赋值,变为了常量. final修饰的引用数据类型变量,可以修改对象里面的属性内容,不可改变地址值 final修饰的成员变量,不能使用默认值,没有意义,必须在创建对象之前完成赋值. static: 静态修饰符,被static修饰的内容属于类不专属于某个对象,多个对象共享使用这一个成员 使用static修饰的成员可以用类名直接访问,建议这

我的学习之路_第三一章_servletContext

servletContext ServletContext代表的是整个项目 [域对象] 就是一个Map<String,Object>,ServletContext代表的是整个项目,所以sercletContext域是可以被所有用于,所有页面,在任何时候都能访问到的一个公共空间. ServletContext域的使用: 返回值 : void setAttribute(String key,Object value) 返回值 : Object getAttribute(String key) 返回

我的学习之路_第十一章_字符流

[字符流] IO流的分类 ★字节流 操作的文件不是文本文件 字节输入流: InputStream 抽象类 FileInputStream操作文件的字节输入流 字节输出流: OutputStream 抽象类 FileOutputStream操作文件的字节输出流 ★字符流 操作的文件是文本文件 字符输入流: Reader 抽象类 FileReader 用来操作文件的字符输入流 字符数出流: Writer 抽象类 FileWriter 用来操作文件的字符输出流 [转换流] ▲OutputStreamW

我的学习之路_第四章_异常

一 Object 类 equals方法: 四则运算是不能操作引用类型的 ,而 == 可以操作引用类型,但是在任何时刻只要是用 == 比较引用类型,比较的永远都是地址值. 返回类型 Boolean 比较两个对象是否相等,比较的是地址值 Object 的equals方法比较的是地址值,子类可以重写此方法,比较两个对象的属性值 toString方法: 返回类型String toString()返回对象的字符串表现形式 类型[email protected]+哈希值(地址值) 看一对象的地址值,只能区分