IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 初始Java集合及包装类和泛型的基本使用 -> 正文阅读

[Java知识库]初始Java集合及包装类和泛型的基本使用


在这里插入图片描述

一、介绍

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数据结构开始持续更新!
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:29:41  更:2021-08-06 09:30:04 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/11 21:32:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码