Java数据结构

在这里插入图片描述

  • List接口中常用方法

List 作为Collection集合 的子接口, 不但继承了 Collection 接口中的全部方法, 而且还增加了一些根据元素索引来操作集合的特有方法

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集合

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

  • LinkedList集合

java.util.LinkedList 集合数据存储的结构是链表结构, 方便元素添加, 删除的集合

LinkedList 是一个双向链表, 那么双向链表是什么样子的呢?

实际开发对一个集合元素的添加与删除经常涉及到首尾操作, LinkedList提供大量的首尾操作的方法

public void addFirst(E e) : 将指定元素插入到此列表的开头
public void addLast(E e) : 将指定元素插入到此列表的结尾
public void getFirst() : 获取此列表的第一个元素
public void getLast() : 获取此列表的最后一个元素
public void removeFirst() : 移除并返回此列表的第一个元素
public void removeLast() : 移除并返回此列表的最后一个元素
public E pop() : 从此列表中所表示的栈出弹出栈顶的一个元素
public E push() : 将元素推入到此列表所表示的栈
public boolean isEmpty() : 如果列表不包含元素, 则返回true
LinkedList 是 List的子类, List中的方法LinkedList都是可以使用的

  • Set接口

java.util.Set 接口和 javautil.List 接口一样, 同样继承自 Collection接口, 它与Cllevtion接口中的方法基本一致, 并没有对Collection接口进行功能上的扩充, 只是比 Collection 接口国家严格了, 与List 接口的不同是, Set 接口中元素无序, 并且都会以某种规则保证存入的元素不会出现重复

Set 集合有多个子类, 这里介绍java.util.HashSet, java.util.LinkedHashSer

Set集合取出元素的方式可以采用 : 迭代器, 增强for

  • HashSet集合

java.util.HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。java.util.HashSet底层的实现其实是一个java.util.HashMap , 查询的速度非常快

HashSet 是根据对象的哈希值来确定元素在集合中存储的位置, 因此具有良好的存取和查找性能, 保证元素唯一性的方式依赖于 : hashCode 与 equals 方法

HashSet集合存储数据的结构(哈希表)
在JDK1.8之前, 哈希表底层此案有数组+链表实现, 即使用链表处理冲突, 同一hash值的链表都存储在一个链表里; 但是当位于一个桶中的元素较多, 即has值相等的元素较多时, 通过key值一次查找的效率降低; 在JDK1.8中, 哈希表采用数组+链表+红黑树实现, 当链表长度超过阈值( 8 )时,将链表转换为红黑树

总而言之, JDK1.8引入红黑树大程度优化了HashMap的性能, 那么对于我们来讲保证HashSet 集合元素的唯一, 其实就是根据对象的hashCode和equals方法来决定的, 如果我们往集合中存放自定义的对象, 那么保证其唯一, 就必须复写hashCode和equals方法建立属于当前对象的比较方式

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

set集合不允许重复元素的原理

先调用hashcode方法判断哈希值是否相等, 若相等则为哈希冲突; 继续调用equals方法判断是否为同一对象

  • LinkedHashSet

HashSet 保证元素唯一, 可是元素存放进去是没有顺序的, 我们要保证有序, 怎么办?

在HashSet 下有一个子类java.util. LinkedHashSet , 它是链表和哈希表组合的一个数据存储结构

  • Map

概述
像生活中 IP与主机名, 身份证与个人, 系统用户名与系统用户对象, 这种一一对应的关系,就叫做映射; Java专门提供了专门的集合类用来存放这种对象关系的对象 ,即 java.util.Map 接口

Collection与Map 他们的存储数据的形式不同

Collection中的集合, 元素时孤立存在的, 向集合中存储元素采用一个个元素的方式存储; 它是单列集合
Map 中的集合, 元素是成对存在的(键值对), 每个元素由键与值两部分组成, 通过键找到所对应的值, 它是双列集合
Map常用子类
常用的有HashMap集合, LinkedHashMap集合

HashMap : 存储数据采用的哈希表结构, 元素的存取顺序不能保证一致, 由于要保证键的唯一, 不重复, 需要重写键的hashCode方法, equals方法
LinkedHashMap : 存储数据采用的哈希表+链表结构; 通过链表结构可以保证元素的存取顺序一致, 通过哈希表结构可以保证键的唯一, 不重复, 需要重写键的hashCode()方法、equals()方法
Map接口中的集合都有两个泛型变量(键与值), 在使用时 , 要为两个泛型变量赋予数据类型; 两个泛型变量的数据类型可以相同, 也可以不同

Map接口中常用的方法
Map接口中定义了很多的方法, 常用的如下:

public V put(K key, V value) : 把指定的键与指定的值添加到Map集合中
public V remove(Object key) : 把指定的键 所对应的键值对元素 在Map集合中删除, 并且返回被删除元素的值
public get(Object key) : 根据指定的键, 在Map集合中获取对应的值
boolean containsKey(Object Key) : 判断集合中是否包含指定的键
public Set keySet() : 获取Map集合中所有的键, 存储到Set集合中
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)

Map集合遍历键找值的方式
先取出Map集合中 所有的键添加到一个 Set集合中, 然后for增强循环这个 Set, 得到每个key从而获取每个键

分析步骤:

获取Map中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。方法提示:keyset()
遍历键的Set集合,得到每一个键。
根据键,获取键所对应的值。方法提示:get(K key)

Entry键值对对象
Map中存放的是两种对象, 一种为key, 一种为value; 他们在Map中是一一对应关系, 这一对对象又称为Map的一个 Entry项, Entry 将键值对的对应关系封装成了对象, 即键值对对象; 这样我们在遍历Map集合时, 就可以从每一个键值对 Entry 对象中获取对应的键与对应的值

Entry 表示一对键和值对象, 也提供了获取对应键和对应值的方法

public K getKey() : 获取Entr对象中的键
public V getValue() : 获取Entry对象中的值
从Map集合中获取所有Entry对象的方法:

public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合只能怪所有的键值对 对象的集合(Set集合)

Map集合遍历键值对方式
键值对方式 : 通过集合中每个键值对(Entry)对象, 获取键值对(Entry)对象中的键与值

操作步骤:

获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示:entrySet()
遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象
通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示:getkey() getValue()
注意 : Map集合不能直接使用迭代器或者 forearch进行遍历; 但是转成Set之后就可以使用了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值