数据结构初始知识
集合框架
Java 集合框架(容器 ) Java Collection Framework ,定义在java.util 包下的⼀组接⼝ interfaces 和其实现类 classes
数据结构
数据结构:相互之间存在—种或多种特定关系的数据元素的集台
容器背后的数据结构
算法
算法:对特定问题求解步骤的一种描述,是为解决一个或一类问题给出的一个确定的、有限长的操作序列
算法效率
算法效率是衡量算法好坏的标准,算法效率=时间效率+空间效率
时间复杂度
时间复杂度(时间效率):衡量的是⼀个算法的运⾏速度,,算法中的基本操作的执⾏次数
⼤O的渐进表示法
1.⽤常数1取代运⾏时间中的所有加法常数,1-->加法常数
2.在修改后的运⾏次数函数中,只保留最⾼阶项
3.如果最⾼阶项存在且不是1,则去除与这个项⽬相乘的常数,最高阶1
func1的基本操作次数:N^2+2*N+10,大O的渐近表示法得时间复杂度O(N^2)
递归的时间复杂度=递归的次数*每次递归的次数
空间复杂度
空间复杂度(空间效率):衡量⼀ 个算法所需要的额外空间,算法在运⾏过程中临时占⽤存储空间⼤⼩的量度
⼤O渐进表示法
常见的复杂度
O(1) O(logN)"2为底" O(N) O(n*logN) O(N^2)
包装类
基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
装箱与拆箱
装箱
装箱:新建一个包装类型对象,将基本数据类型的值放入包装类对象的某个属性中
public class WrapperClass {public static void main(String[] args) {int num=11;Integer i=Integer.valueOf(num);System.out.println(num+" "+i);} }
自动装箱
public class WrapperClass {public static void main(String[] args) {int num=22;Integer integer=num;Integer integer1=(Integer) num;System.out.println(integer1);} }
拆箱
拆箱:将包装类对象的值取出,放到基本数据类型
public class WrapperClass {
public static void main(String[] args) {
int num=11;
Integer i=Integer.valueOf(num);
Integer i1=new Integer(i);
int num1=i1.intValue();
System.out.println(num1);
}
}
自动拆箱
public class WrapperClass {public static void main(String[] args) {int num=22;Integer integer=num;Integer integer1=(Integer) num;int num1=integer;int n=(int)integer;System.out.println(n);} }
自动拆箱与装箱的简写版
public class WrapperClass {
public static void main(String[] args) {
int a=100;
Integer b=a;
System.out.println("a="+a);
System.out.println("b="+b);
Double c=100.0;
double d=c;
System.out.println("c="+c);
System.out.println("d="+d);
}
}
装箱源码知:如果值在范围之内,数组中拿值,如果超过范围,new对象
public class WrapperClass {public static void main(String[] args) {Integer a = 127;Integer b = 127;Integer c = 128;Integer d = 128;System.out.println(a == b);System.out.println(c == d);} }
泛型
class 泛型类名称 < 类型形参列表 >{
}
class Arr<T>{public Object[] arr=new Object[5];public void setValue(int pos,T val){arr[pos]=val;}public T getValue(int pos){return (T) arr[pos];} } public class GenericClass {public static void main(String[] args) {Arr<Integer> array=new Arr<Integer>();array.setValue(0,10);int ret=array.getValue(0);System.out.println(ret);} }![]()
类名后的<T> 代表占位符,表示当前类是⼀个泛型类
• E表⽰Element
• K表⽰Key
• V表⽰Value
• N表⽰Number
• T表⽰Type
• S,U,V等等-第⼆、第三、第四个类型
泛型类的使用
泛型类 < 类型实参 > 变量名 ; // 定义⼀个泛型类引⽤
new 泛型类 < 类型实参 >( 构造⽅法实参 ); // 实例化⼀个泛型类对象
泛型只能接受类,所有基本数据类型必须使用包装类
类型推导
推导出实例化需要的类型实参Integer
裸类型
泛型小结:
1.泛型将数据类型参数化进行传递
2.泛型编译时自动进行类型检查和转化
泛型编译
类型擦除:编译时,Java编译器将泛型类型信息从代码中擦除,擦处后,泛型类型替换为边界类型/指定类型
擦除前代码:
class Arr<T>{public Object[] arr=new Object[5];public void setValue(int pos,T val){arr[pos]=val;}public T getValue(int pos){return (T) arr[pos];} }
擦除后代码:
class Arr{public Object[] arr=new Object[5];public void setValue(int pos,Object val){arr[pos]=val;}public Object getValue(int pos){return arr[pos];} }
泛型的桥接方法
泛型的上界
class 泛型类名称 < 类型形参 extends 类型边界 > {
...
}
复杂事例
package demo;class maxArray<T extends Comparable<T>> {public T findMax(T[] array){T max=array[0];for (int i = 0; i <array.length ; i++) {if (array[i].compareTo(max)>0){max=array[i];}}return max;} } public class Border{public static void main(String[] args) {maxArray<Integer> array=new maxArray<>();Integer[] arr={1,2,5,6,8,3,9,4,7};Integer ret=array.findMax(arr);System.out.println(ret);} }
没有指定类型边界E,可以视为EextendsObject
泛型方法
⽅法限定符 < 类型形参列表 > 返回值类型 ⽅法名称 ( 形参列表 ) {
...
}
class A{public<T extends Comparable<T>> T findMax(T[] array){T max=array[0];for (int i = 0; i <array.length ; i++) {if (array[i].compareTo(max)>0){max=array[i];}}return max;} } public class Border{public static void main(String[] args) {A a=new A();Integer[] array={1,2,3,4,5};a.<Integer>findMax(array);int r=a.findMax(array);System.out.println(r);} }
通配符
class Message<T> {private T message;public T getMessage() {return message;}public void setMessage(T message) {this.message = message;}}public class wildCard {public static void fun(Message<?> temp) {System.out.println(temp.getMessage());}public static void main(String[] args) {Message<String> message = new Message<>();message.setMessage("Hello");fun(message);Message<Integer> message1=new Message<>();message1.setMessage(11);fun(message1);}}
通配符的上界(? extends T
)
通配符下界(? super T
)
- 泛型通配符包括无界通配符、上界通配符和下界通配符
- 泛型的类型参数,可接受的类型范围,称为可接受范围
- 通配符可捕获的类型范围,称为可捕获范围
- 无界通配符可捕获,可接受范围内的全部类型
- 上界通配符可捕获,可接受范围内某个类型及其子类型
- 下界通配符可捕获,可接受范围内某个类型及其超类型