抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

容 器


Collectiion接口

Collection接口声明了以下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
boolean add(Object element);
boolean remove(Object element);
boolean contains(Object element);

int size(); //容器中元素数量

boolean isEmpty();
void clear();

Iterator iterator();
boolean containsAll(Collection c);
boolean addAll(Collection c);

boolean removeAll(Collection c);
boolean retainAll(Collection c); //移除非交集元素,保留交集元素

Object[] toArray(); //转换成Object数组

注:List和Set是Collection的子接口

List接口

List特点:有序、元素可重复

  • 有序:每个元素都有索引标记
  • List通常允许满足 e1.equals(e2) 的元素重复加入容器

相比Collection接口,List中多了一些与索引有关的方法

1
2
3
4
5
6
7
8
void add(int index, Object element);
Object set(int index, Object element);
Object get(int index);
Object remove(int index);

int indexOf(Object o); //返回第一个匹配元素的索引,若没有返回-1
int lastIndexOf(Object o); //返回最后一个匹配的元素的索引,若没有返回-1

ArrayList类

ArrayList底层是用【数组】实现的存储。特点:查询效率高,增删效率低,线程不安全

我们知道,数组长度是有限的,而ArrayList是可以存放任意数量的对象,长度不受限制,那么它是怎么实现的呢?

本质上就是通过定义新的更大的数组,将旧数组中的内容拷贝到新数组,来实现扩容。

ArrayList的Object数组【初始化长度为10】,如果我们存储满了这个数组,需要存储第11个对象,就会定义新的长度更大的数组,并将原数组内容和新的元素一起加入到新数组中

LinkList类

LinkList底层用【双向链表】实现

特点:查询效率低、增删效率高,线程不安全

双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。

所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。

Vector类

Vector底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。 比如,indexOf方法就增加了synchronized同步标记。

如何选用ArrayList、LinkedList、Vector

  1. 需要线程安全时,用Vector。

  2. 不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)。

  3. 不存在线程安全问题时,增加或删除元素较多用LinkedList。

Map接口

Map就是用来存储“键(key)-值(value) 对”的。 Map类中存储的“键值对”通过键来标识,所以“键”不能重复。

Map接口常用方法:

1
2
3
4
5
6
7
8
9
10
11
12
Object put(Object key, Object value);
Object get(Object key);
Object remove(Object key);

boolean containsKey(Object Key);
boolean containsValue(Object value);

int size();
boolean isEmpty();

void putAll(Map t);
void clear();

Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。

HashMap类

HashMap采用哈希算法实现,是Map接口最常用的实现类。

由于底层采用了哈希表存储数据,我们要求键不能重复如果发生重复,新的键值对会替换旧的键值对

HashMap在查找、删除、修改方面都有非常高的效率

HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable的方法添加了synchronized关键字确保线程同步检查,效率较低。

HashMap与HashTable的区别

  1. HashMap: 线程不安全,效率高。允许key或value为null

  2. HashTable: 线程安全,效率低。不允许key或value为null

Set接口与HashSet类

Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。

Set容器特点:无序、不可重复

新元素如果和Set中某个元素通过equals()方法对比为true,则不能加入;

甚至,Set中也只能放入一个null元素,不能多个。

Set常用的实现类有:HashSet、TreeSet等,我们一般使用HashSet

HashSet基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Test {
public static void main(String[] args) {
Set<String> s = new HashSet<String>();
s.add("hello");
s.add("world");
System.out.println(s);
s.add("hello"); //相同的元素不会被加入
System.out.println(s);
s.add(null);
System.out.println(s);
s.add(null);
System.out.println(s);
}
}

迭代器

将容器转为迭代器:

1
Iterator<E> iter = aList.iterator()

使用Iterator迭代器遍历容器元素(List/Set/Map)

  • 迭代器遍历ArrayList
1
2
3
4
5
6
7
8
9
10
11
12
13
List<String> aList = new ArrayList<String>();

for (int i = 0; i < 5; i++) {
aList.add("a" + i);
}

for (Iterator<String> iter = aList.iterator(); iter.hasNext();){
String temp = iter.next();
System.out.print(temp + "\t");
if (temp.endsWith("3")) {// 删除3结尾的字符串
iter.remove();
}
}
  • 迭代器遍历Map 【1】
1
2
3
4
5
6
7
8
9
10
11
12
public class Test{
public static void main(String[] args){
Map<String, String> map = new HashMap<String String>();
map.put("A", "GaoQi");
map.put("B", "LiuBa");
Set<Entry<String, String>> ss = map.entrySet();
for(Iterator<Entry<String, String>> iterator = ss.iterator(); iterator.hasNext();){
Entry<String, String> e = iterator.next();
System.out.println(e.getKey() + "--" + e.getValue());
}
}
}
  • 迭代器遍历Map 【2】
1
2
3
4
5
6
7
8
9
10
11
12
public class Test {
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("A", "GaoQi");
map.put("B", "LiuBa");
Set<String> ss = map.keySet();
for (Iterator<String> iterator = ss.iterator(); iterator.hasNext();) {
String key = iterator.next();
System.out.println(key + "--" + map.get(key));
}
}
}

Collections工具类

类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。

  1. void sort(List) //对List容器内的元素排序,排序的规则是按照升序进行排序。
  2. void shuffle(List) //对List容器内的元素进行随机排列。
  3. void reverse(List) //对List容器内的元素进行逆续排列 。
  4. void fill(List, Object) //用一个特定的对象重写整个List容器。
  5. int binarySearch(List, Object) //对于顺序的List容器,采用折半查找的方法查找特定对象。

评论