集合框架及背后的数据结构

一、 Java 集合框架

  • Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。
  • 将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索retrieve 、管理 manipulate ,即平时我们俗称的增删查改 CRUD

二、类和接口

在这里插入图片描述

接口:抽象类进一步抽象,只包含抽象方法,字段只包含静态常量。(实现多态、向上转型)
抽象类;包含抽象类方法的类,用abstract修饰。
(接口和抽象类不能实例化。当实例化对象时,不用再一个一个类实例一个一个对象的繁琐操作,只需要这个类或多个类继承或实现了接口,就可以用抽象类或接口向上转型实例某个类的对象了。)
例如:

Collect collect=new ArrayList();

三、泛型

(1) Collection collection=new ArrayList<>( );:将类型参数化了

E:只能是基本数据类型。

(2)作用:实例化对象时指定参数的类型

如:

 Collection<String>list=new ArrayList<>();
        //添加元素
        list.add("我");
        list.add("爱");
        list.add("Ado");

只能添加String类型的数据。

(四)、包装类

(1)八种基本数据类型对应的类

以此来对基本数据类型进行了面向对象。
在这里插入图片描述

装箱:将基本数据类型变成包装类

      Integer a=123;                      (隐式的)
      Integer a=new Integer.valueof(123);(显示的)

拆箱:将包装类变成基本数据类型

    int b=a;                           (隐式的)
    int  b=a.intvalue;                (显示的)

(2)Integer的范围

public static void main(String[] args) {
      Integer a=129;
      Integer b=129;
     System.out.println(a==b);
 }
 输出: false
 

public static void main(String[] args) {
    Integer a=123;
    Integer b=123;
    System.out.println(a==b);
}
输出:true

源码:

 public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

在这里插入图片描述

(五)Collection接口的常用

public static void main(String[] args) {
        //泛型
        //通过Collection接口实例化一个ArrayList类对象
        Collection<String>list=new ArrayList<>();
        //计算长度
        System.out.println(list.size());
        //判读是否为空
        System.out.println(list.isEmpty());
        //添加元素
        list.add("我");
        list.add("爱");
        list.add("Ado");
        System.out.println(list.size());
        System.out.println(list.isEmpty());
        //返回装有数组集合的类
        Object[] array=list.toArray();
        System.out.println(Arrays.toString(array));
        //遍历元素
        for (String s:list) {
            System.out.println(s);
        }
        //移除元素
        list.remove("我");
        for (String s:list) {
            System.out.println(s);
        }
        //清空元素D
        list.clear();
        System.out.println(list.size());
        System.out.println(list.isEmpty());
    }

(六)、Map 常用方法说明

 public static void main(String[] args) {
        Map<String,String>map=new HashMap<>();
        //求长度
        System.out.println(map.size());
        //判断是否为空
        System.out.println(map.isEmpty());
        //根据指定的K查找对应的V
        System.out.println(map.get("作者"));
        //根据指定的K查找对应的V,没有找到用默认值代替
        System.out.println(map.getOrDefault("作者","佚名"));
        //判断是否包含key
        System.out.println(map.containsKey("作者"));
        //判断是否包含value
        System.out.println(map.containsValue("佚名"));
        //将指定的k-v放入map中
        map.put("作者","鲁迅");
        map.put("标题","狂人日记");
        map.put("发表时间","1918年");
        System.out.println(map.size());
        System.out.println(map.isEmpty());
        System.out.println(map.get("作者"));
        System.out.println(map.getOrDefault("作者","佚名"));
        System.out.println(map.containsKey("作者"));
        System.out.println(map.containsValue("佚名"));
        //将所有的键对值返回
        for (Map.Entry<String,String>entry:map.entrySet()) {
            System.out.println(entry.getKey());
            System.out.println(entry.getValue());
        }
    }

(七)、List接口的基本使用

public class Demo1 {
    public static void main(String[] args) {
        List<String> courses=new ArrayList<>();
        //添加元素
        courses.add("c语言");
        courses.add("java SE");
        courses.add("java Web");
        courses.add("java EE");
        //添加重复元素
        courses.add("C语言");
        System.out.println(courses);
        //数组下标访问和通过下标修改
        System.out.println(courses.get(0));
        courses.set(0,"计算机基础");
        System.out.println(courses);
        //截取部分内容
        List<String> subCourses=courses.subList(1,3);
        System.out.println(subCourses);
        //重新构造
        List<String> courses2=new ArrayList<>(courses);
        System.out.println(courses2);
        List<String> couses3=new ArrayList<>(courses2);
        System.out.println(couses3);
        //引用的转换
        ArrayList<String> courses4=(ArrayList<String>) courses2;
        System.out.println(courses4);
          //LinkedList<String> courses5=(LinkedList<String>) couses3;
          // System.out.println(courses5);
    }
}

(八)、抽牌游戏

//抽牌
 class Card{
    public int rank;//牌面值 1——52;
    public String suit;

    @Override
    public String toString() {
        return String.format("[%s %d]",suit,rank);
    }
}
public class Demo1 {
     public static final String[] SUITS={"♠","♥","♣","♦"};
     //买一副牌
    private static List<Card> buyDeck(){
        List<Card> deck=new ArrayList<>(52);
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j <=13 ; j++) {
                String suit=SUITS[i];
                int rank=j;
                Card card=new Card();
                card.rank=rank;
                card.suit=suit;
                deck.add(card);
            }
        }
        return deck;
    }
    private static void swap(List<Card> deck,int i,int j){
        Card t=deck.get(i);
        deck.set(i,deck.get(j));
        deck.set(j,t);
    }
    private static void shuffle(List<Card> deck){
        Random random=new Random(20190905);
        for (int i = deck.size()-1; i >0 ; i--) {
            int r=random.nextInt(i);
            swap(deck,i,r);
        }
    }

    public static void main(String[] args) {
        List<Card> deck=buyDeck();
        System.out.println("刚买的牌");
        System.out.println(deck);
        shuffle(deck);
        System.out.println("洗牌");
        System.out.println(deck);
        //三人抓牌,没人轮流抓5张牌。
        List<List<Card>> hands=new ArrayList<>();
        hands.add(new ArrayList<>());
        hands.add(new ArrayList<>());
        hands.add(new ArrayList<>());
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                hands.get(j).add(deck.remove(0));
            }
        }
        System.out.println("剩余的牌:");
        System.out.println(deck);
        System.out.println("A 手中的牌:");
        System.out.println(hands.get(0));
        System.out.println("B 手中的牌:");
        System.out.println(hands.get(1));
        System.out.println("c 手中的牌:");
        System.out.println(hands.get(2));
    }
}

(九)、杨辉三角

//杨辉三角
class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> ret=new ArrayList<>();
        //第一行
        List<Integer>list1=new ArrayList<>();
        list1.add(1);
        ret.add(list1);
        for (int i = 1; i <numRows ; i++) {
            List<Integer> list=new ArrayList<>();
            list.add(1);
            List<Integer> prev=ret.get(i-1);
            for (int j = 1; j <i ; j++) {
                //中间的情况
                int num1=prev.get(j)+prev.get(j-1);
                list.add(num1);
            }
            list.add(1);
            ret.add(list);
        }
        return ret;
    }
}
public class Demo1 {
    public static void main(String[] args) {
        Solution solution=new Solution();
        System.out.println(solution.generate(10));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值