初识java集合及包装类和泛型的基本使用(代码片段)

爱敲代码的三毛 爱敲代码的三毛     2022-12-18     535

关键词:


一、介绍

1.java集合框架是什么?

Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。
其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索retrieve 、管理 manipulate ,即平时我们俗称的增删查改 CRUD 。
例如,一副扑克牌(一组牌的集合)、一个邮箱(一组邮件的集合)、一个通讯录(一组姓名和电话的映射关系)等等

2.学习java集合的意义

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

3.java集合关系图

下面这张图将伴随这我们学习Java集合以及数据结构


简单来了解一下:

Collection :用来存储管理一组对象 objects ,这些对象一般被成为元素 elements

  1. Set : 元素不能重复,背后隐含着查找/搜索的语义
    1.1. SortedSet : 一组有序的不能重复的元素
  2. List : 线性结构
  3. Queue : 队列
  4. Deque : 双端队列

Map : 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语义

  1. SortedMap : 一组有序的键值对

二、接口使用实例

1.Collection 接口说明

Collection 官方文档

2.Collection 示例

Collection可以说是所以集合的祖先,只要它底下的接口和类都可以使用这些方法

public static void main(String[] args) 
        //顺序表
        Collection<String> list1 = new ArrayList<>();
        //添加元素
        list1.add("好");
        list1.add("好");
        list1.add("学");
        list1.add("习");
        list1.add("");
        //判断集合是否为空
        System.out.println(list1.isEmpty());
        //删除元素
        list1.remove("!");
        //得到集合中元素的个数
        System.out.println(list1.size());
        //放回一个装有所以集合中元素的数组
        Object[] str = list1.toArray();
        for (Object s : str) 
            System.out.println(s);
        
        //删除集合中所有元素
        list1.clear();
        System.out.println(list1.isEmpty());
    

一般我们是不会这么写代码的,这里只是演示一下这个接口。

3.Map 接口说明

HashMap简单来说就是一个Key对应一个值,Key是唯一的。
Map官方文档

4. Map实例

public static void main(String[] args) 
        Map<String,String> map = new HashMap<>();
        map.put("三国演义","罗贯中");
        map.put("西游记","吴承恩");
        map.put("水浒传","施耐庵");
        map.put("红楼梦","曹雪芹");

        System.out.println(map.get("西游记"));

        System.out.println(map.containsKey("红楼梦"));
        System.out.println(map.containsValue("李白"));
        Set<Map.Entry<String,String>> entries = map.entrySet();
        for (Map.Entry<String,String> m: entries) 
            System.out.println(m.getKey()+"--->"+m.getValue());
        
    

三、泛型

1.泛型的分类

  1. 泛型类
  2. 泛型方法

这里只是先简单认识一下泛型后面会有一篇博客详细讲到。

2.泛型的定义

// 1. 尖括号 <> 是泛型的标志
// 2. E 是类型变量(Type Variable),变量名一般要大写
// 3. E 在定义时是形参,代表的意思是 MyArrayList 最终传入的类型,但现在还不知道
public class MyArrayList<E> 
private E[] array;
private int size;
...

注意: 泛型类可以一次有多个类型变量,用逗号分割。

3.泛型背后作用时期和背后的简单原理

  1. 泛型是作用在编译期间的一种机制,即运行期间没有泛型的概念。
  2. 泛型代码在运行期间,就是我们上面提到的,利用 Object 达到的效果(这里不是很准确,以后会做说明)。

4.泛型的使用

// 定义了一个元素是 Book 引用的 MyArrayList
MyArrayList<Book> books = new MyArrayList<Book>();
books.add(new Book());
// 会产生编译错误,Person 类型无法转换为 Book 类型
books.add(new Person());
// 不需要做类型转换
Book book = book.get(0);
// 不需要做类型转换
// 会产生编译错误,Book 类型无法转换为 Person 类型
Person person = book.get(0);

通过以上代码,我们可以看到泛型类的一个使用方式:只需要在所有类型后边跟尖括号,并且尖括号内是真正的类型,即 E 可以看作的最后的类型。

