Collection接口:定义的是所有单列集合中共性的方法,所有的单列集合都可以使用共性的方法(没有带索引的方法)
- List接口:有序的集合(存储和取出元素顺序相同);允许存储重复的元素; 有索引,可以使用普通的for循环遍历
- Vector集合
- ArrayList集合
- LinkedList集合
- Set接口:不允许存储重复元素;没有索引(不能使用普通的for循环遍历)
- TreeSet集合:无序的集合(存储和取出元素顺序可能不一致)
- HashSet集合:无序的集合(存储和取出元素顺序可能不一致):底层哈希表,查询快
- jdk1.8之前:哈希表 = 数组+链表
- jdk1.8之后:哈希表 = 数组 + 链表 或 哈希表 = 数组 + 红黑树(链表的长度超过8变成红黑树,提高查询速度)
- 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到的的地址,不是数据实际存储的物理地址)
- 在Object类有一个方法,可以获取对象的哈希值:int hashCode() 返回对象的哈希值
- LinkedHashSet集合:有序的集合
- 底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序,保证元素有序)
Set集合在调用add方法时,add方法会调用元素的hashCode()方法和equals方法,判断元素是否重复
给HashSet中存放自定义类型元素时,需要重写对象中的hashCode和equals方法,建立自己的比较方式,才能保证HashSet集合中的对象唯一
Collection共性方法:
package Collection;
import java.util.ArrayList;
import java.util.Collection;
/**
* 共性的方法:
* public boolean add(E e):把给定的对象添加到集合中
* public void clear():清空集合中所有的元素
* public boolean remove(E e):把给定的对象在当前集合中删除
* public boolean contains(E e):判断当前集合中是否包含给定的对象
* public boolean isEmpty():判断当前集合是否为空
* public int size():返回集合中元素的个数
* public Object[] toArray():把集合中的元素存储到数组中
*/
public class CollectionDemo {
public static void main(String[] args) {
//创建集合对象
Collection<String> coll = new ArrayList<>();
System.out.println(coll); //[] 重写了toString方法
coll.add("张三");
System.out.println(coll);//[张三]
boolean empty = coll.isEmpty();//集合为空为true,集合不为空为false
int size = coll.size();//1
Object[] arr = coll.toArray();//把集合中的元素存储到数组中,原集合不变
System.out.println(coll);//[张三]
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);//张三
}
coll.clear();//清空集合中所有的元素,但是不删除集合,集合还存在
System.out.println(coll);//[]
}
}
斗地主案例:
import java.util.ArrayList;
import java.util.Collections;
/**
* 斗地主案例:
* 1.准备牌
* 2.洗牌
* 3.发牌
* 4.看牌
*/
public class DoudizhuDemo {
public static void main(String[] args) {
//1.准备牌
//定义一个存储54张牌的集合
ArrayList<String> poker = new ArrayList<>();
//定义两个数组,一个数组存储牌的花色,一个存储牌的序号
String[] colors = {"♥", "♣", "♦", "♠"};
String[] numbers = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};
//先把大王小王存储到poker集合中
poker.add("大王");
poker.add("小王");
//循环嵌套两个数组,组装52张牌
for (String number : numbers) {
for (String color : colors) {
//把组装好的牌存储到poker集合中
poker.add(color + number);
}
}
//System.out.println(poker);
//[大王, 小王, ♥2, ♣2, ♦2, ♠2, ♥A, ♣A, ♦A, ♠A, ♥K, ♣K, ♦K, ♠K, ♥Q, ♣Q, ♦Q, ♠Q, ♥J, ♣J, ♦J, ♠J, ♥10, ♣10, ♦10, ♠10, ♥9, ♣9, ♦9, ♠9, ♥8, ♣8, ♦8, ♠8, ♥7, ♣7, ♦7, ♠7, ♥6, ♣6, ♦6, ♠6, ♥5, ♣5, ♦5, ♠5, ♥4, ♣4, ♦4, ♠4, ♥3, ♣3, ♦3, ♠3]
/*
* 2.洗牌
* 使用集合的工具类Collection中的方法
* static void shuffle(List<?> list)使用默认随机源对指定列表进行置换
*/
Collections.shuffle(poker);
/*
* 3.发牌
* 定义4个集合,存储玩家的牌和底牌
*/
ArrayList<String> player01 = new ArrayList<>();
ArrayList<String> player02 = new ArrayList<>();
ArrayList<String> player03 = new ArrayList<>();
ArrayList<String> dipai = new ArrayList<>();
/*
遍历poker集合,获取每一张牌
使用poker集合的索引%3给3个玩家轮流发牌
剩余3张牌给底牌
注意:先判断底牌(i>=51),否则牌发没了
*/
for (int i = 0; i < poker.size(); i++) {
//获取每一张牌
String p = poker.get(i);
//轮流发牌
if (i >= 51) {
//给底牌发牌
dipai.add(p);
} else if (i % 3 == 0) {
//给玩家1发牌
player01.add(p);
} else if (i % 3 == 1) {
//给玩家2发牌
player02.add(p);
} else if (i % 3 == 2) {
//给玩家3发牌
player03.add(p);
}
}
//4.看牌
System.out.println("player01:" + player01);
System.out.println("player02:" + player02);
System.out.println("player03:" + player03);
System.out.println("底牌:" + dipai);
}
}
ArrayList:
-
数组的长度不可以改变,但ArrayList集合长度是可以随意变化的
-
底层是数组结构,查询块,增删慢
-
对于ArrayList来说,有一个尖括号代表是泛型
-
泛型就是装在集合当中的所有元素全部都是统一的类型
-
泛型只能是引用类型,不能是基本类型
-
如果希望向ArrayList当中存储基本类型数据,必须使用基本类型对应的包装类
-
基本类型 包装类 byte Byte short Short int Integer lang Lang float Float double Double char Character boolean Boolean -
import java.util.ArrayList; /** * 常用方法: * public boolean add(E e) 向集合中添加元素,参数的类型和泛型一样,返回值为:true或false,代表是否添加成功 * 对于ArrayList集合来说,add添加动作一定成功,但是对于其他集合,add添加动作不一定成功 * public E get(int index) 从集合当中获取元素,参数是索引编号,返回值是对于位置的元素 * public E set(int index, E element) 将指定的元素替换集合中指定位置的元素,返回被替换的元素值 * public E remove(int index) 从集合当中删除元素,参数是索引编号,返回值就是删掉的元素 * public int size() 获取集合的尺寸长度,返回值是集合中包含的元素的个数 */ public class ArrayListDemo { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("赵云"); list.add("张飞"); System.out.println(list); //[赵云, 张飞] list.add(1, "关羽"); System.out.println(list);//[赵云, 关羽, 张飞] //从集合中获取元素,索引值从0开始 String name = list.get(1); //关羽 //set String setE = list.set(2, "关羽1"); System.out.println("被替换的元素:" + setE);//张飞 //删除元素 String remove = list.remove(1);//关羽 //获取集合长度 int size = list.size();//1 //遍历集合 for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } //基本类型包装类使用 ArrayList<Integer> list1 = new ArrayList<>(); list1.add(100); list1.get(0); } }
LinkedList:
-
底层是一个链表结构,查询慢,增删块
-
里边包含了大量操作首尾元素的方法
-
注意:使用LinkedList集合特有的方法,不能使用多态
-
import java.util.LinkedList; /** * LinkedList常用方法: * 1.public void addFirst(E e):将指定元素插入此列表的开头 * 2.public void addLast(E e):将指定元素添加到此列表的结尾;等效于add() * 3.public void push(E e):将元素推入此列表所表示的堆栈;等效于addFirst() * 4.public E getFirst():返回此列表的第一个元素 * 5.public E getLast():返回此列表的最后一个元素 * 6.public E removeFirst():移除并返回此列表的第一个元素 * 7.public E removeLast():移除并返回此列表的最后一个元素 * 8.public E pop():从此列表所表示的堆栈出弹出一个元素;等效于removeFirst() * 9.public boolean isEmpty():如果列表不包含元素,则返回true */ public class LinkedListDemo { public static void main(String[] args) { LinkedList<String> list = new LinkedList<>(); list.add("张三"); list.add("李四"); list.add("王五"); System.out.println(list);//[张三, 李四, 王五] //list.addFirst("赵二"); list.push("赵二"); System.out.println(list);//[赵二, 张三, 李四, 王五] } }
Collections集合工具类
package Collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
* java.utils.Collections是集合工具类,用来对集合进行操作,部分方法如下:
* public static <T> boolean addAll():往集合中添加一些元素
* public static void shuffle():打乱集合顺序
* public static <T> void sort(List<T> list):将集合中元素按照默认规则排序(默认升序)
* sort使用前提:被排序的集合里边存储的元素,必须实现Comparable接口,重写接口的方法compareTo定义排序的规则
* <p>
* public static <T> void sort(List<T> list,Comparator<? super T>):将集合中元素按照指定规则排序
* Comparator和Comparable的区别:
* Comparable:自己(this)别人(参数)比较,自己需要实现Comparable接口,重写比较的规则compareTo方法
* Comparator:相当于找一个第三方的裁判,比较两个
*/
public class CollectionsDemo {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "b", "c");
System.out.println(list);//[a, b, c]
Collections.shuffle(list);
System.out.println(list);//[b, a, c]
Collections.sort(list);
System.out.println(list);//[a, b, c]
ArrayList<Integer> list1 = new ArrayList<>();
Collections.addAll(list1, 2, 3, 1);
System.out.println(list1);//[2, 3, 1]
Collections.sort(list1, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 - o2;//升序(反之降序)
}
});
System.out.println(list1);//[1, 2, 3]
}
}