Java箱与泛型

news2024/12/23 8:12:30

 

 O的渐进表示法

O 的渐进表示法 去掉了那些对结果影响不大的项 ,简洁明了的表示出了执行次数。
void func1(int N){
int count = 0;
for (int i = 0; i < N ; i++) {
for (int j = 0; j < N ; j++) {
count++;
}
}
for (int k = 0; k < 2 * N ; k++) {
count++;
}
int M = 10;
while ((M--) > 0) {
count++;
}
System.out.println(count);
}

程序运行次数是N^2+2*N+10

 选大头就是N^2

// 计算阶乘递归factorial的时间复杂度?
long factorial(int N) {
return N < 2 ? N : factorial(N-1) * N;
}
// 计算斐波那契递归fibonacci的时间复杂度?
int fibonacci(int N) {
return N < 2 ? N : fibonacci(N-1)+fibonacci(N-2);
}
//factorial:::::通过计算分析发现基本操作递归了N次,时间复杂度为O(N)。
//fibonacci:::::通过计算分析发现基本操作递归了N^2次,时间复杂度为O( N^2)
  • 基本操作执行了2N+10次,通过推导大O阶方法知道,时间复杂度为 O(N)
  • 基本操作执行了M+N次,有两个未知数MN,时间复杂度为 O(N+M)
  • 基本操作执行了100次,通过推导大O阶方法,时间复杂度为 O(1)
  • 基本操作执行最好N次,最坏执行了(N*(N-1))/2次,通过推导大O阶方法+时间复杂度一般看最坏,时间复杂度为 O(N^2)
  • 基本操作执行最好1次,最坏lgN次,时间复杂度为 O(lgN) ps: 找每次排除掉一半的不适合值,一次二分剩下:n/2 两次二分剩下:n/2/2 = n/4)

1. 包装类

Java 中,由于基本类型不是继承自 Object ,为了在泛型代码中可以支持基本类型, Java 给每个基本类型都对应了一个包装类型。

1.1 基本数据类型和对应的包装类

  • 基本数据类型   包装类
  • byte          Byte
  • short         Short
  • int             Integer
  • long          Long
  • float          Float
  • double      Double
  • char          Character
  • boolean    Boolean

1.2 装箱和拆箱

装箱:基本类型->包装类型

拆箱:包装类型->基本类型

int i = 10;
// 装箱操作,新建一个 Integer 类型对象
Integer ii = Integer.valueOf(i);//显式装箱
Integer ij = new Integer(i);
// 拆箱操作,将 Integer 对象中的值取出,放到一个基本数据类型中
int j = ii.intValue();

1.3 自动装箱和自动拆箱

装箱和拆箱带来不少的代码量,所以为了减少开发者的负担, java 提供了自动机制。

int i = 10;
Integer ii = i; // 自动装箱
Integer ij = (Integer)i; // 自动装箱
int j = ii; // 自动拆箱
int k = (int)ii; // 自动拆箱

public static void main(String[] args) {
Integer a = 100;
Integer b = 100;
Integer c = 200;
Integer d = 200;
System.out.println(a == b);
System.out.println(c == d);

System.out.println(a - b);
System.out.println(c + d);
}
//true
//false
//0
//400

valueOf有数据限制,即256个数据,超出-128-127的将给出一个新的地址,所以上式才会出现true和false

2. 泛型类

泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译 器去做检查。 此时,就需要把类型,作为参数传递。需要什么类型,就传入什么类型。
语法格式:
class 泛型类名称 < 类型形参列表 > {
// 
}
class ClassName < T1 , T2 , ..., Tn > {
//
}
class 泛型类名称 < 类型形参列表 > extends 继承类   {
//  
}
class ClassName < T1 , T2 , ..., Tn > extends ParentClass < T1 > {
// 可以只使用部分类型参数
}
class MyArray<T> {
public Object[] array = new Object[5];

public T getPos(int pos) {
return (T)this.array[pos];
}
public void setVal(int pos,T val) {
this.array[pos] = val;
}

}
public class TestDemo {

public static void main(String[] args) {

MyArray<Integer> myArray = new MyArray<Integer>();//MyArray<Integer> myArray = new MyArray<>();
myArray.setVal(0,10);
myArray.setVal(1,12);
Integer ret = myArray.getPos(1);//int ret = myArray.getPos(1);
System.out.println(ret);
myArray.setVal(2,"bit");//报错,只能传入Integer
}
}
  • <>中一定是包装类型
  • 类名后的 <T> 代表占位符,表示当前类是一个泛型类
  • 【规范】类型形参一般使用一个大写字母表示,常用的名称有:

  • E 表示 Element
  • K 表示 Key
  • V 表示 Value
  • N 表示 Number
  • T 表示 Type
  • S, U, V 等等 ---- 第二、第三、第四个类型

  • 泛型只能接受类,所有的基本数据类型必须使用包装类!
那么,泛型到底是怎么编译的?这个问题,也是曾经的一个面试问题。泛型本质是一个非常难的语法,要理解好他还是需要一定的时间打磨。
在编译的过程当中,将所有的 T 替换为 Object 这种机制,我们称为: 擦除机制
Java 的泛型机制是在编译级别实现的。编译器生成的字节码在运行期间并不包含泛型的类型信息。
JVM中不存在泛型!!!!
运行时也没有泛型!!!!
泛型擦除机制文章介绍: https://zhuanlan.zhihu.com/p/51452375

2.1泛型的上界

在定义泛型类时,有时需要对传入的类型变量做一定的约束,可以通过类型边界来约束。
class 泛型类名称<类型形参 extends 类型边界> {
//
}
//示例
public class MyArray<E extends Number> {
//
}
//只接受 Number 的子类型作为 E 的类型实参

MyArray<Integer> l1; // 正常,因为 Integer 是 Number 的子类型
MyArray<String> l2; // 编译错误,因为 String 不是 Number 的子类型0
class Alge<T extends Comparable> {
        public T findMax(T[] array) {
            T max = array[0];
            for (int i = 0; i < array.length; i++) {
                if( max.compareTo(array[i]) < 0 ) {
                    max = array[i];
                }
            }
            return max;
        }
}
class Student implements Comparable{
    @Override
    public int compareTo(Object o) {
        return 0;
    }
}
class test1{
    public static void main(String[] args) {
        Integer array[]= {1,2,3,4,5};
            Alge<Integer> newr =new Alge();
        int a = newr.findMax(array);
        System.out.println(a);
        Student[] students = new Student[3];
        Alge<Student> Alge2 = new Alge<>();
        Student AD = Alge2.findMax(students);
    }
}

2.2泛型方法

2.3.1 定义语法

方法限定符 <类型形参列表> 返回值类型 方法名称(形参列表) { ... }

泛型方法的简单使用:

class Alge<T extends Comparable> {
        public<T extends Comparable> T findMax(T[] array) {
            T max = array[0];
            for (int i = 0; i < array.length; i++) {
                if( max.compareTo(array[i]) < 0 ) {
                    max = array[i];
                }
            }
            return max;
        }
}

class test1{
    public static void main(String[] args) {
        Integer array[]= {1,2,3,4,5};
            Alge alg1 =new Alge();
        Integer  x = (Integer) alg1.<Integer>findMax(array);
        System.out.println(x);

    }
}
public class Util {
//静态的泛型方法 需要在static后用<>声明泛型类型参数
public static <E> void swap(E[] array, int i, int j) {
E t = array[i];
array[i] = array[j];
array[j] = t;
}
}
//
Integer[] a = { ... };
swap(a, 0, 9);
String[] b = { ... };
swap(b, 0, 9);
//
Integer[] a = { ... };
Util.<Integer>swap(a, 0, 9);
String[] b = { ... };
Util.<String>swap(b, 0, 9);

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

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

