2.Collection集合

Collection接口:定义的是所有单列集合中共性的方法,所有的单列集合都可以使用共性的方法(没有带索引的方法)

  1. List接口:有序的集合(存储和取出元素顺序相同);允许存储重复的元素; 有索引,可以使用普通的for循环遍历
    1. Vector集合
    2. ArrayList集合
    3. LinkedList集合
  2. Set接口:不允许存储重复元素;没有索引(不能使用普通的for循环遍历)
    1. TreeSet集合:无序的集合(存储和取出元素顺序可能不一致)
    2. HashSet集合:无序的集合(存储和取出元素顺序可能不一致):底层哈希表,查询快
      1. jdk1.8之前:哈希表 = 数组+链表
      2. jdk1.8之后:哈希表 = 数组 + 链表 或 哈希表 = 数组 + 红黑树(链表的长度超过8变成红黑树,提高查询速度)
      3. 哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到的的地址,不是数据实际存储的物理地址)
      4. 在Object类有一个方法,可以获取对象的哈希值:int hashCode() 返回对象的哈希值
    3. LinkedHashSet集合:有序的集合
      1. 底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序,保证元素有序)

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:

  1. 数组的长度不可以改变,但ArrayList集合长度是可以随意变化的

  2. 底层是数组结构,查询块,增删慢

  3. 对于ArrayList来说,有一个尖括号代表是泛型

  4. 泛型就是装在集合当中的所有元素全部都是统一的类型

  5. 泛型只能是引用类型,不能是基本类型

  6. 如果希望向ArrayList当中存储基本类型数据,必须使用基本类型对应的包装类

  7. 基本类型包装类
    byteByte
    shortShort
    intInteger
    langLang
    floatFloat
    doubleDouble
    charCharacter
    booleanBoolean
  8. 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:

  1. 底层是一个链表结构,查询慢,增删块

  2. 里边包含了大量操作首尾元素的方法

  3. 注意:使用LinkedList集合特有的方法,不能使用多态

  4. 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]
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值