注意: Book 只能想象成 E 的类型,但实际上 E 的类型还是 Object

5.泛型总结

1.泛型是为了解决某些容器、算法等代码的通用性而引入,并且能在编译期间做类型检查。
2. 泛型利用的是 Object 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作。
3. 泛型是一种编译期间的机制,即 MyArrayList 和 MyArrayList 在运行期间是一个类型。
4. 泛型是 java 中的一种合法语法,标志就是尖括号 <>

注意:泛型的参数不能是简单类型,也就是基本数据类型

四、包装类

Object 引用可以指向任意类型的对象,但有例外出现了,8 种基本数据类型不是对象,那岂不是刚才的泛型机制要失效了?
实际上也确实如此,为了解决这个问题,java 引入了一类特殊的类,即这 8 种基本数据类型的包装类,在使用过程中,会将类似 int 这样的值包装到一个对象中去。

1.基本数据类型和包装类直接的对应关系

除了 Integer 和 Character,基本就是类型的首字母大写。

2.包装类的使用,装箱(boxing)和拆箱(unboxing)

装箱和拆箱有的书上也叫做装包和拆包

    public static void main(String[] args) 
        int i = 10;
// 装箱操作,新建一个 Integer 类型对象,将 i 的值放入对象的某个属性中
        Integer ii = Integer.valueOf(i);
        Integer ij = new Integer(i);
// 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中
        int j = ii.intValue();
    

3.自动装箱(autoboxing)和自动拆箱(autounboxing)

可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,java 提供了自动机制。

		int a = 10;
        Integer b = a;//自动装箱
        int c = b;//自动拆箱

注意:自动装箱和自动拆箱是工作在编译期间的一种机制
我们通过 javap -c 来查看反汇编代码,可以看到在编译期间就发生了拆装箱

五、关于Integer的面试题

来看一段代码

public static void main(String[] args) 
        Integer a1 = 100;
        Integer a2 = 100;
        System.out.println(a1==a2);
        Integer b1 = 200;
        Integer b2 = 200;
        System.out.println(b1==b2);
    

运行结果


真让人琢磨不透呢,这是怎么一回事呢?这里发生了自动装箱那就得从装箱找原因。来看一下 Integer.valueOf 的源码。



我们知道引用类型比较的是地址,而通过源码我们发现如果Integer 的范围在
-128~127之间就会存在对应的数组上。如果不在范围内就会 new 一个新的Interger 那么必然不会相等。

总结

1.Map里的Key是唯一的
2.泛型和装拆包都是属于编译期间的

完!

JAVA数据结构开始持续更新!

初识集合和泛型

