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

news2024/12/24 8:58:11

包装类与泛型

  • 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/148554.html

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

相关文章

✿✿✿JavaScript --- Ajax异步请求与JSONP 跨域请求

目 录 一、原生的Ajax请求 1.异步和同步 2.Ajax介绍 3.实现方式 (1)原生的JS实现方式&#xff08;了解&#xff09; (2)原生AJax发送Post请求&#xff0c;并携带请求参数 二、JQuery封装后的Ajax 1.JQeury实现方式 2. $.get()&#xff1a;发送get请求 3.$.post()&…

存储随笔2022年度最受欢迎文章榜单TOP15

回首2022感谢各位粉丝朋友的一路支持与陪伴存储随笔为您献上2022年度最受欢迎文章榜单TOP152023&#xff0c;一起向未来&#xff01;TOP1&#xff1a;固态硬盘SSD入门级白皮书主要从固态硬盘的原理/接口形态/寿命/使用场景/等不同角度&#xff0c;来对比不同的人群需要什么样的…

[linux]vim编辑器

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要讲解vim的使用和一些vim的常用操作&#xff0c;以及如何解决…

Flow 转 LiveData 后数据丢了,肿么回事?

翻译自&#xff1a; https://arkadiuszchmura.com/posts/be-careful-when-converting-flow-to-livedata/ 前言 最近我在负责一段代码库&#xff0c;需要在使用 Flow 的 Data 层和仍然依赖 LiveData 暴露 State 数据的 UI 层之间实现桥接。好在 androidx.lifecycle 框架已经提供…

C语言-指针进阶-函数指针数组应用-计算器(9.2)

目录 1. 函数指针 2. 函数指针数组 2.1函数指针数组的定义 2.2函数指针数组应用 3. 指向函数指针数组的指针 思维导图&#xff1a; 1. 函数指针 直接上代码&#xff1a; #include <stdio.h>void test() {printf("hehe\n"); }int main() {printf("%…

【Java】数组的复制、反转、查找、排序

数组的复制、反转、查找、排序 复制 其中最关键的一点是搞清楚为什么数组复制和基本数据类型复制不同&#xff0c;是什么导致了这样的不同&#xff1f; 先来看例子 package com.atguigu.java;public class ArrayTest3 {public static void main(String[] args) {//新建arr数…

【Java数据结构与算法】Day2-高级排序(希尔、归并、快速、计数)

✅作者简介&#xff1a;热爱Java后端开发的一名学习者&#xff0c;大家可以跟我一起讨论各种问题喔。 &#x1f34e;个人主页&#xff1a;Hhzzy99 &#x1f34a;个人信条&#xff1a;坚持就是胜利&#xff01; &#x1f49e;当前专栏&#xff1a;【Java数据结构与算法】 &#…

实验七:555定时器及其应用

答疑解惑用555定时器组成的单稳态电路中&#xff0c;若触发脉冲宽度大于单稳态持续时间&#xff0c;电路能否正常工作&#xff1f;如果不能&#xff0c;则电路应做如何修改&#xff1f;答:若触发脉冲宽度大于单稳态持续时间后&#xff0c;输出脉冲宽度将等于触发脉冲的低电平持…

【精】EditorConfig 小老鼠 跨编辑器 | IDE 保持一致的编码风格

【精】EditorConfig 小老鼠 跨编辑器 | IDE 保持一致的编码风格 &#x1f345;因发布平台差异导致阅读体验不同&#xff0c;将本文原编写地址贴出&#x1f339;&#xff1a;《【精】EditorConfig 小老鼠 跨编辑器 | IDE 保持一致的编码风格》 文章目录【精】EditorConfig 小老鼠…

实时数仓方案

2、实时数仓方案 2.1、为何需要实时数仓架构 随着数据量的增大&#xff0c;传统数据的方案在时效性上和数据维护上变得越来越困难。实时数仓架构应运而生。 具体方案落地上实时数仓有很多方案可以选择&#xff0c;不同的业务和应用场景到底应该选择哪种技术方案&#xff1f;…

React18新特性

