Java基础学习笔记(十)—— 包装类与泛型

news2024/10/6 10:36:21

包装类与泛型

  • 1 包装类
    • 1.1 基本类型包装类
    • 1.2 Integer类
    • 1.3 自动装箱 / 拆箱
  • 2 泛型
    • 2.1 泛型概述
    • 2.2 泛型的用法
    • 2.3 类型通配符

1 包装类

1.1 基本类型包装类

基本类型包装类的作用

  • 将基本数据类型封装成对象 的好处在于可以在对象中定义更多的功能方法操作该数据
public static void main(String[] args) {
    //需求:我要判断一个整数是否在 int 范围内?
    //Integer
	System.out.println(Integer.MAX_VALUE);
	System.out.println(Integer.MIN_VALUE);
}

常用的操作之一:用于基本数据类型与字符串之间的转换

基本数据类型对应的包装类:

在这里插入图片描述

1.2 Integer类

包装一个对象中的原始类型 int 的值

  1. 构造方法
    在这里插入图片描述
public static void main(String[] args) {
		/* 已经过时
        Integer i1 = new Integer(100);
        Integer i2 = new Integer("100");
        System.out.println(i1);
        System.out.println(i2);*/

        Integer i3 = Integer.valueOf(200);
        Integer i4 = Integer.valueOf("200");
        System.out.println(i3);
        System.out.println(i4);
    }
  1. 成员方法

static int parseInt(String s):将字符串类型的整数变成 int 类型的整数

public static void main(String[] args) {
	String s1 = "100";
	int i1 = 200;
	System.out.println(s1 + i1);//100200 --- 字符串+任意的数据类型 结果都是一个字符串
	//String ---> int 
	int i2 = Integer.parseInt(s1);//可以将字符串类型的整数变成int类型的整数
	System.out.println(i2 + i1); // 300
	
	
	//int  ---> String
	//方式一: +""
	int i3 = 100;
	String s2 = i3 + "";
	System.out.println(s2 + 100);  // 100100
	
	//方式二: 可以调用String类中valueof方法
	String s3 = String.valueOf(i3);
	System.out.println(s3 + 100); //100100
}

1.3 自动装箱 / 拆箱

自动装箱:把基本数据类型转换为对应的包装类类型
自动拆箱:把包装类类型转换为对应的基本数据类型

