黑马程序员---Java基础---集合总结

 ------- android培训java培训、期待与您交流! ----------

Collection(接口):单列
 |--List(接口):1.有序的;2.可以存储重复值;
  |--ArrayList(类):数组实现;不同步的,效率高;
  |--Vector(类):数组实现;同步的,效率低;
  |--LinkedList(类):链表实现;不同步的,效率高;
 |--Set(接口):1.无序的;2.不能存储重复值;(全是不同步的)
  |--HashSet(类):哈希表实现;验证重复:hashCode()和equals()
  |--LinkedHashSet(类):链表,哈希表实现;链表:有序;哈希表:唯一
  |--TreeSet(类):树结构;唯一性验证:比较的方法compareTo()或者compare()方法如果返回0,就不存;
   对元素排序的:
   1.自然排序:
    1).存储的对象必须实现Comparable接口
    2).重写compareTo()方法;
   2.比较器排序:
    1).自定义比较器,实现Comparator接口
    2).重写compare()方法;
    3).实例化TreeSet对象时,传递自定义比较器的对象;(一般我们使用匿名内部类的方式)

Map(接口):双列集合
 |--HashMap(类):"键"使用的"哈希表"结构;
 |--LinkedHashMap(类):"键"使用的"链表、哈希表"结构;
 |--TreeMap(类):"键"使用的"树"结构;
 |--Hashtable(类):哈希表。同步的,效率低;

数据结构:
栈:后进先出;
队列:先进先出;
数组:查询快;增、删慢;
链表:查询慢;增、删快;
哈希表:综合了数组和链表的优点,查询、增、删都快。效率取决于"哈希算法";
树:对元素排序。

我们该怎样选择集合呢?
1.单列or双列:
 1):单列:Collection:-->有序or无序
  1)有序:List:--> 是否经常增、删?
   1).是:LinkedList:
   2).否:ArrayList_or_Vector:是否多线程访问:
    1)是:Vector
    2)否:ArrayList

  2)无序:Set:--> 是否要排序?
   1).是:TreeSet
   2).否:HashSet

  LinkedHashSet 和 ArrayList:建议使用ArrayList
   
 2):双列:Map:-->是否排序?
  1).是:TreeMap
  2).否:HashMap

遍历集合的方式:
Collection:
 1).toArray():
 2).iterator():
 3).增强for():(最常用)
  |--List:
   4).get():
   5).ListIterator():
  |--Set:
   (无)
Map:
 1).keySet:
 2).entrySet:
  通过以上知识可以模拟斗地主的洗牌发牌的过程,如下:

package cn.itcast.demo12_模拟斗地主洗牌和发牌_对牌进行排序;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeSet;

public class Demo {
	public static void main(String[] args) {
		//1.封装一副牌
		String[] color ={"♥","♠","♦","♣"}; 
		String[] number = 

{"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
		HashMap<Integer,String> pokerMap = new HashMap<>();//牌

面和编号的映射关系
		ArrayList<Integer> pokerIndex = new ArrayList<>();
		int index = 1;
		for(String n : number){
			for(String c : color){
				pokerMap.put(index, c + n);
				pokerIndex.add(index);
				index++;
			}
		}
		pokerMap.put(index, "小王");
		pokerIndex.add(index);
		index++;
		pokerMap.put(index, "大王");
		pokerIndex.add(index);
		
		//洗牌:洗的编号
		Collections.shuffle(pokerIndex);
		//发牌:发编号
		TreeSet<Integer> user1Set = new TreeSet<>();
		TreeSet<Integer> user2Set = new TreeSet<>();
		TreeSet<Integer> user3Set = new TreeSet<>();
		TreeSet<Integer> dipaiSet = new TreeSet<>();
		
		for(int i = 0 ;i < pokerIndex.size() ; i++){
			if(i >= pokerIndex.size() - 3){
				dipaiSet.add(pokerIndex.get(i));
			}else{
				if(i % 3 == 0){
					user1Set.add(pokerIndex.get(i));
				}else if(i % 3 == 1){
					user2Set.add(pokerIndex.get(i));
				}else if(i % 3 == 2){
					user3Set.add(pokerIndex.get(i));
				}
			}
		}
		
		//看牌
		System.out.print("玩家1:【");
		for(Integer n : user1Set){
			System.out.print(pokerMap.get(n) + ", ");
		}
		System.out.println("】");
		System.out.println();
		
		System.out.print("玩家2:【");
		for(Integer n : user2Set){
			System.out.print(pokerMap.get(n) + ", ");
		}
		System.out.println("】");
		System.out.println();
		
		System.out.print("玩家3:【");
		for(Integer n : user3Set){
			System.out.print(pokerMap.get(n) + ", ");
		}
		System.out.println("】");
		System.out.println();
		
		System.out.print("底牌:【");
		for(Integer n : dipaiSet){
			System.out.print(pokerMap.get(n) + ", ");
		}
		System.out.println("】");
		System.out.println();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值