集合在Java中占据着举足轻重的位置,在平时的开发中,选择不同是数据结构会导致其实现风格以及性能存在很大的差异。我很喜欢Jquery的广告词:多学一点知识,就少写一行代码。有时候你费尽心机的去实现一个功能,如果选用的方法不对可能200行的代码也不见得来的比20行的代码强(有点扯远!!)。
(引用下图)
由上图可知,集合类的基本接口是:Collection接口。其中有两个最基本的方法:add方法和iterator方法。iterator()返回一个实现了Iterator接口的对象。可以使用这个对象依次访问集合中的元素。
遍历集合的常用方法:
//方式一 直接用迭代器遍历
Collection<Student> col = new LinkedList<Student>();
Iterator<Student> iter = col.iterator();
while(iter.hasNext()){
String xh = iter.next().getXh();
if("31083022".equals(xh)){
throw new Exception("不能输出30183022学生的信息!");
}
//System.out.println(xh);
}
//方式二 用for循环
for(Student stu : col){
System.out.println("学生信息:"+stu.toString());
}
大部分人习惯用ArrayList,支持动态的增长和缩减的索引序列。如果需要从数组中间位置删除一个元素或是中间位置插入一个元素,则要付出很大的代价,其原因就是数组中处于被删除元素之后的所有元素都要向数组前端或后端移动。
链表的使用就不在这里记录了,这里需要说一下java.util.Iterator接口和ListIterator接口的区别:
1) Iterator又称迭代器,在使用List或是Set的时候我们进行使用迭代器取出集合中的数据,我们不需要干涉遍历的过程,只需要对取出的数据进行处理就行。
ListIterator有add()方法,可以向List中添加对象;Iterator不可以add;
2) ListIterator有hasNext()、next()方法以及hasPrevious()、previous()方法实现顺序遍历和逆向遍历;而Iterator只支持顺序遍历。
3) ListIterator可以定位当前索引的位置,通过nextIndex()、previousIndex()方法实现;而Iterator不支持此功能。
4) 都可以删除对象remove()方法。ListIterator可以实现修改对象。set()方法可以实现,
Iterator只能遍历,不能修改。
注意:set()方法API上面写的很清楚,用新元素取代next或previous上次访问的元素。否则的话将抛出IllegalStateException。
关于Vector和ArrayList的比较这里就不记录了。区别很简单Vector类的所有方法都是同步的。但是ArrayList方法不是同步的。在不需要同步时使用ArrayList,因为Vector要在同步操作上消耗大量时间。可以写一个简单的线程类分别用ArrayList和Vector测试一下。
需要知道java.util.Collection是一个集合类的接口,它提供了对集合对象基本操作的通用接口方法;java.util.Collections是一个包装类,它包含有关集合操作的静态方法,此类不能实例化。用Collections类可以按照特定发业务语义将对象进行排序。我们常用的方法是写一个比较器实现Comparator接口。通过Collections中的以下方法实现对象的排序:
public static <T> void sort(List<T> list, Comparator<? super T> c) {
Object[] a = list.toArray();
Arrays.sort(a, (Comparator)c);
ListIterator i = list.listIterator();
for (int j=0; j<a.length; j++) {
i.next();
i.set(a[j]);
}
对于集合平时常用的就是HashSet和TreeSet,HashSet类实现了基于散列表的集,访问集合中的元素是无序的,且不能添加重复的元素。TreeSet比HashSet有所改进,它是一个有序的集合,可以以任意的顺序将元素插入到集合中,在对集合遍历的时候每个值将自动按排序后的顺寻呈现。如果不需要对数据排序就没有必要付出排序的开销。一般情况下,使用TreeSet需要对数据进行排序,如果是整数的比较直接可以返回差值:
Set set = new java.util.TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
// 结果按照降序排列
return (Integer)o2 - (Integer)o1;
}
});
Map接口下两个常用的实现类:HashMap、TreeMap。HashMap是基于哈希表的Map接口的非同步实现,此类允许使用null键和null值但不保证映射的顺序不变。HashMap是一种"链表散列"的数据结构,即数组和链表的结合体。可以简单是理解为HashMap底层就是一个数组结构,数组中每一项又是一个链表。
Map有三种常用的遍历方式:
方式一、entrySet
for(Map.Entry<String, String> entry:map.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
System.out.println("Map中的键:"+ key +"值:"+value);
}
方式二、keySet
Set<String> keys = map.keySet();
for(String k:keys){
System.out.println("Map中的键:"+ k +"值:"+ map.get(k));
}
方式三、直接遍历values
//直接遍历Map中的值
Collection values = map.values();
Iterator iter = values.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
使用HashMap需要主要在多线程环境下的并发问题,都知道HashMap是非线程安全的,也就是说在多线程的环境中get()、put()、remove()等操作都是非线程安全的,在不能保证数据一致性的情况下迭代器会抛出ConcurrentModificationException异常。
一些资料显示,当需要使用同步时用Hashtable,否则用HashMap避免不必要的同步开销。HashMap和Hashtable存在一些区别:
1、Hashtable中的方法是同步的,可以不采用任何特殊的行为就可以在一个多线程的应用程序中使用Hashtable;
2、HashMap是JDK1.2引入进来的类,而Hashtable是继承于Dictionary类;
3、还有一点是HashMap如果put(null,null)之后进行get(null)是不会抛出空指针异常;而Hashtable则会抛出空指针异常。
分享到:
相关推荐
01大数据面试复习----Java基础---集合类、多线程、JVM.zip
经典算法集合类文件,可以用于学习,复习,研究,练习等等
517.515.JAVA基础教程_集合-复习:枚举类(517).rar
里面包含了c和java的一下算法题目和答案。希望能帮助到大家
大数据面试复习---Java基础---集合类、多线程、JVM 大数据面试复习----常问问题分析 大数据面试复习----画重点----思维导图 大数据面试复习----简历编写 大数据面试复习----练习的面试题+笔试题 大数据面试复习----...
Java集合类总结 Java集合详解:一文读懂ArrayList,Vector与Stack使用方法和实现原理 Java集合详解:Queue和LinkedList Java集合详解:迭代器,快速失败机制与比较器 Java集合详解:HashMap和HashTable Java集合详解...
计算机后端-Java-Java核心基础-第24章 集合01 02. 复习:枚举类.avi
01大数据面试复习----Java基础---集合类、多线程、JVM 02大数据面试复习----画重点----常问问题分析 03大数据面试复习----画重点----精心制作热门技术思维导图 04大数据面试复习----画重点----56家+真实互联网大公司...
山东省2014届高三数学一轮复习考试试题精选(1)分类汇编1 集合
【5年高考3年模拟】2014高考数学二轮复习 2013高考分类汇编 集合的概念及运算
操作系统是位于硬件层之上、所有其他软件层之下的一个系统软件,是管理系统中各种软件和硬件资源、使其得以充分利用并方便用户使用计算机系统的程序集合。 2. 操作系统的特征 程序的并发性和资源的共享性。 3.操作...
Java类集框架 最大单值操作父接口Collection及其子接口、子类: ...集合输出: Iterator、ListIterator、foreach、废除的Enumeration Collections工具类 Comparable接口、equals()方法、hashCode()方法
蓝桥杯大赛,全称是蓝桥杯全国软件和信息技术专业人才大赛,是由中华人民共和国工业和信息化部人才交流中心主办,国信蓝桥教育科技(北京)股份有限公司承办的计算机类学科竞赛。这是一个全国高校参加的赛事,累计...
2023年5月29日 4.1 包 包是由.class文件组成的一个集合 第2页/共41页 java期末复习第讲面向对象程序设计全文共41页,当前为第2页。 2023年5月29日 4.1.1 定义包 构建包语句的语法是: package pkg1[.pkg2[.pkg3…]]...
ArrayList是一种变长的集合类,基于定长数组实现,使用默认构造方法初始化出来的容量是10(1.7之后都是延迟初始化,即第一次调用add方法添加元素的时候才将elementData容量初始化为10) ArrayList允许空值和重复元素...
150道单选复习题内附答案 1.方法定义和常量值的集合是(B) (A).单元 (B).接口 (C).成员 (D).变量 2.泛型使用中的规则和限制是(D) (A).泛类参数只能是类类型不能是简单类型 (B).同一种泛型可以对应多个版本 (C)...
9.实体之间的联系可抽象为三类,它们是 一对一(1∶1) 、 一对多(1∶m) 和 多对多(m∶n) 。 10.数据冗余可能导致的问题有 浪费存储空间及修改麻烦 和 潜在的数据不一致性 。 二、简答题: 1.什么是数据库? 答...
通信类题库--中国移动招聘考试试题汇总集合(全)附部分答案 EPI综合能力题库 六、中国移动英语复习讲义及练习题库 5-1---复习讲义:托业英语考试题型结构&解题技巧 5-2---基础巩固:词汇&短语&金融英语总结 5-3---...
Java程序语言教程 第05章 类与对象(共17页).pdf Java程序语言教程 第05章 类与对象v2.1(共16页).pdf Java程序语言教程 第07章 继承(共13页).pdf Java程序语言教程 第08章 抽象类与接口(共11页).pdf Java程序...
名词解释 泛型 答即参数化类型允许程序创建集合时指定集合元素的类型在定义方法类接口时使用类型形参类型形参将在声明变量调用方法创建对象时动态地指定.如:List,ArrayList 2. 多态 答Java引用变量分为编译时的类型...