public static void main(String[] args) {
	// 更为简单地获取Integer的方式
	Integer i1 = 100;
	//   对象      = 默认是一个基本数据类型
	
	//jdk1.5的特性 --- 自动装箱
	
	//装箱: 把一个基本数据类型 变量对应的包装类.
	//自动: Java底层会帮我们自动的调用valueof方法.
	System.out.println(i1);
	
	//jdk1.5的特性 --- 自动拆箱
	//拆箱: 把一个包装类型 变成对应的基本数据类型
	int i2 = i1;
	System.out.println(i2);
	
	Integer i3 = 100; //自动装箱机制
	i3 += 200;//i3 = i3 + 200;
	           //会把i3这个对象变成基本数据类型100.
	            //100 + 200 = 300
	        //把基本数据类型300再次自动装箱变成Integer对象赋值给i3
	System.out.println(i3);
	
	
	//细节:null可赋值给引用类型,但是不可以赋给基本类型
	Integer i4 = null;
	if(i4 != null){
	    i4 += 200;
	    System.out.println(i4);
	}

注意:

  • 在使用包装类类型的时候,如果做操作,最好先判断是否为null,推荐的是,只要是对象在使用前就必须进行不为null的判断

练习:字符串中数据的处理

//需求:有一个字符串:“91 27 46 38 50”,把其中的每一个数存到int类型的数组中
//步骤:
//定义一个字符串
//把字符串中的数字数据存储到一个int类型的数组中
//遍历数组输出结果
public static void main(String[] args) {
    String s = "91 27 46 38 50";
    //获取字符串中的每一个数字.
    String[] strArr = s.split(" ");

    //创建一个int类型的数组.
    int [] numberArr = new int[strArr.length];

    //把strArr中的数据进行类型转换并存入到int数组中
    for (int i = 0; i < strArr.length; i++) {
        int number = Integer.parseInt(strArr[i]);
        numberArr[i] = number;
    }
    //遍历int类型的数组
    for (int i = 0; i < numberArr.length; i++) {
        System.out.println(numberArr[i]);
    }
}

2 泛型

2.1 泛型概述

不写泛型的弊端

public static void main(String[] args) {
	ArrayList list = new ArrayList();
	list.add("aaa");
	list.add("bbb");
	list.add("ccc");
	list.add(123);

	Iterator it = list.iterator();
	while(it.hasNext()){
		String next = (String) it.next(); // 强制类型转换
		int len = next.length();
		System.out.println(len);

	}
}

泛型是JDK5中引入的特性,它提供了编译时类型安全检测机制

  • 泛型的好处
    • 把运行时期的问题提前到了编译期间
    • 避免了强制类型转换
  • 泛型的定义格式
    • <类型>:指定一种类型的格式,尖括号里面可以任意书写,一般只写一个字母。例如:<E>、 <T>(不知道什么类型)
    • <类型1,类型2…>:指定多种类型的格式,多种类型之间用逗号隔开。例如: <E,T> 、<K,V>

2.2 泛型的用法

泛型可以使用的地方:

  • 类后面 —— 泛型类
  • 方法申明上 —— 泛型方法
  • 接口后面 —— 泛型接口

我们也可以自定义泛型

1. 泛型类

如果一个类的后面有 <E> ,表示这个类是一个泛型类。
创建泛型类对象时,必须要给这个泛型确定具体的数据类型。

泛型类格式:

修饰符 class 类名<类型> {  }

范例:

public class Test<T>{}

此处的 T 可以随便写为任意标识,常见的如T、E、K、V等形式的参数用于表示泛型

示例代码:

泛型类

public class Box<E> {
    private E element;

    public E getElement() {
        return element;
    }

    public void setElement(E element) {
        this.element = element;
    }
}

测试类

public static void main(String[] args) {
	Box<String> box1 = new Box<>();
	box1.setElement("给小丽的土味情话");

	String element1 = box1.getElement();
	System.out.println(element1);


	Box<Integer> box2 = new Box<>();
	box2.setElement(19);

	Integer element2 = box2.getElement();
	System.out.println(element2);
}

2. 泛型方法

泛型方法格式:

修饰符 <类型> 返回值类型 方法名(类型 变量名) {  }

范例:

public <T> void show(T t){}

示例代码:

// 定义一个泛型方法,传递一个集合和四个元素,将元素添加到集合中并返回
public static void main(String[] args) {
	ArrayList<String> list1 = addElement(new ArrayList<String>(), "a", "b", "c", "d");
	System.out.println(list1); // [a, b, c, d]

	ArrayList<Integer> list2 = addElement(new ArrayList<Integer>(), 1, 2, 3, 4);
	System.out.println(list2); // [1, 2, 3, 4]
}

public static <T> ArrayList<T> addElement(ArrayList<T> list , T t1 ,T t2 ,T t3 ,T t4){
	list.add(t1);
	list.add(t2);
	list.add(t3);
	list.add(t4);
	return list;
}

3. 泛型接口

泛型接口格式:

修饰符 interface 接口名<类型> {  }

范例:

public interface Generic<T>{}

泛型接口的使用方式:

  • 实现类也不给具体的泛型
  • 实现类确定具体的数据类型
    示例代码:
public class GenericityInterface {
    public static void main(String[] args) {
        GenericityImpl1<String> genericity = new GenericityImpl1<>();
        genericity.method("小丽给我的土味情话");

        GenericityImpl2 genericityImpl2 = new GenericityImpl2();
        genericityImpl2.method(19);
    }
}


interface Genericity<E>{
    public abstract void method(E e);
}
// 实现类确定具体的数据类型
class GenericityImpl2 implements  Genericity<Integer>{

    @Override
    public void method(Integer integer) {
        System.out.println(integer);
    }
}

// 实现类也不给具体的泛型
class GenericityImpl1<E> implements Genericity<E>{

    @Override
    public void method(E e) {
        System.out.println(e);
    }
}

2.3 类型通配符

类型通配符:<?>

  • ArrayList<?>:表示元素类型未知的 ArrayList,它的元素可以匹配任何的类型
  • 但是并不能把元素添加到 ArrayList中了,获取出来的也是父类类型

类型通配符上限:<? extends 类型>

  • ArrayListList <? extends Number>:它表示的类型是Number或者其子类型

类型通配符下限:<? super 类型>

  • ArrayListList <? super Number>: 它表示的类型是Number或者其父类型
public static void main(String[] args) {
    ArrayList<Integer> list1 = new ArrayList<>();
    ArrayList<String> list2 = new ArrayList<>();
    ArrayList<Number> list3 = new ArrayList<>();
    ArrayList<Object> list4 = new ArrayList<>();

    method(list1);
    method(list2);
    method(list3);
    method(list4);

    getElement1(list1);
    getElement1(list2);//报错
    getElement1(list3);
    getElement1(list4);//报错

    getElement2(list1);//报错
    getElement2(list2);//报错
    getElement2(list3);
    getElement2(list4);
}

// 泛型通配符: 此时的泛型?,可以是任意类型
public static void method(ArrayList<?> list) {
}

// 泛型的上限: 此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(ArrayList<? extends Number> list) {
}

