java自学之路-----集合(List Set ) 泛型

List{

特点:取出的顺序和存入的顺序一致,元素有索引,可以重复

将List集合中的元素取出有两种方式{

1.使用迭代器iterator();

2.遍历集合,使用get(index)获取,这个方法只有List有

}


迭代器{

1.迭代器进行迭代容器时,不可以修改容器内容,(即:返回迭代器对象与遍历之间不可修改)否则会抛出:ConcurrentModificationException

2.Iterator有一个子接口ListIterator(List特有方法),使用该方法可以实现在迭代过程中完成对容器元素的操作

格式:ListIterator li = list.listIterator(); 

}


子类{

1.Vector:内部是数组数据结构,同步的,效率低

2.ArrayList:内部是数组数据结构,不同步,效率高,替代了Vector,具有数组查找操作速度快 的特点

3.LinkedList:内部是链表数据结构,不同步,具有链表增删元素速度快的特点

}

}


Set{

特点{

1.内部元素不重复(满足a.equals(b)时,a.b只能存在一个)

2.取出的顺序与存入的顺序不一致

3.容器内部只有一个null

}


子类{

HashSet{

特点:内部是哈希表的数据结构,不同步,稳定

存储方式{

1.先判断元素哈希值是否相同,相同时就判断内容是否相同

2.判断哈希值就是判断对象的hashCode()是否相同。判断内容用equals。如果hashCode不同则补判断equals

}

自定义hashSet容器的元素必须覆写hashCode和equals方法,用于定义规则,判断是否存入容器

}


LinkedSet:内部是链表(保证按一定的顺序存储)和哈希表(计算元素位置)相结合的数据结构


TreeSet{

特点:内部是二叉树结构,所以使用元素的顺序进行排序

注意{

自定义容器元素类型的时候必须定义比较方法,否则会抛出ClassCastException

判断元素唯一性的方式:在比较方法过程中,如果返回0,就表示两元素相同

}

元素比较方法{

一:让元素自身具备比较功能,即让该元素类实现Comparable接口并覆盖compareTo方法

二:让集合自身具备比较的功能,创建一个实现Comparator接口的子类,并覆盖compare方法(该方法传入两个元素类型参数,并在内部对其进行比较),将该子类对象作为集合的构造函数传递进TreeSet

}

}

}

}


泛型{

定义:jdk1.5之后出现的安全机制的新特性,在编译时期使用的技术
好处{
1.将运行时期的ClassCastException转到编译时期
2.省去了强制类型转换的麻烦
}

注意{
1.当操作引用数据类型不确定的时候,使用泛型(一个用于接收具体引用数据类型的参数范围)
2.在程序中,只要用到了带有泛型的类或接口就必须指定传入的具体引用数据类型
}

擦除与补偿{
1.擦除:运行时,会将泛型去除,所以生成的.class文件中是不带泛型的,(为了兼容原来的类加载器)
2.补偿:运行时通过获取元素的类型进行自动转换动作,就不需要使用者抢孩子转换
}

泛型的使用{
泛型类:使用泛型来接收类中要操作的引用数据类型,当类中的操作的引用数据类型不确定是,就使用泛型表示。
格式: class Name<t>{.........} :Name<String> n = new Name<String>()这个一个只能操作String类型数据的类

泛型方法:当方法静态时,就不能访问类定义的泛型(静态方法不需要对象,而类的泛型需要创建对象定义),所以就可以将泛型定义在方法内部(修饰词后,返回类型前)

格式:public static <T> void method(T obj){............}     该方法只能接收T类型的数据,

泛型接口:定义一个泛型接口后,如果该接口的实现类还不确定泛型的具体类型就依旧用class II<Q> implements I<Q>{public void show(Q q)(......)......}  ,如果确定了泛型类型就直接使用该类型class II implements I<String>{public void show(String q)(......)......} 。即何时确定具体类型就何时使用

}

通配符{
<?>定义:包含所有类型

上限与下限{
上限:对类型进行限定, ? extends E。接收E类型或E的子类型,用于存储元素
下限:对类型进行限定, ? super E。接收E类型或E的父类型,用于取出元素

}


注意:泛型运用的时候,等号左右两边必须相同

例:Collection<? extends Person(//如果该地方使用Person就报错,因为右边指定存储Student类型,而左边指定Person类型,类型不一致)> = new ArrayList<Student>( )

}

}


Set与List的总结{

保证唯一:Set

按顺序存储:TreeSet----》二叉树结构---》Comparable(元素使用)和Comparator(容器使用)

无序存储:HashSet---》哈希表结构---》hashCode和equals

输入与输出顺序一致:LinkedHashSet----》哈希表和链表结构

不唯一:List

改动数据频繁:LinkedList----》链表结构,就有Linked特点

查询操作:ArrayList---》数组结构,具有Array特点

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章