相关文章

深度学习示例2-多输入多输出的神经网络模型

一、代码示例 from tensorflow import keras from tensorflow.keras import layers import numpy as np# 定义 多输入 多输出的模型 vocabulary_size = 1000 num_tags = 100 num_departments = 4title = keras.Input(shape=(vocabulary_size,), name = "title") tex…

【虚拟化】KVM常用命令操作(virsh磁盘管理)

目录 一、KVM概述 1.1 KVM工具栈 1.2 libvirt架构概述 1.3 KVM磁盘格式介绍 1.4 KVM磁盘操作常见语法 1.5 qemu-img命令简介 1.6 libguestfs安装 二、虚拟机磁盘管理 2.1 查看虚拟机磁盘 2.2 创建虚拟机磁盘 2.3 扩容磁盘容量 2.4 查看虚拟机存储状态 2.5 快照 2…

基于BiLSTM-CRF的医学命名实体识别研究(下)模型构建

一.生成映射字典 接下来需要将每个汉字、边界、拼音、偏旁部首等映射成向量。所以&#xff0c;我们首先需要来构造字典&#xff0c;统计多少个不同的字、边界、拼音、偏旁部首等&#xff0c;然后再构建模型将不同的汉字、拼音等映射成不同的向量。 在prepare_data.py中自定义…

实现自定义的移动端双指缩放

原理&#xff1a; DOM上绑定双指触控相关的事件&#xff0c;当双指触控时&#xff0c;保存初始距离&#xff0c;当双指移动时&#xff0c;计算两触控点的距离&#xff0c;根据移动中的距离与初始距离调节缩放比例&#xff0c;再根据缩放比例改变元素样式即可实现缩放 效果演示…

Java,版本控制:算法详解与实现

Spring Boot微服务架构技术及其版本号比较优化 随着云技术和分布式系统的快速发展&#xff0c;微服务架构已经成为现代软件开发不可或缺的一部分。 Spring Boot&#xff0c;作为一款广受欢迎的Java开发框架&#xff0c;其简洁的配置和快速启动的特性深受开发者青睐。 配合Sp…

旅游线路规划和路线下载

新疆旅游&#xff0c;规划一个北疆旅游线路安排如下&#xff1a; 第一天&#xff1a;从乌鲁木齐到魔鬼城&#xff0c;晚上住宿克拉玛依市乌尔禾区&#xff1b; 第二天&#xff1a;从克拉玛依市乌尔木区到五彩滩&#xff0c;晚上住宿贾登峪&#xff1b; 第三天&#xff1a;从…

win10本地设置无密码远程桌面登录设置

win10本地设置无密码远程桌面登录

软考超详细准备之软件设计师的计算机系统题型二(上午题)

目录 流水线 存储器: cache Cache命中率的相关图形 中断 相关习题 输入和输出 相关习题 总线 相关习题 加密技术与认证技术 相关习题 加密技术 相关习题 杂题 流水线 流水线&#xff08;Pipeline&#xff09;是一种在硬件设计中用于提高效率和吞吐量的技术&…

SOMEIP_ETS_088: SD_Answer_multiple_subscribes_together

测试目的&#xff1a; 验证设备&#xff08;DUT&#xff09;是否能够接受它接收到的每个SubscribeEventgroup条目。 描述 本测试用例旨在检查DUT在接收到包含多个SubscribeEventgroup条目的消息时&#xff0c;是否能够为每个条目发送SubscribeEventgroupAck。 测试拓扑&…

Runway删库跑路,备受瞩目的Stable Diffusion v1.5不见了!

替换方案&#xff1a; Hugging Face 模型镜像 - Gitee AIGitee AI 汇聚最新最热 AI 模型&#xff0c;提供模型体验、推理、训练、部署和应用的一站式服务&#xff0c;提供充沛算力&#xff0c;做中国最好的 AI 社区。https://ai.gitee.com/hf-models

