一、集合概述:
1.数组和集合有什么不同?
数组虽然也可以存储对象,但长度是固定的,集合长度是可变的;
数组中可以存储基本数据类型,集合只能存储对象;
2.集合类的特点:
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
二、集合Collection体系:
Collection
|--List :元素是有序的,元素可以重复,因为该集合体系有索引。
|--ArrayList:底层的数据结构使用的是数组结构,线程不同步。
特点:查询速度快,但是增删稍慢。
|--LinkedList:底层的数据结构使用的是链表数据结构.
特点:查询速度稍慢,但是增删速度很快。
|--Vector底层的数据结构是数组结构,线程同步。被ArrayList替代啦。
|--Set :元素是无序的,元素不可以重复,该集合没有索引。
|--HashSet:底层数据结构是哈希表
|--TreeSet:
三、迭代器:
其实就是集合的取出元素的方式(遍历)。
Iterator it = al.iterator(); //获取迭代器,用于取出集合中的元素
while(it.hasNext()) //hasNext(),只要集合中还有元素迭代,返回true。
{
sop(it.next());
}
四、List:特有方法
凡是可以操作角标的方法都是该体系特有的方法。
增:
add(index,element);
addAll(index,Collection);
删:
remove(index);
改:
set(index,element);
查:
get(index);
subList(from,to);
listIterator();
五、List集合特有的迭代器,listIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素。
因为会发生并发异常。
所以,在迭代器时,只能用迭代器的来操作元素,可是迭代器方法是有限的,
只能对元素进行判断,取出,删除的操作。
如果想要其他的操作如:添加,修改等,就需要使用其子接口,listIterator.
该接口只能通过List集合的listIterator方法获取。
例子:
ListIterator li = al.listIterator();
while(li.hasNext())
{
Object obj = li.next();
if(obj.equals("java02"))
//li.add("java008");
li.set("java008");
sop("obj="+obj);
}
六、LinkedL特有方法:
一》LinkedList特有方法;
addFirst();在集合的头部添加元素。
addLast();在集合的尾部添加元素。
获取元素但不删除元素;如果集合中没有元素,会出现 NoSuchElementException异常
getFirst();获取集合第一个元素
getLast();获取集合最后一个元素
获取元素,但是获取到的元素将被删除,如果集合中没有元素,会出现 NoSuchElementException异常
removeFirst();
removeLast();
在jdk1.6出现了代替方法:
offerFirst();
offerLast();
获取元素,但是不删除元素,如果集合中没有元素,会返回null
peekFirst();
peekLast();
获取元素,但是获取到的元素将被删除,如果集合中没有元素,会返回null
pollFirst();
pollLast();
七、HashSet:
|--Set :元素是无序的,元素不可以重复,该集合没有索引。
|--HashSet:底层数据结构是哈希表
HashSet是如何保证元素的唯一性那?
是通过元素的两个方法,hashCode和equals完成的。
如果元素的hashCode值相同,才会判断equals是否为true。
如果元素的hashCode值不同,不会调用equals方法。
注意:对于判断元素是否存在,以及删除等操作。
都依赖的方法是元素的hashCode和equals方法。
|--TreeSet:
1.TreeSet特点:
treeSet底层数据结构(二叉树)
2.TreeSet排序的第一种方式:
让元素自身具备比较性,
元素需要实现Comparable接口,覆盖compareto方法。
这种方式也成为,元素的自然顺序,或者叫做默认顺序;
TreeSet的第二种排序方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较性。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
定义一个类,实现Comparator接口,覆盖compare方法。
九、Map集合
1.Map集合:该集合存储键值对,一对一对往里存。而且要保证键的唯一性。
2.Map特有方法:
1.添加
put(K key,V value);
putAll(Map<? Extends K,? Extends V> m);
2.删除
clear();
Remove(Object key);
3.判断
containsValue(Object value);
containsKey(Object key);
isEmpty();
4.获取
Get(object key);
Size();
Values();
entrySet();
keySet();
3.Map体系:
|--HashTable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步 的,jdk1.0,效率高。
|--HashMap:底层是哈希表数据结构,允许使用null键null值,该集合是不同步的,jdk1.2. 效率高。
|--TreeMap:底层是二叉树数据结构,线程不同步,可以用于给map集合的键进行排序。
十、Map集合的2种取值方式:
1.Set<k> keySet:将map中所有的键存入到Set集合,因为set具备迭代器,
所以可以用迭代方式取出所有的键,再根据get方法,
获取每个键对应的值。
//先获取map集合中所有键的Set集合,keySet();
Set<String> keyset = map.keySet();
//有了set集合,就可以使用迭代器啦
Iterator<String> it = keyset.iterator();
while(it.hasNext())
{
String key = it.next();
System.out.print("key="+key="...");
//有了键可以通过map集合中的get方法获取对应的值
String value = map.get(key);
System.out.println("value="+value);
}
第二种方式:
一》Map.Entry:其实Entry也是一个接口,它是Map接口中的一个内部接口;
Interface Map
{
Public static interface Entry
{
Public abstract Object getKey();
Public abstract Object getValue();
}
}
Class HashMap implements Map
{
Class Haha implements Map.Entry
{
Public abstract Object getKey(){}
Public abstract Object getValue(){}
}
}