首页 > 编程语言 >Java详析--泛型

Java详析--泛型

时间:2024-11-29 13:29:12浏览次数:7  
标签:详析 -- ArrayList add xx 数组 泛型

引入

在-->Java详解--泛型-CSDN博客这篇文章中,我们已经详细介绍了有关Java泛型的相关理论,其中包括引入泛型的原因,以及使用泛型时的注意事项,那么在这里,我们从泛型实现原理、实操,以及泛型相关引申角度再析Java泛型。

示例(帮理解)

还是以一个例子开始,在Java详解--泛型-CSDN博客这篇文章中,引入的示例是一个可以被申请任意类型的队列类,这里引入一个能拓展改变空间大小以及数据类型的数组:

package tree;
import java.util.*;//(几乎涵盖所有算法需要的类)
//import java.util.ArrayList; (被上面涵盖了)

public class Test {
    public static void main(String[] args) {
        String[] arr=new String[100];//定长数组【创建的瞬间,大小就已经固定不变了】
        ArrayList<String> xx=new ArrayList<>();//可拓展的数组
        xx.add("shs1"); //存入泛型数组的函数
        xx.add("hue2");
        xx.add("hue3");
        xx.add("hue4");
        xx.add("hue5");
        xx.add("hue6");
        xx.add("hue7");
        xx.add("hue8");

        String x=xx.get(1); //取出来xx[1] 
        System.out.println(x);
        xx.remove(2); //删除xx[2],删除后,后面的会自动向前覆盖
        int num=xx.size(); //size()获取String类型长度;xx.length()获取数字类型数组长度
        System.out.println(xx.toString());//打印的方法
//        ===========================
        ArrayList<Stack> z=new ArrayList<>(); //这里是我的另一个类文件
        //可以向里面放任何类型(泛型)
    }
}

【注:调用Java自带的ArrayList类需要引用"import java.util.ArrayList",也可以直接引用"import java.util.*",这个里面涵盖了Java算法大多数需要用到的类】

【注:获取数组长度时用到的函数方法(这里适用于Java方法没有被重写的情况)

  • 数组:使用 length 属性来获取数组的长度。
  • 字符串:使用 length() 方法来获取字符串的长度。
  • 集合:使用 size() 方法来获取集合的大小。

根据这个例子和注释,可以得出一个结论:泛型内不仅可以放数据类型,还可以申请一个类的类型数组,并在里面add进它本身以及子孙后代类的类:

【注:Animal是一个父类,Dog、Fish都是Animal的子类】

打印数组:

可以用自带的toString方法,也可以用下面两种遍历方法:

①推荐这种

for(String x:xx){
    System.out.println(x);
}

②和上面本质一样

for(int i=0;i<xx.size();i++){
    System.out.println(xx.get(i));
}

多维数组

只需要将<>里面嵌套填写另一个泛型,嵌套n个就是n-1维数组:

ArrayList<Integer> xx=new ArrayList<>();//一维整数
ArrayList<ArrayList<Integer>> xx=new ArrayList<>();//二维整数
ArrayList<ArrayList<ArrayList<Object>>> xx=new ArrayList<>();//三维某个数组

泛型的包装类

注意,泛型ArrayList<>的尖括号里面只能放引用类型,而不能放char,int等基础类型,所以引用类型String就填String,同理int[],String[]这种数组类型也可以直接填入(数组本身就是引用类型),而如下基础类型则对应如下包装类:

int---Integer

long--Long

float--Float

double--Double

char--Character

<>里面必须填上述,但是在其他方面可以照旧使用:

如下:

 【int类型的数据和Integer类型的数据都可以照旧被add进Integer类型的泛型数组中】

比较(⭐易混淆)

①都返回true

因为数据和句柄都相同

 ②⭐128陷阱

比较int类型的k1和k2所比较的是值,但是Integer类型的k3和k4比较的是句柄,不仅是Integer有这个问题,其他包装类也有这个问题:

在包装类中,如果数值相同,但是不在-128~127的范围中,则句柄指向的并不是一个对象,就会返回false;

那么如何比较这些包装类指向的数值呢?

将句柄指向的位置先转化成数据,再进行比较:

如下:

 泛型的实现原理

在实现泛型的应用后,不妨来看一眼泛型的内部原理本质就是这篇文章-->Java详解--泛型-CSDN博客

这就是刚才实操时用到的那些方法:

package tree;
import java.util.*;

public class Test<泛型> {
    private 泛型[] arr=(泛型[]) new Object[10];//强转一下
    private int flag=0;

    public void add(泛型 x){
        //满了扩容
        if(flag==arr.length){
            泛型[] arrnew=(泛型[]) new Object[arr.length*2];
            for(int i=0;i<arr.length;i++){
                arrnew[i]=arr[i];
            }
            arr=arrnew;
        }
        arr[flag++]=x;
    }
    public 泛型 get(int index){
        if(index<flag){
            return arr[index];
        }else{
            return null;
        }
    }
    //删除元素(本质还是覆盖)
    public void remove(int index){
        for(int i=index;i<flag-1;i++){
            arr[i]=arr[i+1];
        }
        flag--;
    }
    获取长度
    public int size(){
        return flag;
    }
}

