黑马程序员_学习记录13:集合框架

来源:互联网 发布:新手怎么淘宝购物 编辑:程序博客网 时间:2024/05/24 01:53
------- android培训、java培训、期待与您交流! ----------

集合框架

存储对象的两种方式:数组、集合

数组长度是固定的,集合长度是可变的;数组可以存储基本数据类型,集合只能存储对象。

为什么会出现这么多的容器呢?因为每一个容器对数据的存储方式都有不同。这个存储方式称之为:数据结构。

Collection定义了集合框架的共性功能。

1,添加

add(e);

addAll(collection);

2,删除

remove(e);

removeAll(collection);

clear();

3,判断。

contains(e);

isEmpty();

4,获取

iterator();

size();

5,获取交集。

retainAll();

6,集合变数组。

toArray();

1add方法的参数类型是Object。以便于接收任意类型对象。

2,集合中存储的都是对象的引用(地址)

什么是迭代器呢?

其实就是集合的取出元素的方式。如同抓娃娃游戏机中的夹子。

迭代器是取出方式,会直接访问集合中的元素。所以将迭代器通过内部类的形式来进行描述。

通过容器的iterator()方法获取该内部类的对象。

Iterator it = al.iterator();//获取迭代器,用于取出集合中的元素。

就把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内容的元素。那么取出方式就被定义成内部类。而每一个容器的数据结构不同,所以取出动作细节也不一样。但是都有共性内容判断和取出。那么可以将功能抽取。那么这些内部类都符合一个规则。该规则是Iterator。如何获取集合的取出对象呢?通过一个对外提供的方法—iterator()。

Collection

|--List:元素是有序的,元素可以重复。因为该集合体系有索引。

|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍 慢。线程不同步。

|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不 同步。

|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。

|--Set:元素是无序,元素不可以重复。、

List

特有方法。凡是可以操作角标的方法都是该体系特有的方法。

add(index,element);

addAll(index,Collection);

remove(index);

set(index,element);

get(index):

subList(from,to);

listIterator();

int indexOf(obj):获取指定元素的位置。

ListIterator listIterator();

List集合特有的迭代器。ListIteratorIterator的子接口。

在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的listIterator方法获取。

LinkedList:特有方法:

addFirst();

addLast();

getFirst();

getLast();获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException

removeFirst();

removeLast();获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException

JDK1.6出现了替代方法。

offerFirst();

offerLast();

peekFirst();

peekLast();获取元素,但不删除元素。如果集合中没有元素,会返回null

pollFirst();

pollLast();获取元素,但是元素被删除。如果集合中没有元素,会返回null

|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、

|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

HashSet是如何保证元素唯一性的呢?

是通过元素的两个方法,hashCodeequals来完成。

如果元素的HashCode值相同,才会判断equals是否为true

如果元素的hashcode值不同,不会调用equals

注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcodeequals方法。

|--TreeSet

Set集合的功能和Collection是一致的。

|--Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。、

|--HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

HashSet是如何保证元素唯一性的呢?

是通过元素的两个方法,hashCodeequals来完成。

如果元素的HashCode值相同,才会判断equals是否为true

如果元素的hashcode值不同,不会调用equals

注意,对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcodeequals方法。

|--TreeSet:可以对Set集合中的元素进行排序。

底层数据结构是二叉树。

保证元素唯一性的依据:

compareTo方法return 0.

TreeSet排序的第一种方式:让元素自身具备比较性。

元素需要实现Comparable接口,覆盖compareTo方法。

也种方式也成为元素的自然顺序,或者叫做默认顺序。

TreeSet的第二种排序方式。

当元素自身不具备比较性时,或者具备的比较性不是所需要的。

这时就需要让集合自身具备比较性。

在集合初始化时,就有了比较方式。

Set集合的功能和Collection是一致的。

当元素自身不具备比较性,或者具备的比较性不是所需要的。

这时需要让容器自身具备比较性。

定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

当两种排序都存在时,以比较器为主。

定义一个类,实现Comparator接口,覆盖compare方法。



有序否

允许元素重复否

Collection

List

Set

AbstractSet

HashSet

TreeSet

是(用二叉树排序)

Map

AbstractMap

使用key-value来映射和存储数据,Key必须惟一,value可以重复

HashMap

TreeMap

是(用二叉树排序)



几个面试常见问题:
1.Q:ArrayListVector有什么区别?HashMapHashTable有什么区别?
 A:VectorHashTable是线程同步的(synchronized)。性能上,ArrayListHashMap分别比VectorHashtable要好。

2.Q:大致讲解java集合的体系结构
 A:ListSetMap是这个集合体系中最主要的三个接口。
 其中ListSet继承自Collection接口。
 Set不允许元素重复。HashSetTreeSet是两个主要的实现类。
 List有序且允许元素重复。ArrayListLinkedListVector是三个主要的实现类。
 Map也属于集合系统,但和Collection接口不同。Mapkeyvalue的映射集合,其中key列就是一个集合。key不能重复,但是value可以重复。HashMapTreeMapHashtable是三个主要的实现类。
 SortedSetSortedMap接口对元素按指定规则排序,SortedMap是对key列进行排序。

3.QComparableComparator区别
 A:调用java.util.Collections.sort(List list)方法来进行排序的时候,List内的Object都必须实现了Comparable接口。
 java.util.Collections.sort(List listComparator c),可以临时声明一个Comparator 来实现排序。
 Collections.sort(imageList, new Comparator() {
 public int compare(Object a, Object b) {
 int orderA = Integer.parseInt( ( (Image) a).getSequence());
 int orderB = Integer.parseInt( ( (Image) b).getSequence());
 return orderA - orderB;
 }
 });
 如果需要改变排列顺序
 改成return orderb - orderA 即可。

 ------- android培训、java培训、期待与您交流! ----------

原创粉丝点击