JAVA 集合类2-MAP接口与迭代器

时间:2022-04-15 17:02:15

一.泛型(Generic)

由于放入集合中的元素默认都是Object类型,无法看出其本身自有的类型,当对这些元素进行操作时需要转型才可用,这样效率低还易出错,在JDK1.5版本后引入泛型,规定了此集合中的元素类型,增强了程序的可读性和稳定性。

格式:用<>表示,定义的类型必须是引用类型。后面的<>可以省略。

List<Book> list1 = new ArrayList<Book>();

 二.Map接口的常用方法

Map接口提供了将键映射到值的对象。一个映射不能包含重复的键,每个键最多只能映射到一个值,Map中的元素是通过键(key)值(value)对的形式进行存储的。

Map接口也有两个子类实现类HashMap(哈希表做索引)和TreeMap(二叉树做索引)。

HashMap常用方法:

public class Test{ public static void main(String[] args) { Map<Object,Object> map1 = new HashMap<Object,Object>();   //创建HashMap类集合;
        map1.put(Object key, Object value);  //向集合中添加指定的key与value的映射关系;其返回值是是替换出来的value;
        map1.get(Object key);  //获取指定键所对应的值; 
        map1.remove(Object key);  //删除指定键所对应的值;返回值为该值;
        map1.remove(Object key,Object value);  //删除指定键及其所对应的值;如删除成功返回true,否则返回false;
        map1.containsKey(Object key);  //判断是否包含某个键,有返回true,没有返回false;
        map1.containsValue(Object value);  //判断是否包含某个值,有返回true,没有返回false;
        map1.size();  //获取该集合中有几对映射;
        map1.isEmpty();  //判断该集合中是否有元素;
        map1.putAll(Map m);  //将另一个集合中的元素放入该集合;
        map1.clear();  //清除该集合中所有元素;
        map1.keySet();  //获取该集合中所有键组成的Set集合;
        map1.values();  //获取该集合中所有值对象组成的Collection集合; //获取map集合中的键值对也可通过遍历方法得到,由于Set类集合没有顺序,需要调用list中的构造方法
        Set<Object> set1 = map1.keySet(); List<Object> list1 = new ArrayList(set1); for (int i = 0; i < list1.size(); i++) { Object o1 = list1.get(i); Object o2 = map1.get(o1); } } }

 三.迭代器

为了能够遍历所有集合类型中的元素,优先使用Iterator接口创建迭代器,Iterator接口是所有集合的父类。

Iterator接口中只有3个方法:

1.hasNext():如果仍有元素可以迭代,返回true;

2.next():返回迭代的下一个元素;

3.remove():从迭代器指向的collection中移除迭代器返回的最后一个元素;

注意:迭代器中的remove方法, 绝对不可以与list中的remove(Object)方法混用,会抛出ConcurrentModificationException这个异常。

举例说明:

 
 
public class Test{ public static void main(String[] args) { List<String> list = new ArrayList(); list.add("qqqq"); list.add("wwww"); list.add("eeee"); Iterator<String> iter = list.iterator();  //创建list的迭代器 while(iter.hasNext()) {  //判断是否有元素可以迭代,如果有,返回false,进入循环。 String s = iter.next();  //返回迭代的下一个元素; if (s.equals("wwww")) {  //将“wwww”从集合中删除; iter.remove(); } } System.out.println(list); } }

输出结果为:

qqqq
wwww
eeee
[qqqq, eeee]

还有一种常用的迭代器ListIterator,是Iterator接口的子接口,除拥有父类接口的方法外,还有自己的一些方法。

例:

public static void main(String[] args) { List<String> list = new ArrayList(); ListIterator<String> ls = list.listIterator();    //创建listIterator迭代器
        ls.add(String e);    //将指定元素插入列表;
        ls.hasPrevious();    //逆向遍历列表;previous:前一个
        ls.set(String e);    //用指定元素替换返回的最后一个元素;
        ls.nextIndex();    //返回对 next 的后续调用所返回元素的索引;
        ls.previousIndex();    //返回对 previous 的后续调用所返回元素的索引;
    }

四.Collections工具类常用方法

例:

public class Test{ public static void main(String[] args) { List<Integer> list1 = new ArrayList<Integer>(); List<Integer> list2 = new ArrayList<Integer>(); Collections.sort(list1);//默认从小到大排序;
        Collections.shuffle(list1);//随机排序;
        Collections.reverse(list1);//从大到小排序;
        Collections.copy(list1, list2);//将list2中的元素复制到list1中,前提是list1中的元素个数不得大于list2中的元素个数;
        Collections.fill(list1, Integer);//将list1中的所有元素填充为同一类型的相同元素;
        Collections.sort(list1);//对list1中的所有元素进行排序;
        Collections.binarySearch(list1, key);//二分查找法,查找list1中的key元素位置,需要先对元素进行排序;
    
Collections.addAll(list1, 1,3,5,7,9);     //向指定集合中插入任意长度同类元素; } }

 五.Comparable接口

如果需要对自定义的类进行排序, 那就必须要让其实现Comparable接口, 实现比较两个类大小的方法。需要重写compareTo方法。

compareTo(T,o):T是此对象,o是指定对象;比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。

举例说明对书类进行价格排序,需要在书类重写compare To方法。

@Override public int compareTo(Book o) { if (this.price > o.getPrice()) { return 1; } if (this.price == o.getPrice()) { return 0; } return -1; }

重写此方法后,便可以使用Collections方法进行排序。