React 团队在 2022 年 3 月 29 日正式发布了 React 的第 18 个版本。 在这篇文章里简单介绍 React 18 的新特性&#xff0c;React Concurrent Mode&#xff08;并发模式&#xff09;的实现&#xff0c;以及简要的升级指南。 New Features Automatic Batching 早在 React 18 之…

011-Ensp-实验-配置ACL

实验要求 1.通过ACL 使PC1无法访问PC3 实验结构 实验步骤 基础环境配置: PC间互通 1. PC1 2 3 配置IP网关 2. LSW2 创建三个vlan &#xff0c;g0/0/2 g0/0/3 g/0/04 类型配置为Access 分别加入三个vlan g0/0/1 配置为trunk 并允许所有vlan通过 3. LSW1 g0/0/1 配置trunk …

vector底层实现及深层次拷贝问题

目录 大框架 接口实现 深层次拷贝问题&#xff08;两次深拷贝&#xff09; 大框架 为了与库里实现的更接近一些&#xff0c;先来看一下STL中是如何实现vector的&#xff08;这里不是PJ版&#xff0c;PJ版稍微晦涩一点不容易理解&#xff0c;这里采用Linux下g的版本&#xf…

VectorNet: Encoding HD Maps and Agent Dynamics from Vectorized Representation

Paper name VectorNet: Encoding HD Maps and Agent Dynamics from Vectorized Representation Paper Reading Note URL: https://arxiv.org/pdf/2005.04259.pdf TL;DR waymo 出品的 CVPR2020 论文 &#xff0c;关注在自动驾驶场景&#xff08;复杂多智能体系统&#xff0…

【算法自由之路】快慢指针在链表中的妙用(下篇)

【算法自由之路】快慢指针在链表中的妙用&#xff08;下篇&#xff09; 继上篇之后&#xff0c;链表这块还有两个相对较难的问题我们继续举例。 问题 1 给定具有 random 指针的 next 方向无环单链表&#xff0c;复制该链表 单听这个问题可能有点懵&#xff0c;这个链表结构我…

PCB封装创建(CHIP类)

PCB封装要有以下内容 PCB焊盘管脚序号丝印阻焊1脚标识目录 CHIP类&#xff08;电阻 电容 电感 三极管&#xff09; 0805C 0805R 0805L SOT-23 1.CHIP类&#xff08;电阻 电容 电感 三极管&#xff09; 1.新建一个PCB元件库 打开PCB Library 以下以0805为例。 创建080…

“CAcModuleResourceOverride”: 未声明的标识符

本文迁移自本人网易博客&#xff0c;写于2011年10月8日首先是运行时提示&#xff1a;试图执行系统不支持的操作。添加CAcModuleResourceOverride resourceOverride; 后&#xff0c;编译出现如下错误&#xff1a;error C2065: “CAcModuleResourceOverride”: 未声明的标识符 添…

scikit-learn 普通最小二乘法

scikit-learn 普通最小二乘法什么是普通最小二乘法&#xff1f;参考文献什么是普通最小二乘法&#xff1f; 线性回归模型的数学表达式如下&#xff1a; y^(w,x)w0w1x1…wpx1\hat{y}(w, x)w_{0}w_{1} x_{1}\ldotsw_{p} x_{1}y^​(w,x)w0​w1​x1​…wp​x1​ 其中 w0,w1,...,w…

Java--集合

1、集合框架 集合框架被设计成要满足以下几个目标。 该框架必须是高性能的。基本集合&#xff08;动态数组&#xff0c;链表&#xff0c;树&#xff0c;哈希表&#xff09;的实现也必须是高效的。 该框架允许不同类型的集合&#xff0c;以类似的方式工作&#xff0c;具有高度的…

【自用】高频电子线路复习(更新中)

疫情原因 没有考试就放假回家了 返校后将先进行死亡考试周 七天考完九门 回校再进行极限复习只能说可以通过 而不利于绩点的提升 所以要从现在开始抽取一些时间进行学习 第七章 频率变换方法与电路分析 7.1 非线性电路包括 发送端的高频振荡器、倍频器、谐振功率放大器和调…