目录
一、泛型
1.1为什么引入泛型
接下来我们就来看一段代码
我们会发现当把MyArrayList中定义int类型的数组时,向其中添加的元素就只能是int类型,添加其他类型就会报错,而当我们用Object类型代替时,Object过于通用。针对上述问题,我们引入泛型来进行修改,让代码更加的通用。
1.2什么是泛型
泛型有<K>、<T>、<V>、<E>
占位符,表示当前的类是一个泛型类
class MyArrayList<T>{}
这样我们就可以将这个类的其他部分用<T>替换掉了,使用时就可以更加的方便。
class MyArrayList<T>{
public T[] elem;
public int useSize;
public MyArrayList(){
this.elem=(T[]) new Object[10];
}
public void add(T value){
this.elem[useSize]=value;
this.useSize++;
}
public T get(int key){
return this.elem[key];
}
}
注意:
this.elem=(T[]) new Object[10];不能写成this.elem=new T[10];
java的底层数组有一定的问题ArrayList<Object>不是Array<Integer>的父类,但是Object是Integer的父类。
1.3泛型类的使用
定义的里面的类容只能是String类型,自动对类型进行检测:
可以自动对类型进行转换:
String s=myArrayList.get(0);
注意:泛型的泛型参数只能是类类型或者简单类型的包装类。
泛型的擦除机制:
当我们编写一个新的类时我们进行对比我们会发现
MyArrayList<String> myArrayList=new MyArrayList<>();
System.out.println(myArrayList);
Person<Integer> person=new Person<>();
System.out.println(person);
它们的结果并没有泛型,这是我们可以得出泛型只存在于编译期间,而不存在于运行期间。运行时会将T变为Object类。
二、包装类的使用
2.1什么是包装类
包装类就是对基本数据结构进行包装,使它们拥有一定的方法更方便的满足使用。
基本数据类型和包装类的关系如下图所示:
基本数据类型 | 包装类 |
int | Integer |
char | Character |
double | Double |
float | Float |
byte | Byte |
short | Short |
long | Long |
boolean | Boolean |
2.2自动、手动封箱和装箱
手动封箱和开箱
int i=10;
//手动封箱
Integer integer=Integer.valueOf(i);
Integer integer1=new Integer(i);
//手动开箱
int a=integer.intValue();
自动封箱和开箱
//自动封箱
Integer i=10;
//自动开箱
int m=i;
三、List的常用方法
3.1list中的添加
List<Integer> list=new ArrayList<>();
list.add(1);//尾插法
list.add(1,12);//插入相应的位置
List<Integer> list1=new ArrayList<Integer>();
list1.add(1);list1.add(2);list1.add(3);list1.add(4);
list.addAll(list1);//将list1中的所有元素放入list中末尾
3.2list中的删除
List<Integer> list=new ArrayList<>();
list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);
list.remove(1);//对下标进行删除
System.out.println(list);//[1, 3, 4, 5]
3.3list中的获取和修改
List<Integer> list=new ArrayList<>();
list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);
System.out.println(list.get(2));//3
System.out.println(list.set(1, 10));//2
3.4list中的查找
List<Integer> list=new ArrayList<>();
list.add(1);list.add(2);list.add(3);list.add(2);list.add(1);
System.out.println(list.contains(1));//为1的值是否在list里面
System.out.println(list.indexOf(1));//查找当前数 0
System.out.println(list.lastIndexOf(1));//从后向前 4
3.5list中的截取和清空
List<Integer> list=new ArrayList<>();
list.add(1);list.add(2);list.add(3);list.add(2);list.add(1);
//对于部分数组的截取
List<Integer> list1=list.subList(1,3);
System.out.println(list1);//[2, 3]
list.clear();//对于数组的清空
System.out.println(list);//[]
3.6ArrayList和LinkedList的构造方法
//无参构造
List<Integer> list=new ArrayList<>();
//指定初始容量
List<Integer> list1=new ArrayList<>(5);
//使用list1中的初始容量
List<Integer> list2=new ArrayList<>(list1);
//无参构造
List<Integer> list3=new LinkedList<>();
四、杨辉三角的练习
力扣链接:杨辉三角。
什么是杨辉三角?
像这种形式不断累加的就是杨辉三角。
接下来就是对于杨辉三角的代码实现:
import java.util.ArrayList;
import java.util.List;
public class practice03 {
public static List<List<Integer>> Replace(int num){
List<List<Integer>> list=new ArrayList<>();
int[][] add=new int[num][num];
for(int i=0;i<num;i++){
List<Integer> list1=new ArrayList<>();
for(int j=0;j<=i;j++){
if(j==0||j==i){
add[i][j]=1;
}else {
add[i][j]=add[i-1][j]+add[i-1][j-1];
}
list1.add(add[i][j]);
}
list.add(list1);
}
return list;
}
public static void main(String[] args) {
List<List<Integer>> list=Replace(3);
System.out.println(list);
}
}