【小程序 - 大智慧】深入微信小程序的核心原理

目录 课程目标背景双线程架构WebView 结构快速渲染 PageFrame编译原理Exparser通讯系统生命周期基础库解包跨端框架预编译半编译半运行运行时框架 主流技术Tarouni-app汇总 下周安排 课程目标 本次课程主要通过后台管理小程序回顾一下小程序的高阶语法&#xff0c;然后讲解整体…

Django+Vue协同过滤算法图书推荐系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作者&…

144. 腾讯云Redis数据库

文章目录 一、Redis 的主要功能特性二、Redis 的典型应用场景三、Redis 的演进过程四、Redis 的架构设计五、Redis 的数据类型及操作命令六、腾讯云数据库 Redis七、总结 Redis 是一种由 C 语言开发的 NoSQL 数据库&#xff0c;以其高性能的键值对存储和多种应用场景而闻名。本…

Vue3 实现解析markdown字段以及文件

Vue实现博客前端&#xff0c;需要实现markdown的解析&#xff0c;如果有代码则需要实现代码的高亮。 Vue的markdown解析库有很多&#xff0c;如markdown-it、vue-markdown-loader、marked、vue-markdown等。这些库都大同小异。这里选用的是marked。 一、安装依赖库 在vue项目…

数据权限的设计与实现系列6——前端筛选器组件Everright-filter使用探索

linear 功能探索 最终我们是需要使用 API 的方式&#xff0c;调用后端服务拉取数据填充筛选器组件&#xff0c;不过在探索阶段&#xff0c;直接用 API 方式&#xff0c;就需要构造 mock 数据&#xff0c;比较麻烦&#xff0c;因此先使用 Function 方式来进行功能验证。 组件初…

关于找不到插件 ‘org.springframework.boot:spring-boot-maven-plugin:‘的解决方案

找到项目结构后&#xff0c;点击库&#xff0c;全选所有后点击应用即可

超声波眼镜清洗机买哪款?2024超声波眼镜清洗机推荐

超声波清洗机正逐渐成为广受欢迎的清洁解决方案&#xff0c;它以高效、深入且细腻的清洁效果&#xff0c;以及操作上的简易性&#xff0c;赢得了消费者的广泛喜爱。不过&#xff0c;市面上琳琅满目的品牌、多样化的型号及波动的价格区间&#xff0c;确实给消费者挑选时带来了不…

C1-2 ABB二次SDK开发——手把手教登录对应的机器人控制器(图片引导操作)登录机器人控制器和刷新机器人列表

1.完成配置后我们开始进行操作 C1-1 ABB二次SDK开发——C#Window窗体-环境配置&#xff08;带ABB二次开发SDK资源包&#xff09;-CSDN博客文章浏览阅读95次。3.记住路径&#xff0c;右键C#引用&#xff0c;然后导入ABB.Robotics.Controllers.PC.dll。2.安装资源文件PCABB二次开…

通过组合Self-XSS + CSRF得到存储型XSS

在一次漏洞赏金挖掘中&#xff0c;我在更改用户名的功能点出发现了一个XSS&#xff0c;在修改用户名的地方添加了一个简单的XSS payload并且刷新页面&#xff1a; 用户设置面板 XSS证明 但是问题是这个功能配置并不是公共的&#xff0c;造成XSS漏洞的唯一方法是告诉受害者将其…

H5 响应式精品网站推荐导航源码

源码名称&#xff1a;响应式精品网站推荐导航源码 源码介绍&#xff1a;一款响应式精品网站推荐导航源码&#xff0c;可以自己修改代码替换图标图片和指向网址。背景图支持自动替换&#xff0c;背景图可以在img.php中修改 需求环境&#xff1a;H5 下载地址&#xff1a; http…