一、时间和空间复杂度
1.算法效率
算法效率分析分为两种:
1. 时间效率:也称为时间复杂度,主要衡量的是一个算法的运行速度。时间复杂度是衡量算法运行时间随输入规模增长的变化趋势。常见的时间复杂度从低到高有 O(1)(常数时间)、 O(logn)(对数时间)、 O(n)(线性时间)、 O(nlogn)(线性对数时间)、 O(n2)(平方时间)等。
**2.空间效率:**也称为空间复杂度,*+-问的5芙uiokl主要衡量的是一个算法运行过程中所需要的额外空间。
常见的空间复杂度有 O(1)(常数空间)、 O(n)(线性空间)等。
2.时间复杂度
2.1时间复杂度的概念
算法的时间复杂度是⼀个数学函数,算法中的基本操作的执⾏次数,为算法的时间复杂度。
2.2大O的渐进表示法
大O的渐进表示法(Big O Notation)是用于描述算法时间复杂度和空间复杂度的一种数学表示方法。它主要关注当输入规模 n 趋向于无穷大时,算法运行时间或所需空间的增长趋势,而忽略一些常数因子和低阶项的影响,从而更简洁地描述算法的效率特性。
2.3计算大O表示法的步骤
- 确定基本操作:找出算法中执行次数与输入规模相关的基本操作,例如循环中的比较、赋值操作等。
- 计算基本操作的执行次数:用数学表达式表示基本操作的执行次数与输入规模 n 的关系,得到一个函数 T(n)。
- 忽略低阶项和常数因子:在 T(n) 中,只保留增长速度最快的项(高阶项),并忽略该项的常数因子。例如,如果 T(n)=3n2+5n+2,当 n 趋向于无穷大时, n2 的增长速度远远快于 n 和常数项,所以忽略 5n 和 2,同时忽略 3n2 中的常数因子 3,最终得到 T(n)=O(n2)。
3.空间复杂度
空间复杂度是对⼀个算法在运⾏过程中临时占⽤存储空间⼤⼩的量度。 空间复杂度计算规则基 本跟时间复杂度类似,也使⽤⼤O渐进表⽰法。
二、包装类和泛型
1.包装类
1.1包装类
在Java中基本类型不是继承自Object,为了在泛类代码中可以支持基本类,Java给每个基本类型都对应了一个包装类。
Java中有8种基本数据类型,分别是 byte、short、int、long、float、double、char 和 boolean,对应有8个包装类:Byte、Short、Integer、Long、Float、Double、Character 和 Boolean。
除了Integer和Character,其余基本类型的包装类都是首字母大写
1.2装箱和拆箱

观察这段代码,为什么会打印flase

这是因为 Integer
类缓存了 -128
到 127
之间的整数。当你创建 Integer
对象且值在这个范围内时,Java 会直接使用缓存中的对象,而不是创建新的对象。所以 i
和 j
实际上引用的是同一个对象,因此 i == j
返回 true
。128
超出了 Integer
类缓存的范围(-128
到 127
),所以 a
和 b
是两个不同的对象,它们在内存中的地址不同,因此 a == b
返回 false
。
2.泛型
简单理解泛型就是适用于许多种类型。
Java泛型(Generics)是JDK 5.0引入的一个新特性,它提供了一种参数化类型的机制,允许在定义类、接口和方法时使用类型参数,从而使代码能够处理不同类型的数据,同时保持类型安全。
2.1引出泛型
所有的类的父类都默认为Object类。那么可以创建一个Object数组
代码示例:
观察下段代码,1号本身就是字符串,但是用String定义的变量去接受会编译错误。此时必须进行强制类型转换。

虽然在这种情况下,可以将任意类型的数据进行存储,但是更多时候还是希望他只存放一中类型,而不是同时持有这么多的类型。可以通过将类型作为参数传递,我们可以灵活地定义容器(如集合类)能够存储的数据类型,编译器会根据这个参数对代码进行严格的类型检查,大大增强了代码的类型安全性,减少了运行时类型转换错误的风险。
2.2语法
基础写法:class 泛型类名称<类型形参列表>{}
其他写法:class 泛型类名称<类型形参列表> extends 继承类(这里可以使用类型参数){}
泛型在实例化时在类名后加<>声明类型参数


代码解析:
1.类名后的<T>代表占位符,表示当前类是一个泛型类
2.【规范】类型形参一般使用一个大写字母表示,常用的名称有:
在Java泛型中,常用的类型参数占位符名称及其含义如下:
T
(Type) 最常用的占位符,表示一般的类型。比如在定义泛型类时,如果没有特定语义的类型需求,通常会使用 T
。
**E
(Element)**通常用于表示集合中的元素类型。在集合框架相关的泛型设计中经常出现。
K(Key)和 V(Value )用于表示键值对中的键和值的类型。在 Map 接口及其实现类中广泛应用。
N(Number) 用于表示数值类型。当泛型涉及到处理数字相关的操作时使用。
S、U、V 等当需要多个类型参数时,除了 T 之外,按照字母顺序使用这些占位符表示第二、第三、第四个类型参数等。
3.此时不需要强制类型转化,因为已经确定了类型
4.编译器会在存放元素的时候帮助我们进行类型检查,如果放入非String类型的元素,编译器会报错。
注意:泛型只能接受类,所有的基本数据类型必须使用包装类!