一.泛型(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方法进行排序。