数据结构
常见的数据结构:栈、队列、数组、链表、红黑树
栈: 先进后出,后进先出
队列: 先进先出
数组: 查询快,增删慢
链表: 查询慢,增删快
红黑树:
List集合
java.util.list接口 extends Collection接口
list接口的特点:
- 有序的集合,存储元素和取出元素的顺序是一致的(存储123,取出123)
- 有索引,包含了一些带索引的方法
- 允许存储重复的元素
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):用指定元素替换集合中指定位置的元素,返回值的更新前的元素
注意:
操作索引的时候,一定要防止索引越界异常
IndexOutBoundsException:索引越界异常,集合会报
ArrayIndexOutOfBoundsException:数组索引异常越界
StringIndexOutOfBoundsException:字符串索引越界异常
List的子类
ArrayList集合、LinkedList集合
ArrayList集合(底层数组)、LinkedList集合(底层链表)
LinkedList集合
java.util.LinkedList集合 implements List接口
LinkedList集合的特点:
- 底层是一个链表结构,查询慢,增删快
- 里边包含了大量操作首尾元素的方法
注意:使用LinkedList集合特有的方法,不能使用多态
public void addFirst(E e)将指定的元素插入此列表的开头
public void addLast(E e)将指定的元素插入此列表的结尾
public void push(E e)将元素推入此列表所表示的堆栈
public E getFirsr()返回此列表的第一个元素
public E getLast()返回此列表的最后一个元素
public E removeFirst()移除并返回此列表的第一个元素
public E removeLast()移除并返回此列表的最后一个元素
public E pop()从此列表所表示的堆栈处弹出一个元素
public boolean isEmpty()如果列表不包含元素,则返回true
Set接口
java.util.Set接口 extends Collection接口
Set接口特点:
- 不允许存储重复元素
- 没有索引,没有索引的方法,也不能使用普通的for循环遍历
HashSet集合
HashSet特点:
- 不允许存储重复元素
- 没有索引,没有索引的方法,也不能使用普通的for循环遍历
- 是一个无序的集合,存储元素和取出元素的顺序有可能不一致
- 底层是一个哈希表结构(查询速度非常快)
哈希值:是一个十进制的整数,由系数随机给出(就是对象的地址,是一个逻辑地址是模拟出来得到的地址,不是数据实际存储的物理地址)
在Object类有一个方法,可以获取对象的哈希值
int hashCode()返回该对象的哈希码值
hashCode方法的源码:
public native int hashCode();
native:代表该方法调用的是本地操作系统的方法
哈希表
Set集合不允许存储重复的原理
HashSet存储自定义类型元素
Set集合报错元素唯一:
存储的元素(String,Integer,…,Student,Person…),必须重写hashCode和equals方法
java.util.LinkedHashSet集合 extends HashSet集合
LinkedHashSet集合特点:
底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储元素顺序),保证元素有序
HashSet:无序,不允许重复
LinkedHashSet:有序,不允许重复
可变参数
使用前提:
当方法的参数列表数据类型已经确定,但是参数的个数还不确定,就可以使用可变参数。
使用格式:定义方法时使用
修饰符 返回值类型 方法名(数据类型…变量名){}
可变参数的原理:
可变参数底层就是一个数组,根据传递参数个数不同,会创建不同长度的数组,来存储这些参数
传递的参数个数,可以是0个(不传递),1,2…多个
可变参数的注意事项:
- 一个方法的参数列表,只能有一个可变参数
- 如果方法的参数有多个,那么可变参数必须写在参数列表的末尾
Map集合
java.util.Map<k,v>集合
Map集合的特点:
- Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
- Map集合中的元素,key和value的数据类型可以相同,也可以不同
- Map集合中的元素,key是不允许重复的,value是可以重复的
- Map集合中的元素,key和value是一一对应的
java.util.HashMap<k,v>集合 implements Map<k,v>接口
HashMap集合的特点:
- HashMap集合底层是哈希表:查询速度特别的快
JDK1.8之前:数组+单向链表
JDK1.8之后:数组+单向链表/红黑树(链表的长度超过8):提高查询的速度 - HashMap集合是一个无序的集合,存储元素和取出元素的顺序有可能不一致
java.util.LinkHashMap<k,v>集合 extends HashMap<k,v>集合
- LinkHashMap集合底层是哈希表+链表(保证迭代的顺序)
- LinkHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的。
Map接口中的常用方法
V put(K key, V value)
将指定的值与此映射中的指定键关联(可选操作)。
返回值:v
- 存储键值对的时候,key不重复,返回值v是null
- 存储键值对的时候,key重复,会使用新的value替换map中重复的value,返回被替换的value值
V remove(Object key)
如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
返回值:v
- key存在,v返回被删除的值
- key不存在,v返回null
V get(Object key)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。
返回值:
- key存在,v返回被删除的值
- key不存在,v返回null
boolean containsKey(Object key)
如果此映射包含指定键的映射关系,则返回 true。
包含返回true,不包含返回false
Map集合遍历键找值方式
Map集合的第一种遍历方式:通过键找值的方式
Map集合中的方法:
Set keySet()
返回此映射中包含的键的 Set 视图。
实现步骤:
- 使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个集合当中
- 遍历Set集合,获取Map几个中的每一个key
- 通过Map集合中的方法get(key),通过key找到value
Entry键值对 对象
Map集合遍历的第二种方式:使用Entry对象遍历
Map集合中的方法:
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射关系的 Set 视图。
实现步骤:
- 使用Map集合中的方法entrySet(),吧Map集合中多个Entry对象取出来,存储到一个Set集合中
- 遍历Set集合,获取每一个Entry对象
- 使用Entry对象中的方法getKey()和getValue()获取键与值
HashMap存储自定义类型键值
Map集合包装key是唯一的:
作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一
HashMap存储自定义类型键值
key:Person类型
Person类就必须重写hashCode方法和equals方法
value:String类型
可以重复
java.util.LinkHashMap<k,v> extends HashMap<k,v>
Map接口的哈希表和连接列表实现,具有可预知的迭代顺序
底层原理:
哈希表+链表(记录元素的顺序)
Map集合的练习
JDK9的新特性:
List接口,Set接口,Map接口:里边增加了一个静态的方法of,可以给集合一次性添加多个元素
static List of (E…elements)
使用前提:
当集合中存储的元素的个数已经确定了,不在改变时使用
注意:
- of方法只适用于List接口,Set接口,Map接口,不适用于接口的实现类
- of方法的返回值是一个不能改变的集合,集合不能使用add,put方法添加元素,会抛出异常
- set接口和Map接口在调用of方法的时候,不能有重复的元素,否则会抛出异常。
斗地主案例需求分析(双列)
代码实现