Java集合框架
将集合的接口与实现分离
队列通常有两种实现形式:循环数组和链表
迭代器
Iterator接口的remove方法将会删除上次调用next方法时返回的元素。
- Set类型是无序的
- list.set()方法用一个新元素取代调用next或previous方法返回的上一个元素 例如
ListIterator<String> iter=list.listIterator();
String oldValue=iter.next();// returns first element
iter.set(newValue);//set first element to newValue
- 如果迭代器 发现他得集合被另一个迭代器修改了,或是被该集合自身的方法修改了,就会抛出一个ConcurrentModificationException异常。
List<String> list=...;
ListIterator<String> iter1=list.listIterator();
ListIterator<String> iter2=list.listIterator();
iter1.next();
iter1.remove();
iter2.next();//throws ConcurrentModificationExcepiton
-
为了避免发生并发修改的异常,应该遵循下述原则:可以根据需要给容器附加许多的迭代器,但是这些迭代器智能读取列表。另外,再单独附加一个既能读又能写的迭代器。
-
LinkedList类还提供了一个用来访问某个特定元素的get方法
LinkedList<String> list=...;
String obj=list.get(n);
当然这个方法的效率并不太高,如果用这个方法说明可能用了错误的数据结构
- 下面这段代码效率极低
for(int i=0;i<list.size();i++)
{
do something with list.get(i);
}
//每次查找元素都要从列表的头部重新开始搜索,LinkedList对象根本不做任何缓存位置信息的操作
- 由于java迭代器指向两个元素之间的位置,所以可以同时产生两个索引;
- 代码测试上述方法
package listlearn;/*
*@author havel 2018/7/16 15:11
*/
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
public class LinkedListTest {
public static void main(String[] args){
List<String> lista = new LinkedList<>();
lista.add("A");
lista.add("B");
lista.add("C");
List<String> listb = new LinkedList<>();
listb.add("D");
listb.add("E");
listb.add("F");
//把b合并到a
ListIterator<String> aIter=lista.listIterator();
Iterator<String> bIter=listb.iterator();
while (bIter.hasNext()) {
if (aIter.hasNext()) {
aIter.next();
}
aIter.add(bIter.next());
}
System.out.println(lista);
//remove every second word from b
bIter=listb.iterator();
while (bIter.hasNext()) {
bIter.next();
if (bIter.hasNext()) {
bIter.next();
bIter.remove();
}
}
System.out.println(listb);
lista.removeAll(listb);
System.out.println(lista);
}
}
树集
树集(TreeSet是一个有序集合),可以以任意顺序将元素插入到集合中,在对集合进行遍历时,每个值将自动按照排序后的顺序呈现。
Map接口
如果说现在要保存一堆关联数据
Map存放数据的最终目标是为了查找数据,Collection存放数据是为了输出。
HashMap中重要的方法是put(key,value)
object get(key)
HashTable里面对于key和value的数据都不允许设置为null
HashMap允许key或者value为空
遇见了Map接口基本上就是用HashMap类
关于Iteartor输出的问题(核心)
只要是集合的输出就要用到Iterator,但是在整个Map接口中没有返回Iterator接口对象的方法,所以如果想用Iterator输出Map集合,首先针对Map集合与Collection集合保存数据的特点进行分析后才能知道。
每当使用put()方法想Map集合里面保存一堆数据的时候,实际上所有的数据都会被保存为Map.Entry接口对象。
观察Map.Entry接口定义:
public static
在Map接口里定义有一个将Map集合转化为Set集合的方法:public Set<Entry<k,v>>
Map集合利用Iterator接口输出的步骤:
- 利用Map接口的entrySet()方法将Map集合变为Set集合,里面的泛型是Entry<k,v>
- 利用Set集合中的iterator()方法将Set集合进行Iterator输出
- 每一次Iterator循环取出的都是Map.Entry接口对象,利用此对象进行key与value的输出
package listlearn;/*
*@author havel 2018/7/18 09:32
*/
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapToCollection {
public static void main(String[] args){
Map<String, Integer> map = new HashMap<>();
map.put("一", 1);
map.put("二", 2);
map.put("三", 3);
Set<Map.Entry<String,Integer>> set=map.entrySet();
Iterator<Map.Entry<String, Integer>> iterator = set.iterator();
while (iterator.hasNext()) {
Map.Entry<String,Integer> entry=iterator.next();
System.out.println(entry.getKey()+" "+entry.getValue());
}
}
}
关于Map集合中key的说明
在使用Map接口的时候可以发现,几乎可以使用任意的类型作为key或value,那么也就表示可以使用自定义的类作为key,那么作为这个key的类必须要覆写Object类的hashcode()和equals()方法。
- 在以后使用Map集合的时候,首选的key的类型是String,尽量不要使用自定义的类作为key。
Map总结
- Map保存数据的目的是为了查询使用,Collection保存数据的目的是为了输出使用
- 要知道Map使用Iterator接口输出的步骤以及具体实现代码
- HashMap可以保存null key重复会实现覆盖
- HashTable不可以保存null
Stack子类
表示的是栈操作,栈是一种先进后出的数据结构。而Stack是Vector的子类。
需要注意的是,虽然Stack是Vector的子类,可是他不会使用Vector类的方法,
- 方法
public E push(E item) 入栈
public E pop() 出栈
总结
栈的操作现在唯一还有应用的就是在Android的页面回退上。
Properties子类
国际化程序特点,同一个特点,根据不同的语言环境选择资源文件,所有的资源文件后缀必须是“*.properties”
properties类是HashTable的子类,主要是进行属性的操作(属性的最大特点是利用字符串设置key和value),首先看Properties类的定义结构
public class Properties extends Hashtable<Object,Object>
在使用Properties类的时候不需要设置泛型类型,因为从他已开始出现就只能保存String,主要使用该类的如下方法
public Object setProperty(String key,String value) //设置属性
public String getProperty(String key),如果key不存在,返回空
public String getProperty(String key,String defaultValue) 如果key不存在,返回默认值
对于属性文件而言,除了可以使用Properties类读取之外,也可以使用ResourceBoundle读取。
总结
资源文件特点
key=value
key=value
资源文件中的数据都是String。
Collections工具类
在Java提供类库的时候考虑到用户的使用方便性,所以专门提供了一个集合的工具,可以实现List、Set、和Map集合的操作。
- 为集合追加数据
package listlearn;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/*
*@author havel 2018/7/18 10:25
*/public class CollectionsDemo {
public static void main(String[] args){
List<String> list = new ArrayList<>();
Collections.addAll(list, "a", "B");
System.out.println(list);
}
}
- 面试题:请解释Collection与Collections的区别
- Collection是集合操作的接口
- Collections是集合操作的工具类,可以进行List、Set、Map集合的操作
总结
这个类一般不会使用到,但是作为知识点清楚有这么一个类就足够了。
网友评论