packagecom.oracle.Test;importjava.util.ArrayList;importjava.util.Collection;importjava.util.Iterator;/**问题:你们怎么理解集合这个词.*答:通常指容器.用来装载n个数据.**问题:集合中能放的元素类型*答:Java设计人员.设计Java中的集合时.是希望这个集合可... 查看详情

泛型1:介绍及基本使用方式(代码片段)

...类型参数;一.基本使用方式  泛型基本分为泛型类型和泛型方法两种,泛型类型声明方式为类型参数用尖括号括住,放在类名后边,泛型方法的参数列表应该置于返回值之前。示例如下://泛型类packagejava.lang;publicinterfaceItera 查看详情

集合类和java多线程(代码片段)

#知识点总结第五篇 1.泛型类就是带有参数类型的类,其类中也有属性和方法 数据类型可以实已有的类型,也可以是"类型参数"的类型。 2.泛型的好处    1.强制类型检查,在编译的时候就能得到类型错误的... 查看详情

java泛型的读写规则:pecs(代码片段)

...的重要用法。PECS就是当你需要遍历某一个类型和子类的集合数据时,集合相当于生产者,此时泛型使用<?extendsT>。当需要往某个类型的集合添加类和子类实例时,集合相当于消费者,此时泛型使用<?superT>... 查看详情

java泛型的读写规则:pecs(代码片段)

...的重要用法。PECS就是当你需要遍历某一个类型和子类的集合数据时,集合相当于生产者,此时泛型使用<?extendsT>。当需要往某个类型的集合添加类和子类实例时,集合相当于消费者,此时泛型使用<?superT>... 查看详情

java泛型的读写规则:pecs(代码片段)

...的重要用法。PECS就是当你需要遍历某一个类型和子类的集合数据时,集合相当于生产者,此时泛型使用<?extendsT>。当需要往某个类型的集合添加类和子类实例时,集合相当于消费者,此时泛型使用<?superT>... 查看详情

java基础语法java的泛型和包装类(代码片段)

前言:本章主要是为了后面学习集合框架所做的知识补充。补充了泛型以及包装类两个知识,但是该章泛型的讲解不够全面,主要是为了集合框架学习做铺垫。文章目录1.预备知识-泛型(Generic)1.1泛型的引入1... 查看详情

泛型通配符

...象使用只能作为方法的参数使用这时候我们不知道Arraylist集合使用什么数据类型,可以泛型的通配符?来接收数据类型注意:泛型没有继承概念的泛行总结泛型类和泛型方法泛行接口和泛型方法泛型通配符 查看详情

泛型的泛型的好处

...,这是非泛型类和非泛型方法无法具备的。泛型通常用与集合以及作用于集合的方法一起使用。.NETFramework2.0版类库提供一个新的命名空间System.Collections.Generic,其中包含几个新的基于泛型的集合类。建议面向2.0版的所有应用程序... 查看详情

java示例代码_将集合和泛型与通配符一起使用

java示例代码_将集合和泛型与通配符一起使用 查看详情

集合和泛型(代码片段)

目录1.1集合框架1.1.1为什么要使用集合框架1.1.2单值集合的顶层接口:Collection家族1.1.3键值映射集合的顶层接口:Map家族1.2Set接口1.2.1HashSet类的使用1.2.2HashSet类无重复特性体现总结: 1.2.3TreeSet类的使用1.2.3.1使用TreeSet... 查看详情

集合和泛型(代码片段)

目录1.1集合框架1.1.1为什么要使用集合框架1.1.2单值集合的顶层接口:Collection家族1.1.3键值映射集合的顶层接口:Map家族1.2Set接口1.2.1HashSet类的使用1.2.2HashSet类无重复特性体现总结: 1.2.3TreeSet类的使用1.2.3.1使用TreeSet... 查看详情

java中泛型的深入理解(代码片段)

...;<数据类型>;注意:泛型只能支持引用数据类型。集合体系的全部接口和实现类都是支持泛型的使用的。泛型的好处:统一数据类型。把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因... 查看详情

java自用集合中使用泛型的练习(代码片段)

...!!!!!!!😐😐集合中使用泛型总结:①集合接口或集合类在jdk5.0时都修改为带泛型的结构。②在实例化集合类时,可以指明具体的泛型类型③指明完以后,在集合类或接口中... 查看详情

值类型引用类型和泛型的前世今生(代码片段)

值类型、引用类型和泛型多语言咱们先不说主题,先说说CLR支持多语言。.net有个非常强大的特点,那就是跨语言,支持很多语言,比如C#、J#等。先来个图看一看C#J#VB等等等????????C#编译器J#编译器VB编译器编译器????????---------------... 查看详情

java8基础知识泛型的约束与局限性

...不能使用基本类型实例化类型参数类型参数都是类,要用包装器将基本类型包装才可以作为类型参数(原因在于擦除类型后Object类不能存储基本类型的值)。当包装器类不能接受类型参数替换时,可以使用独立的类和方法进行处... 查看详情

[java]集合和泛型(代码片段)

一、集合1.集合体系图Set集合体系图List集合体系图Map集合体系图2.Collection接口方法Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的//只要是Collection接口的实现类都可以做实参booleanaddAll(Collection<?extendsE&... 查看详情

java中的object类和泛型

object类和泛型都有助于提高程序的复用性,那么它们的区别是什么呢?又为什么泛型被广泛使用,而object被打入“冷宫”呢?其实在jdk1.5版本发布之前,object还是被广泛使用的那么让我们先看看jdkapi中对object类的定义:&nbs... 查看详情