5.List集合
(1)介绍常用方法
java.util.List接口 extends Collection接口
List接口的特点:
1>有序的集合,存储元素和取出元素的顺序是一致的(存储123取出123)
2>有索引,包含了一些带索引的方法
3>允许存储重复的元素
List接口中带索引的方法(特有):
-public voidadd(int index,E element):将指定的元素,添加到该集合中的指定位置上
-public E get(intindex):返回集合中指定位置的元素
-public Eremove(int index):移除列表中指定位置的元素,返回的是被移除的元素
-public E set(intindex,E element):用指定元素替换集合中指定位置的元素,返回值的更新前的元素
注意:
操作索引的时候,一定要防止索引越界异常。
(2)ArrayList集合
java.util.ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能是查询数据,遍历数据,所以ArrayList是最常用的集合。
(3)LinkedList集合
java.util.LinkedList集合implements List接口
LinkedList集合的特点:
1>底层是一个链表结构:查询慢,增删快
2>里边包含了大量的操作首尾元素的方法
注意:使用LinkedList集合特有的方法,不能使用多态
-public void addFirst(E e):将指定元素插入到此列表的开头
-public void addLast(E e):将指定元素插入到此列表的结尾(此方法等效于add();)
-public void push(E e):将元素推入此列表所表示的堆栈
-public E getFirst():返回此列表的第一个元素
-public E getLast():返回此列表的最后一个元素
-public E removeFirst():移除并返回此列表的第一个元素
-public E removeLast():移除并返回此列表的最后一个元素
-public E pop():从此列表所表示的堆栈处弹出一个元素
-public boolean isEmpty():如果列表不包含元素,则返回true
(4)Vector集合(了解)
Vector类可以实现可增长的对象数组。与新collection实现不同,Vector是同步的,也就是单线程。
-void addElement(E obj):将指定的组件添加到此向量的末尾,将其大小增加1。相当于add方法。
遍历时使用的方法:
Enumeration elements():返回此向量的组件的枚举。
Enumeration中有两个方法:
boolean hasMoreElements():测试此枚举是否包含更多的方法(相当于hasNext()方法)
nextElement():如果此枚举至少还有一个可提供的元素,则返回此枚举的下一个元素(相当于next()方法)
6.Set集合
(1)HashSet集合介绍
java.util.Set接口extends Collection接口
Set接口的特点:
1>不允许存储重复的元素
2>没有索引,没有带索引的方法,也不能使用普通的for循环遍历
Java.util.HashSet集合implements Set接口
HashSet特点:
1>不允许存储重复的元素
2>没有索引,没有带索引的方法,也不能使用普通的for循环遍历
3>是一个无序的集合,存储元素和取出元素的顺序有可能不一致
4>底层是一个哈希表结构(查询的速度非常快)
(2)哈希值
哈希值是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来的地址,不是数据实际存储的物理地址)
在Object类中有一个方法,可以获取对象的哈希值。
int hashCode() 返回该对象的哈希码值
hashCode方法的源码:
public native inthashCode();
native:代表该方法调用的是本地操作系统的方法。
toString方法的源码:
return getClass().getName() + “@” +Integer.toHexString(hashCode());
String类的哈希值
String类重写Object类的hashCode方法
可以重写hashCode方法。
(3)HashSet集合存储数据的结构
(4)Set集合存储元素不重复的原理
(5)HashSet存储自定义类型元素
(6)LinkedHashSet集合
java.util.LinkedHashSet集合 extends HashSet集合
LinkedHashSet集合特点:
底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序
(7)可变参数
可变参数:是JDK1.5之后出现的新特性
使用前提:
当方法的参数列表数据类型已经确定,但是参数的个数不确定,就可以使用可变参数。
使用格式:定义方法时使用
修饰符 返回值类型 方法名(数据类型…变量名){}
可变参数的原理:
可变参数的底层就是一个数组,根据传递参数的个数的不同,会创建不同长度的数组,来存储这些参数传递的参数的个数,可以是0个(不传递参数),1,2…多个
可变参数的注意事项:
1>一个方法参数列表,只能有一个可变参数
2>如果方法的参数有多个,那么可变参数必须写在参数列表的末尾
可变参数的特殊(终极)写法
public static voidmethod(Object…obj){}
7.Collections工具类
(1)Collections集合工具类的方法
-java.util.Collections是集合工具类,用来对集合进行操作,部分方法如下:
-public static BooleanaddAll(Collection c,T…elements):往集合中添加一些元素
-public static void shuffle(List>list):打乱顺序,打乱集合顺序
-public static voidsort(List list):将集合中元素按照默认规则排序
注意:
sort(List list)使用前提:
被排序的集合里边存储的元素,必须实现Comparable,重写接口中的方法CompareTo定义排序的规则
Comparable接口的排序规则:
自己(this)- 参数:升序
参数– 自己(this):降序
-public static void sort(List list, Comparator super T>):将集合元素按照指定规则进行排序
Comparable 和Comparator的区别:
Comparable:自己(this)和别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法
Comparator:相当于找一个第三方裁判,比较两个
Comparator的排序规则:
o1-o2:升序
o2-o1:降序
8.Map集合
(1)Map集合概述
java.util.Map集合
Map集合的特点:
1>Map集合是一个双列集合,一个元素包含两个值(一个key,一个value)
2>Map集合中的元素,key和value的数据类型可以相同也可以不同
3>Map集合中的元素,key是不允许重复的,value是可以重复的
4>Map集合中的元素,key和value是一一对应的
(2)Map常用子类
java.util.HashMap集合 implements Map接口
HashMap集合的特点:
1>HashMap集合的底层是哈希表:查询的速度非常快
JDK1.8之前:数组+单向链表
JDK1.8之后:数组+单向链表/红黑树(链表的长度超过8):提高查询的速度
2>HashMap集合是一个无序的集合,存储元素和取出元素的顺序又可能不一致
java.util.LinkedHashMap集合 extends HashMap集合
LinkedHashMap的特点:
1>LinkedHashMap集合底层是哈希表+链表(保证迭代的顺序)
2>LinkedHashMap集合是一个有序的集合,存储元素和取出元素的顺序是一致的
(3)Map接口中的常用方法
-public V put(Kkey, V value):把指定的键与指定的值添加到Map集合中
返回值:V
存储键值对的时候,key不重复,返回值V是null
存储键值对的时候,key重复,会使用新的value替换Map中重复的value,返回被替换的value值
-public Vremove(Object key):把指定的键所对应的键值对元素在Map集合中删除,返回被删除元素的值
返回值:V
key存在,V返回被删除的值
key不存在,V返回null
-public Vget(Object key) 根据指定的键,在Map集合中获取对应的值
返回值:
key存在,返回对应的value值
key不存在,返回null
-boolean containKey(Objectkey) 判断集合中是否包含指定的键
包含返回true,不包含返回false
(4)Map集合遍历键找值方式
Map集合的第一种遍历方式:通过键找值的方式
Map集合中的方法:
Set keyset() 返回此映射中包含的键的Set视图
实现步骤:
1>使用Map集合中的方法keySet(),把Map集合中的所有的key取出来,存储到一个Set集合中
2>遍历set集合,获取Map集合中的每一个key
3>通过Map集合中的get(key),通过key找到value
(5)Entry键值对对象
Map.Entry:在Map接口中有一个内部接口Entry
作用:当Map集合一创建,那么就会在Map集合中创建一个Entry对象,用来记录键与值(键值对对象,键与值的映射关系)-->结婚证
(6)Map集合遍历键值对方式
Map集合遍历的第二种方式:使用Entry对象遍历
Map集合中的方法
Set>entrySet() 返回此映射中包含的映射关系的Set视图
实现步骤:
1>使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个Set集合中
2>遍历Set集合,获取每一个Entry对象
3>使用Entry对象中的方法getKey()和getValue()获取键与值
(7)HashMap存储自定义类型键值
Map集合保证key是唯一的:
作为key的元素,必须重写hashCode方法和equals方法,以保证key唯一
HashMap存储自定义类型键值
key:String类型
String类重写了hashCode方法和equals方法,可以保证key值的唯一
value:Person类型
value可以重复(同名同年龄的人视为一个人)
HashMap存储自定义类型键值
key:Person类型
Person类必须重写hashCode方法和equals方法,可以保证key值的唯一
value:String类型
value可以重复
(8)LinkedHashMap集合
-java.util.LinkedHashMapextends HashMap
Map接口的哈希表和链接列表实现,具有可预知的迭代顺序
底层原理:
哈希表+链表(记录元素的顺序)
(9)Hashtable集合
-java.util.Hashtable集合 implements Map接口
Hashtable:底层也是一个哈希表,是一个线程安全的集合,是单线程集合,速度慢
HashMap:底层是一个哈希表,是一个线程不安全的集合,是多线程的集合,速度快
HashMap集合(之前学过的所有集合):可以存储null值,null键
Hashtable集合,不能存储null值,null键
Hashtable和Vector集合一样,在JDK1.2版本之后被更先进的集合(HashMap和ArrayList)取代了
Hashtable的子类Properties依然活跃
Properties集合是一个唯一和IO流相结合的集合
(10)练习_计算一个字符串中每个字符出现的次数
练习:计算一个字符串中的每个字符出现的次数
分析:
1>使用Scanner获取用户输入的字符串
2>创建Map集合,key是字符串中的字符,value是字符的个数
3>遍历字符串,获取每一个字符
4>使用获取到的字符,去Map集合判断key是否存在
key存在:
通过字符(key),获取value(字符个数)
value++
put(key,value)把新的value存储到Map集合中
key不存在:
put(key,1)
5>遍历Map集合,输出结果
(11)JDK9对集合添加的优化_of方法
JDK9的新特性:
List接口,Set接口,Map接口:里面增加了一个静态方法of,可以给集合一次性添加多个元素
static List of (E…elements)
使用前提:
当集合中存储的元素个数已经确定了,不在改变时使用
注意:
1>of方法只适用于List接口,Set接口,Map接口,不适用于接口的实现类
2>of方法的返回值是一个不能改变的集合,集合不能再使用add,put方法添加元素,会抛出异常
3>Set接口和Map接口在调用方法的时候,不能有重复的元素,否则会抛出异常
9.Debug调试
(1)Debug追踪
Debug调试程序:
可以让代码逐行执行,查看代码执行的过程,调试程序中出现的bug
使用方式:
在行号的右边,鼠标左键单击,添加断点(每个方法的第一行,哪里有bug添加到哪里)
右键选择Debug执行程序
程序就会停留在添加的第一个断点处
执行程序:
F8:逐行执行程序
F7:进入到方法中
Shift+F8:跳出方法
F9:跳到下一个断点,如果没有下一个断点,那么就结束程序
Ctrl+F2:退出Debug模式,停止程序
Console:切换到控制台
10.斗地主案例(双列)
(1)斗地主案例的需求分析
(2)斗地主案例的代码实现