JAVA集合框架以及用例

一、List接口的实现类:

1,ArrayList
2,LinkedList
3,Vector

ArrayList、LinkedList、Vector区别:

ArrayList:是基于动态数组的实现,内部的实现基于数组完成,因此在进行元素查找的时候只需要根据元素的索引即可快速找到,但是在更新时或者插入时,由于数组结构是连续的,元素一旦向中间插入,则后续的元素需要整体后移,效率低。ArrayList是线程不同步的实现,在多线程并发操作时不能保证数据的安全,但是效率高;另外ArrayList在进行容量扩充是增长原来的1.5倍(增长原来长度的一半);线程安全的ArrayList可以使用java.util.concurrent.CopyOnWriteArrayList

LinkedList:是基于双链表的实现,集合中元素的组织是通过元素的首尾指针连接,在进行数据修改时只需要改动指针的指向即可轻松实现,但是在进行查询的时候,需要从链表头依次搜索,因此修改时,效率较低.

Vector:和ArrayList一样也是基于动态数组的实现,但是Vector是老式JDK(JDK1.0)中的一个动态数组类,提供的是一些线程安全(线程同步)的集合操作,因此,在多线程并发时,对数据的安全性会有一定保障,但是带来的影响就是效率低;另外Vector当容量不足时会在原来长度的基础上增长一倍(ArrayList增长一半)

二、Set接口实现类

Set是一个无序集合,元素的存储顺序不是按照添加顺序存储(具体存储顺序跟使用的实现类有关);因为元素的存储是无序的,因此无法像List一样通过索引获取元素,所以对于Set集合中元素的获取只能通过迭代器进行迭代;另外Set集合中不允许出现重复的元素(不允许存在e1.equals(e2)),实际上是后出现的元素会覆盖原来存在的。
1,HashSet:基于散列算法(Hashtable)实现的元素存储顺序

2,TreeSet:基于二叉树中红黑树的实现,元素的排序方式需要通过实现Comparable或者Comparator接口完成

HashSet和TreeSet区别?

HashSet:基于Hash表实现的元素存储,内部元素的排序按照hash表中的地址进行排序,内部允许null值存在,但是不允许重复的元素,如果一旦出现重复的元素(此时hash值是已经存在的情况,不会将新的元素存储)。

TreeSet:基于树的实现,内部元素的排序需要通过提供排序比较器(Comparable,Comparator)进行实现;内部的元素必须是Comparable实现类(或者在创建TreeSet对象时提供Comparator比较器),并且由于比较器内部会使用到集合中的元素,因此元素不允许为null(会导致NullPointerException).

三、Map接口实现类

Map接口是JDK1.2新增集合框架中的一种容器,Map集合内部的元素存储采用键值对(Key-Value)结构,key不允许重复,另外每一个key都会对应一个value对象;Map集合有三个常见实现类:

  1. HashMap
  2. TreeMap
  3. Hashtable
    HashMap、Hashtable、TreeMap的区别?

HashMap:是基于hash表的实现,是Map接口的一个实现类,内部的元素存储顺序是根据key的hash地址进行排序,因此,元素的顺序存储顺序可能跟添加的顺序不一致;HashMap使用链表加数组共同来实现元素存储;HashMap允许空键值出现,但是不允许重复的键存在(值可以重复);HashMap是线程不同步的实现,因此在操作数据时效率较高,但是线程并发是不能保障数据的一致性。如果多线程并发下使用建议使用:java.util.concurrent.ConcurrentHashMap

Hashtable:Hashtable是集合框架出现之前的键值对集合解决方案,从Dictionary类(JDK1.0)继承而来,在JDk1.2出现Map接口后,Hashtable又从改接口实现,Hashtable不允许空键值出现,该类的实现是线程同步,因此在多线程并发操作时对数据的一致性有保障,但是效率低。

TreeMap:是基于二叉树中的红黑树实现,元素的存储按照键的自然顺序排序(键必须实现Comparable接口,或者在创建TreeMap对象时指定的Comparator比较器),TreeMap中的键必须是相同的数据类型,并且不允许空元素出现,同HashMap一样,TreeMap也是线程不同步的实现。

小编小结:

这些都是小编从老师那COPY来的,听说这个很重要,小编毫不犹豫的在这里分享给各位博友,希望对你们有些许帮助,当然,小编也只是刚学,赶快一起努力消化这些干货!

斗地主游戏实例

在这里插入图片描述
Player类用于存放玩家信息:

package com.demo;

import java.util.ArrayList;

public class Player {
	private int id;
	private String name;
	private boolean boss;
	private ArrayList<Poke> poke=new ArrayList<>();
	public Player() {
		// TODO Auto-generated constructor stub
	}
	
	public Player(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public boolean isBoss() {
		return boss;
	}
	public void setBoss(boolean boss) {
		this.boss = boss;
	}
	public ArrayList<Poke> getPoke() {
		return poke;
	}
	public void setPoke(ArrayList<Poke> poke) {
		this.poke = poke;
	}
	

}

Poke类用来存放扑克牌信息:

package com.demo;

public class Poke {
	private String flower;
	private String point;
	public Poke() {
		// TODO Auto-generated constructor stub
	}
	public Poke(String flower, String point) {
		super();
		this.flower = flower;
		this.point = point;
	}
	public String getFlower() {
		return flower;
	}
	public void setFlower(String flower) {
		this.flower = flower;
	}
	public String getPoint() {
		return point;
	}
	public void setPoint(String point) {
		this.point = point;
	}
	@Override
	public String toString() {
		return flower +point;
	}
	

}

Test类一定要先选出地主,再发牌

package com.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Test {
	static ArrayList<Poke> list=new ArrayList<>();
	static List<Player> player;
	int bossIndex;
	static String[] flower={"黑桃","红心","梅花","方块"};
	static String[] point={"3","4","5","6","7","8","9","10","J","Q","K","A","Z"};
	static{
		for(int i=0;i<flower.length;i++){
			for(int j=0;j<point.length;j++){
				Poke p=new Poke(flower[i],point[j]);
				list.add(p);
			}
		}
		list.add(new Poke("小","王"));
		list.add(new Poke("大","王"));
		Collections.shuffle(list);
		player=Arrays.asList(new Player(1,"刘备"),
				new Player(2,"张飞"),
				new Player(3,"关羽"));
	}
	public void setBoss(){
		Random r=new Random();
		bossIndex=r.nextInt(player.size());
		player.get(bossIndex).setBoss(true);
	}
	public void pushPoke(){
		Random r=new Random();
		for(int i=0;i<player.size();i++){
			for(int j=0;j<17;j++){
				int index=r.nextInt(list.size());
				player.get(i).getPoke().add(list.get(index));
				list.remove(index);
			}
		}
		player.get(bossIndex).getPoke().addAll(list);
	}
	public void start(){
		setBoss();
		pushPoke();
		for(Player pp:player){
			System.out.println(pp.getPoke());
		}
		
	}
	
	
	public static void main(String[] args) {
		new Test().start();
	}

}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值