// 泛型的下限: 此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(ArrayList<? super Number> list) {
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/148403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C库函数:stdlib.h

stdlib.h C 标准库 – <stdlib.h> | 菜鸟教程 (runoob.com) 该库主要涉及“字符串和其他类型数据的转换”、“内存空间的申请和释放”、“查找和排序”、随机数等功能函数。 7void *calloc(size_t nitems, size_t size) 分配所需的内存空间&#xff0c;并返回一个指向它…

大幅度减少零样本学习所需的人工标注

零样本旨在模仿人类的推理过程&#xff0c;利用可见类别的知识&#xff0c;对没有训练的样本不可见类别进行识别&#xff0c; 类别嵌入&#xff1a;Class embedding&#xff1a; 描述类别语义和视觉特征的向量&#xff0c;能够实现知识在类别间的转移&#xff0c;因而在零样本…

Web进阶:Day2 空间转换、动画

Web进阶&#xff1a;Day2 Date: January 4, 2023 Summary: 空间转换、动画 空间转换 **空间&#xff1a;**是从坐标轴角度定义的。 x 、y 和z三条坐标轴构成了一个立体空间&#xff0c;z轴位置与视线方向相同 空间转换也叫3D转换 属性&#xff1a;transform 语法&#xff1…

SolidWorks二次开发 API-获取当前语言与重命名文件

新的一年了&#xff0c;开始新的分享。 做SolidWorks二次开发的时候&#xff0c;难免会遇到多语言的问题。 针对不同语言的客户生成不同语言的菜单&#xff0c;所以我们要知道Solidworks的当前界面语言是什么。 这个就简单的说一下方法: GetCurrentLanguage 看结果&#xff1a;…

二、MySQL进阶教程

mysql高级 1&#xff0c;约束 上面表中可以看到表中数据存在一些问题&#xff1a; id 列一般是用标示数据的唯一性的&#xff0c;而上述表中的id为1的有三条数据&#xff0c;并且 马花疼 没有id进行标示 柳白 这条数据的age列的数据是3000&#xff0c;而人也不可能活到3000岁…

Curator实现分布式锁(可重入 不可重入 读写 联锁 信号量 栅栏 计数器)

文章目录前言代码实践1. 配置2. 可重入锁InterProcessMutex3. 不可重入锁InterProcessSemaphoreMutex4. 可重入读写锁InterProcessReadWriteLock5. 联锁InterProcessMultiLock6. 信号量InterProcessSemaphoreV27. 栅栏barrier8. 共享计数器8.1. SharedCount8.2. DistributedAto…

再学C语言28:输入和输出——重定向和文件

默认情况下&#xff0c;使用标准I/O包的C程序将标准输入作为其输入源&#xff0c;即标识为stdin的流 stdin流是作为向计算机中读取数据的常规方式而建立&#xff0c;可以是键盘、语音等不同输入设备 现代计算机还可以从文件中需求其输入&#xff0c;而不仅仅是传统的输入设备…

【docker10】Docker容器数据卷

Docker容器数据卷 1.Docker容器数据卷是什么 注意(坑): 容器卷记得加入 --privilegedtrue 为什么: docker挂载主目录访问如果出现cannot open directory.:Permission denied 解决办法: 在挂在目录后多加一个–privilegedtrue参数即可 如果是CentOS7安全模块会比之前系统版本加…

c++ - 第20节 - 异常