HashMap泛型

说完泛型后,再额外引入一个特殊的泛型,同时也是最常用的泛型--HashMap泛型,这个概念在

-->每日小题--独一无二的出现次数(内含HashMap释)-CSDN博客这篇文章中已经引出了定义以及相关方法,和使用,再次重析:

HashMap<>是“key value”类型的:

【有一个特点,存或取数据的时间都是O(1)】

示例

package tree;
import java.util.*;

public class Test {
    public static void main(String[] args) {
        HashMap<String,Integer> map=new HashMap<>();
        map.put("张三",20);
        map.put("小红",10);
        map.put("小明",12);
        map.put("红太狼",30);

        Integer x=map.get("张三");//获取的值是Integer类型的,所以要用Integer来接收
        System.out.println(x);

        int y=map.get("张三");//由于Integer是int的包装类,所以本质相同
        System.out.println(y);
    }
}

动态规划大多数都是动态规划,困难级别的动态规划都需要hashmap()检测去重提升时间性能---困难级别的算法题大多数离不开HashMap.

HashMap遍历的两种方式:

(*^_^*)通过以上析,对Java泛型的使用有把握了吗?o(* ̄▽ ̄*)ブ 

标签:详析,--,ArrayList,add,xx,数组,泛型
From: https://blog.csdn.net/m0_74977981/article/details/144133050

相关文章

  • C++关于二叉树的具体实现
    目录1.二叉树的结构2.创建一棵二叉树3.二叉树的先序遍历1.借助栈的先序遍历2.利用递归的先序遍历4.二叉树的中序遍历5.二叉树的后序遍历1.借助栈的后序遍历2.利用递归的后序遍历6.二叉树的层序遍历7.tree.h8.tree.cpp9.main.cpp1.二叉树的结构对于二叉树来说......
  • 轻松理解操作系统 - 一文讲明 共享内存
    大家好,我是菲英。在前面呢,我们了解了进程间通信模块的管道机制和消息队列机制:管道机制是什么?消息队列是什么?本期,我们就继续来了解进程间通信模块的共享内存机制。首先,为什么它是最快的进程间通信机制?因为,它是多个进程的一块虚拟内存映射到同一块物理内存区域来实现数据共......
  • HTML5中required属性有什么应用场景?
    HTML5的required属性主要用于表单验证,它指定了某个表单元素是必填的。用户提交表单时,如果带有required属性的元素没有填写值,浏览器会阻止表单提交并显示错误消息。以下是required属性的一些常见应用场景:确保关键信息的收集:例如注册表单中的用户名、密码、邮箱等字段......
  • 实现文本的竖向排版
    前端实现文本竖向排版,有几种常见的方法:1.writing-modeCSS属性:这是最简单直接的方法。.vertical-text{writing-mode:vertical-rl;/*从右到左*//*或*/writing-mode:vertical-lr;/*从左到右*/}vertical-rl:文本竖排,从右向左排列,类似传统的中文竖排......
  • 遇到异常处理
    在使用MyBatis-Plus时,异常处理是一个重要的环节,因为数据库操作可能会因为各种原因失败,比如连接问题、SQL语法错误、违反数据库约束等。以下是一些处理异常的常见策略:全局异常处理:在Spring框架中,你可以使用@ControllerAdvice或@RestControllerAdvice注解来创建一个全......
  • hhdb数据库介绍(10-9)
    配置配置是管理平台为计算节点可视化配置所开发的功能,包括配置数据节点、存储节点、存储节点组、逻辑库、分片规则、表信息、数据库用户、计算节点等参数。同时配套设置了配置参数的校验与备份恢复的辅助功能。节点管理节点管理菜单主要为用户提供存储节点组、数据节点、存储节......
  • 用js实现最大化和最小化窗口
    //最大化窗口functionmaximizeWindow(){if(window.innerWidth<screen.availWidth||window.innerHeight<screen.availHeight){if(document.documentElement.requestFullscreen){document.documentElement.requestFullscreen();}elseif(d......
  • hhdb数据库介绍(10-8)
    首页管理平台通过数据可视方式在首页功能中实时展示计算节点集群的数据量、访问流量、集群组件状态、告警事件、安全防控等用户关心的信息。集群安全邮件通知:根据通知设置中监控开关是否打开判断,分为:全部开启、未开启、部分开启,点击跳转到通知设置页面系统定时检测:根据定时......
  • 怎么使图片宽度自适应呢?
    在前端开发中,使图片宽度自适应有几种常见的方法:1.使用width:100%:这是最简单直接的方法。设置width:100%会使图片的宽度与其父容器的宽度相同。如果父容器的宽度改变,图片的宽度也会随之改变。<imgsrc="image.jpg"style="width:100%;">优点:简单易用。缺点:图片......
  • 如果你来后接手的项目有很多问题,你该怎么办?
    如果我接手一个问题很多的前端项目,我会采取以下步骤:1.评估和理解现状:代码审查:仔细审查代码库,了解其结构、代码风格、依赖项以及现有功能。特别关注潜在的问题区域,例如代码重复、复杂逻辑、缺乏注释等。可以使用一些工具辅助代码审查,例如ESLint、JSHint等。功能测试:......