Collection
|--List:元素是有序的,元素可以重复。因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。
|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
|--HasSet:底层是数据结构是哈希表。
|--TreeSet:
-------------------------------------------------------------------------------------------------
List特有的方法:
凡是可以操作角标的方法都是该体系特有的方法。
1.增
add(index,element);
2.删
remove(index);
3.改
set(index,element);
4.查
get(index);
subList(from,to);
listIterator();
List集合特有的迭代器。ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。
所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的。
只能对元素进行判断,取出,删除的操作。
如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator.
该接口只能通过List集合的ListIterator方法获取。
List集合判断元素是否相同,依据的是元素的equals方法。
LinkedList:特有方法
getFirst();
getLast();
removeFirst();
removeLase();
获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
在JDK1.6出现了替代方法。
offerFirst();
offerLast();
peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素,会出现null。
pollFirst();
pollFirst()
获取元素,但是元素被删除。如果集合中没有元素,会出现null。
-------------------------------------------------------------------------------------------------
Set集合的功能和Collection是一致的。
|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
|--HashSet:底层是数据结构是哈希表。线程是非同步的。再往Haset里面存数据过程中,
首先比较的是数据对象的对应值,若它们的值是否相同。若值相同,就会进
一步比较是否为同一个对象, 若对象不一样,依然会存入;若对象一样,
则不再存入。就不再 存入此数据(数据的唯一性)。若存入的数值不一样,
就会存入。它接下来的操作就是比较对象,要是对象一样,就不在存入.
保证元素唯一性的原理:判断元素的hashCode值是否相同。
如果相同,还会继续判断元素的equals方法,是否为true。
HashSet是如何保证元素唯一性的呢?(参考:HashSetTest01)
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true;
如果元素的hashcode值不同,不会调用equals.
注意:对于判断元素是否存在,以及删除等操作,依赖的方法时元素的hashcode和equals方法。 -------------------------------------------------------------------------------------------------
|--TreeSet:可以对Set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据:CompareTo()方法return 0;
TreeSet排序的第一种方式:
让元素自身具备比较性。元素需要实现Comparable接口,覆盖comparaeTo方法。
这种方式成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式:
当元素自身不具备比较性时, 或者具备的比较性不是所需要的。这时需要让集
合自身具备比较性。在集合初始化时,就有了比较方式。
当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare方法。
记住,排序时,当主条件相同时,一定要判断一下次要条件。
当元素自身不具备比较性,或者具备的比较性不是所需要的。这个时候要让容器自身具备比较性。 定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
-----------------------------------------------------------------------
1.什么是迭代器呢?
它就是集合的取出元素的方式:Iterator()
格式一:
Iterator it = obj.Iterator();
while(it.hasNext()){ //遍历数组
System.out.println(it.next());
}
格式二:(与格式一相比,运行时节省内容空间)
for(Iterator it = obj.Iterator();it.hasNext();){
System.out.println(it.next());
}
--------------------------------------------------------------------
泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。
1.泛型的好处:
1.1 将运行时期出现的问题ClassCastException,转移到了编译时期。
方便与程序员解决问题,让运行时期问题减少,安全。
1.2避免了强制转换的麻烦。
2.泛型格式:
通过<>来定义要操作的引用数据类型。
通常在集合框架中很常见,只要见到<>就要定义泛型。
其实<>就是用来接收类型的。
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
--------------------------------------------------------------------
泛型类
1.什么时候定义泛型类?
早期定义Object未完成扩展。
现在定义泛型来完成扩展。
2.泛型类定义的泛型,在整个类中有效。
如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。
3.泛型类中的特殊之处:
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。
4.泛型限定是用于进行泛型扩展用的。
?:通配符。也可以理解为占位符。
5.泛型的限定:
? extends E:本行代码的意思是可以接受E类型或者E的子类。上限。
? super E:本行代码的意思是可以接受E类型或者E的父类型。下限。 |
|