1.C语言传统的处理错误的方式 传统的错误处理机制&#xff1a; 1.终止程序&#xff0c;如assert&#xff0c;缺陷&#xff1a;用户难以接受。如发生内存错误&#xff0c;除0错误时就会终止程序。2.返回错误码&#xff0c;缺陷&#xff1a;需要程序员自己去查找对应的错误。如系…

基于神将网络方式进行数据回归拟合实例

前言本篇博客主要以神经网络拟合数据这个简单例子讲起&#xff0c;然后介绍网络的保存与读取&#xff0c;以及快速新建网络的方法。一、神经网络对数据进行拟合import torch from matplotlib import pyplot as plt import torch.nn.functional as F# 自定义一个Net类&#xff0…

Diffusion model(二): 训练推导详解

接上文 Diffusion的训练推导 1. 最小化负对数似然与变分下界 在弄懂diffusion model前向和反向过程之后&#xff0c;最后我们需要了解其训练推导过程&#xff0c;即用什么loss以及为什么。在diffusion的反向过程中&#xff0c;根据(3)(3)(3)式我们需要预测μθ(xt,t),Σθ(x…

【Linux】进程状态和进程优先级

文章目录1. 进程状态2. Linux的进程状态3. 僵尸进程4. 孤儿进程5. 进程优先级1. 进程状态 为了更深入地了解进程&#xff0c;我们需要知道进程的不同状态。 不同的操作系统&#xff0c;对于进程状态有着不同的说法&#xff0c;如&#xff1a;运行、阻塞、挂起、新建、就绪、等…

SIoU Loss

1、论文 题目&#xff1a;《SIoU Loss: More Powerful Learning for Bounding Box Regression》 参考博客&#xff1a; https://blog.csdn.net/qq_56749449/article/details/125753992 2、原理 有关IoU损失函数&#xff0c;像GIoU、DIoU、CIoU都没有考虑真实框与预测框之间的…

关于zookeeper和kafka不得不说的秘密

zookeeper简介1. zookeeper的概述ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a…

【四】Netty 分隔符和定长解码器的应用

Netty 分隔符和定长解码器的应用理论说明LineBasedFrameDecoder 开发大概流程代码展示netty 依赖EchoServer 服务端启动类EchoServerHandlerEchoClientEchoClientHandler结果打印客户端打印服务端打印FixedLengthFrameDecoder 开发代码展示EchoServer 服务端启动类EchoFixServe…

【云原生】k8s之pod控制器

内容预知 前言 1.pod控制器的相关知识 1.1 pod控制器的作用 1.2 pod控制器的多种类型 1.3 pod容器中的有状态和无状态的对比 &#xff08;1&#xff09;有状态实例 &#xff08;2&#xff09;无状态实例 2.Deployment控制器 2.1 SatefulSet 控制器的运用 2.1 Sateful…

从0到1完成一个Vue后台管理项目(六、404页)

往期 从0到1完成一个Vue后台管理项目&#xff08;一、创建项目&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;二、使用element-ui&#xff09; 从0到1完成一个Vue后台管理项目&#xff08;三、使用SCSS/LESS&#xff0c;安装图标库&#xff09; 从0到1完成一个Vu…

[LeetCode周赛复盘] 第 95 场周赛20230107

[LeetCode周赛复盘] 第 95 场周赛20230107 一、本周周赛总结二、 [Easy] 2525. 根据规则将箱子分类1. 题目描述2. 思路分析3. 代码实现三、[Medium] 2526. 找到数据流中的连续整数![在这里插入图片描述](https://img-blog.csdnimg.cn/237210adb20e457aaf2671e6e8f9e43b.png)2. …

Linux系统中C++多态和数据封装的基本方法

大家好&#xff0c;今天主要和大家分享一下&#xff0c;多态&#xff0c;数据封装的使用方法。 目录 第一&#xff1a;C中的多态 第二&#xff1a;C中数据封装方法 第一&#xff1a;C中的多态 C多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函…

将内核加载到内存

文章目录前言前置知识代码实验操作前言 本博客记录《操作系统真象还原》第五章第3个实验的操作~ 实验环境&#xff1a;ubuntu18.04VMware &#xff0c; Bochs下载安装 实验内容&#xff1a;将内核载入内存,初始化内核代码 实验原理 编写内核程序。将内核程序用dd命令复制到…