文章目录
集合框架的用途
当面临一个不知道要多大空间存储的场景,可以使用java集合框架。就像是C++的array。 Java集合框架提供了一套性能优良,使用方便的接口和类,他们位于java.util包中。并且提供多种排序,遍历等算法实现。集合里存的数据类型不一定是一样的,而且不能是基本数据类型。
集合框架对比
Collection 接口存储一组不唯一,无序的对象
List 接口存储一组不唯一,有序的对象。
Set 接口存储一组唯一,无序的对象
Map 接口存储一组键值对象,提供key到value的映射
ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高 。
LinkedList采用链表存储方式。插入、删除元素时效率比较高。
HashSet:采用哈希算法实现的Set,底层是用HashMap实现的,因此查询效率较高,由于采用hashCode算法直接确定元素的内存地址,增删效率也挺高的。
泛型
简介
泛型就相当于标签
形式: <>
集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object, Collection, List, ArrayList这个就是类型参数,即泛型。
注意:
(1)使用了泛型以后,可以确定集合中存放数据的类型,在编译时期就可以检查出来。
(2)泛型的类型:都是引用数据类型,不能是基本数据类型。
(3) ArrayList<Integer> al = new ArrayList <Integer> 0;
在JDK1.7以后可以写为:ArrayList <Integer> al = new ArrayList<>0;
--<> —钻石运算符
(4)只在编译的时候进行限制:
List<object> list1 = new ArrayList<>();
List<String> list2 = new ArrayList<>();
//list1 = list2; //这条语句是错误的,因为List<object>和List<String>不存在继承关系,而是并列关系。
简单测试
可以看到,不是Integer类型的已经报错了。
自定义泛型类
测试代码
package collectionstest;
class Generic<E> {
private E typeE;
private int n;
public E getE() {
return typeE;
}
public int getn() {
return n;
}
public void setn(int n) {
this.n = n;
}
public void setE(E e) {
this.typeE = e;
}
}
class GenericTest{
public static void main(String[] args) {
//指定类型,E按照Object类型处理。
Generic G = new Generic();
G.setE("hi");
G.setn(1);
System.out.println(G.getE());
System.out.println(G.getn());
/*输出
* hi
* 1
*/
}
}
class GenericTest1{
public static void main(String[] args) {
//指定类型
Generic<Integer> G = new Generic();
//G.setE("hi");报错
G.setE(0);
G.setn(