集合框架+预备知识

集合框架

Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。
在这里插入图片描述

  1. Collection :用来存储管理一组对象 objects ,这些对象一般被成为元素 elements
    1. Set : 元素不能重复,背后隐含着查找/搜索的语义
      1. SortedSet : 一组有序的不能重复的元素
    2. List : 线性结构
    3. Queue : 队列
    4. Deque : 双端队列
  2. Map : 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语义
    1. SortedMap : 一组有序的键值对

集合的背后都是数据结构,描述和组织数据的方式不一样,造就了有这么多数据结构,也就有这么多集合。


集合的意义:

  • 使用成熟的集合框架,有助于我们便捷、快速的写出高效、稳定的代码
  • 学习背后的数据结构知识,有助于我们理解各个集合的优缺点及使用场景

使用集合的工具类:
在这里插入图片描述

Collection 常用方法说明

每次存储单个数据

方法签名 说明
boolean add(E e) 将元素 e 放入集合中
void clear() 删除集合中的所有元素
boolean isEmpty() 判断集合是否没有任何元素,俗称空集合
boolean remove(Object e) 如果元素 e 出现在集合中,删除其中一个
int size() 返回集合中的元素个数
Object[] toArray() 返回一个装有所有集合中元素的数组

示例:

在这里插入代码片

Map 常用方法说明

每次存储键值对,<k,v>

方法签名 说明
V get(Object k) 根据指定的 k 查找对应的 v
V getOrDefault(Object k, V defaultValue) 根据指定的 k 查找对应的 v,没有找到用默认值代替
V put(K key, V value) 将指定的 k-v 放入 Map
boolean containsKey(Object key) 判断是否包含 key
boolean containsValue(Object value) 判断是否包含 value
Set<Map.Entry<K, V>> entrySet() 将所有键值对返回
boolean isEmpty() 判断是否为空
int size() 返回键值对的数量

map存储数据方式:
map存放数据的顺序不一定就是打印的顺序,因为在往map存储元素的时候,不是按照顺序来存储,它有自己的方式取存储,这个方式就是使用哈希函数进行映射

泛型的引入

先来看个例子

class MyArrayList {
    
    
    public Object[] elem;
    public int usedsize;

    public MyArrayList() {
    
    
        this.elem = new Object[10];
    }
    public void add(Object data) {
    
    
        this.elem[this.usedsize] = data;
        this.usedsize++;
    }
    public Object get(int pos) {
    
    
        return this.elem[pos];
    }
}

public class Work1 {
    
    
    public static void main(String[] args) {
    
    
        MyArrayList arr = new MyArrayList();
        arr.add(1);
        arr.add(16.5);
        arr.add("hello");
        String str = (String)arr.get(2);
        System.out.println(str);
    }
}

我们可以看到如果我们把这个顺序表存储的数据设置为Object类,那么这个顺序表就可以存储各个类型的数据,这样对于我们程序是过于强大了,这时我们就可以用泛型来限制顺序表中可以存储的数据类型,从而达到我们只想往数组中存放某一数据类型的目的。

class MyArrayList <T> {
    
    
    public T[] elem;
    public int usedsize;

    public MyArrayList() {
    
    
        this.elem = (T[])new Object[10];
    }
    public void add(T data) {
    
    
        this.elem[this.usedsize] = data;
        this.usedsize++;
    }
    public T get(int pos) {
    
    
        return this.elem[pos];
    }
}

public class Work1 {
    
    
    public static void main(String[] args) {
    
    
        MyArrayList<String> arr1 = new MyArrayList<>();  //这时顺序表中只能放String类型数据
        arr1.add(1);    //错误,类型不匹配
        arr1.add(16.5); //错误,类型不匹配
        arr1.add("hello");  //正确,字符串型数据
        
        MyArrayList<Integer> arr2 = new MyArrayList<>();  //整型

        MyArrayList<Float> arr3 = new MyArrayList<>();    //浮点型
    }
}

注意事项:

  1. 代表占位符,表示当前这个类是一个泛型类
  2. 简单类型不能作为泛型类型的参数,需要用到包装类
ArrayList<int> arr = new ArrayList<>();		//错误
ArrayList<Integer> arr = new ArrayList<>(); //正确
  1. 不能new泛型类型的数组
this.elem = new T[10];
  1. 泛型只存在于编译时期,在程序运行的时候就没有了泛型的概念

泛型的意义:

  1. 自动进行类型的检查
  2. 自动进行类型转换

泛型的擦除机制:
泛型在编译的时候,并不会进行指定类型的替换,而是拿着指定的类型进行检查
也就是说,在编译的时候,拿着指定的类型进行类型检查
编译的时候,会进行类型擦除,编译会把泛型擦除为Object类,而不是替换。

包装类

基本数据类型和包装类的对应关系
在这里插入图片描述
装箱:

		int a = 10;
        Integer integer1 = new Integer(a);  //显示的装包
        System.out.println(integer1);
        Integer integer2 = Integer.valueOf(a);  //显示装包
        System.out.println(integer2);
        Integer integer3 = a;   //自动装包,其实也调用了Integer.valueOf()

拆箱:

		Integer i = 10;
        int a1 = i;  //自动拆箱
        System.out.println(a1);
        int a2 = i.intValue();  //显示拆箱
        System.out.println(a2);
        double d = i.doubleValue();
        System.out.println(d);

猜你喜欢

转载自blog.csdn.net/starry1441/article/details/114483389
今日推荐