Collection:接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。但是却让其被继承产生了两个接口,就是Set和List。Set中不能包含重复的元素。List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。
Map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立的,但是都属于集合类的一部分。Map包含了key-value对。Map不能包含重复的key,但是可以包含相同的value。
Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:
1.hasNext()是否还有下一个元素。
2.next()返回下一个元素。
3.remove()删除当前元素。
三种重要的接口:
1、List(有序、可重复)
List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。
2、Set(无序、不能重复)
Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。
3、Map(键值对、键唯一、值不唯一)
Map集合中存储的是键值对,键不能重复,值可以重复。根据键得到值,对map集合遍历时先得到键的set集合,对set集合进行遍历,得到相应的值。
- List接口的实现:
ArrarList:底层数据结构是数组,默认大小是10,扩容方式是原大小的1.5倍。优点:查询快
缺点:插入和删除慢,线程不安全(尽量给定容量大小避免频繁数组扩容)
ArrayList的基本使用方法:
Vector:和ArrayList的区别不大,是线程安全的。
LinkedList:底层数据结构是链表,优点:删除和插入快,缺点:查找慢。
2.Set接口的实现:
HashSet: 底层用数组存储数据,默认初始化容量16,加载因子0.75。(实际上是HashMap的一个实例)
HashSet的应用:给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符,保证给定的字符串中有重复的
public static char findFirstRepeat(String A, int n) {
char[] a=A.toCharArray();
HashSet hs=new HashSet<>();
for(int i=0; i<n;i++)
{
if (!hs.add(a[i]))
{
return a[i];
}
}
return 0;
}
public static void main(String[] args)
{
System.out.println(findFirstRepeat("guoyinqiu110",12));
}
TreeSet:可以用来自动排序。
LinkedHashSet:继承于HashSet,又基于LinkedHashMap来实现的。
3.Map接口的实现:
HashMap:底层数据结构是数组加链表,用键值段的方式来保存数据。默认数组长度16,必须满足2 的次方,特点:1.key 不允许重复 2.允许空键和空值(但空键只有一个,且放在第一位) 3.元素是无序的,而且顺序会不定时改变
线程不安全,扩容的时候会出现问题
Hashtable:几乎和Hashtable一样,最大的区别在于线程安全问题。HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable。
LinkedHashMap:LinkedHashMap在HashMap的基础上增加了两个属性用于保证迭代顺序,分别是 双向链表头结点header 和 标志位accessOrder (值为true时,表示按照访问顺序迭代;值为false时,表示按照插入顺序迭代)。默认初始容量 (16)和默认负载因子(0.75)
TreeMap:红黑树算法的实现
迭代器的使用:三种迭代方式
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<String,String>();
map.put("001", "宝马");
map.put("002", "奔驰");
map.put("003", "奥迪");
firstIterator(map);
System.out.println("===");
twoIterator(map);
System.out.println("===");
threeItertor(map);
}
/**
* entry
* @param map
* @return
*/
public static void firstIterator(Map<String, String> map) {
for(Entry<String,String> entry:map.entrySet()) {
String keys = entry.getKey();
String values = entry.getValue();
System.out.println("key = "+ keys + ";value = "+ values);
}
}
/**
* keySet
* @param map
*/
public static void twoIterator(Map<String, String> map) {
for(String keys:map.keySet()) {
String values = map.get(keys);
System.out.println("key = "+ keys + ";value = "+ values);
}
}
/**
*
* @param map
*/
public static void threeItertor(Map<String, String> map) {
Iterator<String> iterator = map.keySet().iterator();
while(iterator.hasNext()) {
String keys = iterator.next();
String values = map.get(keys);
System.out.println("key = "+ keys + ";value = "+ values);
}
}