首页 > 编程语言 >Java箱与泛型

Java箱与泛型

时间:2024-09-05 10:25:17浏览次数:7  
标签:Java int class 泛型 Integer array public

 

 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次,有两个未知数M和N,时间复杂度为 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);

标签:Java,int,class,泛型,Integer,array,public
From: https://blog.csdn.net/2301_80873677/article/details/141824276

相关文章

  • Java顺序表和链表万字详解
    1.线性表的概念线性表(linearlist)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,......
  • java07
    一、java包一个包(package)可以定义为一组相互联系的类型(类、接口、枚举和注释),为这些类型提供访问保护和命名空间管理的功能。(一)Java中的包:java.lang-打包基础的类java.io-包含输入输出功能的函数(二)创建包创建包的时候要为包取一个合适的名字如果其他的一个源文件包含了......
  • 如何使用JavaScript遍历对象
    一、使用for-in循环——简单直接,快速上手for-in循环是最基础也是最常用的对象遍历方法。它语法简单,适合初学者快速掌握constuser={name:'Alice',age:25,job:'Engineer'};for(constkeyinuser){constvalue=user[key];console.log(`${key......
  • 【JAVA】第三天
    【JAVA】第三天一、面向对象1.static2.代码块二、继承三、权限修饰符四、方法重写五、多态1.自动类型转换2.强制类型转换六、final七、抽象类八、接口九、内部类十、枚举十一、泛类1.泛型类2.泛型接口3.泛型方法一、面向对象1.static类变量:属于类,与类一起加载一......
  • 搜狐2024年最新Java开发面试题及参考答案
    Redis的分布式锁Redis的分布式锁是一种在分布式环境下实现互斥访问共享资源的机制。在分布式系统中,多个进程或线程可能同时尝试访问同一资源,为了确保资源的一致性和安全性,需要使用分布式锁来进行协调。Redis实现分布式锁通常使用SETNX命令,该命令在指定的key不存在......
  • 240java jsp SSM Springboot小区物业管理系统报修小区环境缴费管理(源码+文档+开题+运
    项目技术:Springboot+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows......
  • 239java jsp SSM Springboot超市便利店信息管理系统超市供应商信息商品采购收银员工管
    项目技术:Springboot+Maven+Vue等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows......
  • 深入探讨Java中的分布式配置管理:从理论到实践
    在当今微服务和分布式系统的世界中,配置管理变得尤为重要。随着应用程序的规模和复杂性增加,传统的配置管理方法已经无法满足分布式系统的需求。本篇博客将深入探讨Java中的分布式配置管理,包括其基本概念、常见工具的对比、以及详细的代码示例,帮助你在实际项目中实现高效的配置管......
  • 深入探索Java中的分布式锁服务与Zookeeper集成
    引言在分布式系统中,资源竞争是一个不可避免的问题。为了确保多个机器或进程在访问共享资源时不发生冲突,我们需要一种有效的锁机制。分布式锁服务正是为了解决这个问题而设计的,而Zookeeper作为一种强大的分布式协调服务,可以帮助我们实现这种分布式锁服务。为什么选择Zookeeper......
  • 基于Java中的SSM框架实现校园门户网管理系统项目【项目源码+论文说明】
    基于Java中的SSM框架实现校园门户网管理系统演示摘要随着我国高校信息化建设内容的不断完善,很多高校都通过建立校园门户网站的方式搭建起高校与社会之间信息传递的桥梁,通过校园网站的建立来拓宽校园信息传播的渠道,利用全方位的校园环境及师资力量的介绍来吸引更多的学子,同......