Java集合合集
预备知识
泛型的意义
试想一下我们如何实现一个能传入任意类型数据的顺序表?
- 可以把顺序表的参数类型设置成Object类型进行传入数据,但是在取出数据时需要进行强转,所以取出时需要知道取出的类型具体是什么,所以这种方法并不好
- 使用泛型实现
class MyArrayList<T>{//这个T代表占位符,也可以是其他字母
public T[] elem;
public int size;
public MyArrayList(){
this.elem = new (T[])Object[10];
//不可以写成this.elem = new T[10],因为不能new范型类型的数组;
this.size = 0;
}
......
}
public class main{
public static void main(String[] args){
MyArrayList<Integer> l1 = new MyArrayList<>();
MyArrayList<String> l1 = new MyArrayList<>();
MyArrayList<Double> l1 = new MyArrayList<>();
......
}
}
意义
- 可以自动进行类型检查
- 取元素时自动类型转换
一些问题
- 在使用时传入的类型不可以是简单数据类型,如:
int,double,float...
- 泛型的擦除机制:
- 泛型在编译的时候,并不会进行指定类型的替换,而是拿着指定的类型进行检查,也就是说,在编译时,拿着你指定的类型进行类型检查,而不是替换
- 编译的时候会进行类型擦除,编译是会把泛型都擦除为Object类型,在取出元素是帮你自动做类型转换
- 不能new泛型类型的数组
- 泛型类型的参数不参与泛型类型的组成
ArrayList<String> arr = new ArrayList<>() 其中arr的类型是ArrayList类型,而不是ArrayList<String>类型
包装类
- 装包/装箱
- 自动装包
int a = 10; Integer a1 = a;
- 显示装包:
int a = 10; Integer a1 = new Integer(a);
int a = 10;Integer a2 = Integer.valueof(a);
- 自动装包
- 拆包/拆箱
- 自动拆包
Integer i = 10;a = i;
- 显示拆包
Integer i = 10;int a = i.intValue();
- 自动拆包
问题
下面程序的输出结果是什么?
Integer a = 100;
Integer b = 100;
Integer c = 130;
Integer d = 130;
sout(a == b);
sout(c == d);
输出结果:
true
false
好冷啊
由查看源码可知
当Integer的值在-127-127之间,会从源码中的一个缓存数组中返回值
当不再此范围之内,会new
一个Integer
对象并返回,上面这种赋值方式会默认调用valueOf
方法赋值
List
用法
ArrayList
- 创建线性表:
List<Integer> l = new ArrayList<>();
- 当第一次调用
new ArrayList<>();
里面的大小默认是10,后续进行扩容是进行1.5倍方法扩容
- 添加元素:
l.add(10);l.add(20);
通过尾插法插入元素l.add(1,30);
插入元素到指定下标位置- l.addAll();
- 删除元素:
list.remove(1)//删除1下表的元素
Integer l= 1;``list.reoove(l);删除值为1的元素
- 修改元素:
list.set(0,19);
把0下标的元素改为19
- 取指定范围:(慎用,若修改新的list1,list的值也会变)
List<Integer> list1 = list.subList(1,3);
把1-3的值取到list1中,属于浅拷贝
迭代器
可以用来遍历所有的集合(对于list还可以用forEach或for循环进行遍历)
Iterator<Integer> iter = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}