目录大纲:
一.集合整理及集合之间的区别和底层
二.常见的笔试面试题
集合框架内容:
Connection
-----List(元素可重复.有序的对象)
@1-----Vector:底层是数组数据结构@2-----ArrayList:底层是数组数据结构@3-----LinkedList:链表式数据结构
-----Set(元素唯一,无序的对象)
@1-----HashSet:底层数据结构是哈希表;底层就是hashMap来实现存取
集体的实现方式:http://blog.csdn.net/tang06211015/article/details/50728298
HashSet是怎么保证元素的唯一性了?
答: :是通过元素的两个方法,hashCode和equals来完成,如果元素的HashCode值相同,则会调用判断equals方法是否为 true,hashcode值不相同,则不会调用equals方法。判断和删除的依据:依赖于方法元素的hashCode和equals来完成
@2----TreeSet:可以对Set集合元素进行排序(自然排序):底层的数据结构式二叉树,保证数据唯一性的依据是:通过Compareto方法。
TreeSet排序的第一种方式:让元素自身具备比较性。
元素需要实现Comparable接口,覆盖compareTo方法。也种方式也成为元素的自然顺序,或者叫做默认顺序。(必须String就是自然排序)
public int compareTo(Object obj) { if(!(obj instanceof Student)) throw new RuntimeException("不是学生对象"); Student s = (Student)obj; //System.out.println(this.name+"....compareto....."+s.name); if(this.age>s.age) return 1; if(this.age==s.age) { //reutrn 0:相当于相等 return this.name.compareTo(s.name); } return -1; }
TreeSet的第二种排序方式(比较器)。
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。
在集合初始化时,就有了比较方式。(必须String排序不符合自己的业务需求)
TreetSet set=new TreetSet(new MyCompare)
class MyCompare implementsComparator { public intcompare(Object o1,Object o2) { Student s1 = (Student)o1; Student s2 = (Student)o2; int num = s1.getName().compareTo(s2.getName()); if(num==0) { return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge())); /* if(s1.getAge()>s2.getAge()) return 1; if(s1.getAge()==s2.getAge()) return 0; return -1; */ } return num; } }当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖compare方法。
--- Map(提供Key(不允许重复)到Value(允许重复)的映射)@1-----HashMap 底层数据结果就是数组链表结构 参考: http://blog.csdn.net/tang06211015/article/details/50685635@2-----TreeMap 底层的数据结构式是通过红黑树算法来实现 可以参考: http://cmsblogs.com/?p=1013上述:业务情况而定,HashMap通过hashcode对其内容进行快速查找,而TreeMap中所有的元素都保持着某种固定的顺序,
@3------HashTable:底层是哈希表;继承Dictionary类,线程安全,不允许为null
一. Collection 与CollectionS的区别:
1. Connections是java.util的类,它包含有关集合操作的静态方法。2. Collection是java.util下的接口,它包含各种集合框架的父接口二. ArrayList与LinkedList的区别:1. 都是实现List接口。2. 数据结构不一样:1. Arraylist是线性存储结构。(多用于查询)2. LinkedList是链表式存储结构(多用于增删操作)。三. Vethor和Arraylist的区别:1. 两者实现原理相同,功能相同。2. Vethor是线程安全,Arraylist是线程非安全,重效率。3. 数据增长:Vethor默认增长为原来一倍,Arraylist只增长50%;
四.Set和List的区别:
1.Set存储唯一,无序的对象。List存储不唯一,有序的元素对象。
2. HashSet对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法,Arraylist 只是equals().
六.HashTable 和 HashMap的异同:
1. HashTable继承Dictionary类,HashMap实现Map接口。
2. HashTable是线程安全,HashMap是线程非安全。
3. HashTable不允许null值,HashMap允许null值。
七.Arrays与Arraylist的区别:
1. Arrays类专门操作数组,提供一系列静态方法实现数组搜索,排序,比较和填充。
2.Arraylist是实现List接口的集合类。
八.迭代器iterator。
1.HasNext()--判断是否存在另一个访问元素。
2.Next()---返回下一个元素。
没有Add方法,所以JDK1.6出现了 LikeIterator(它的子类迭代器):迭代方式:@1使用iterator方法遍历: 如: Set<Entry<Integer,String>> fSet=fimary.entrySet(); Iterator<Entry<Integer,String>> it=fSet.iterator(); while(it.hasNext()){ Entry<Integer,String> entry=it.next(); System.out.println(entry.getValue()) } @2.通过Getkey()方法读取。 如: Iterator<String> it= fimary.getKey().iterator(); While(it.hashNext){ String id=it.next(); String name=frimary.get(id); System.out.println(id+”:”+name); } ③.迭代Map<String,String> xxmap: Set<Map.Entry<String,String>> entry=xxmap.entrySet(); Iterator<Map.Entry<String,String>> it=entry.iterator(); whiel( it.hasNext){ Map.Entry<String,String> me=it.next(); String key=me.getKey(); String value=me.getValue(); }
面试整理:
1、 什么是Java集合API
Java集合框架API是用来表示和操作集合的统一框架,它包含接口、实现类、以及帮助程序员完成一些编程的算法。简言之,API在上层完成以下几件事:
● 编程更加省力,提高城程序速度和代码质量
● 非关联的API提高互操作性
● 节省学习使用新API成本
● 节省设计新API的时间
● 鼓励、促进软件重用
具体来说,有6个集合接口,最基本的是Collection接口,由三个接口Set、List、SortedSet继承,另外两个接口是Map、SortedMap,这两个接口不继承Collection,表示映射而不是真正的集合。
2、 什么是Iterator
一 些集合类提供了内容遍历的功能,通过java.util.Iterator接口。这些接口允许遍历对象的集合。依次操作每个元素对象。当使用 Iterators时,在获得Iterator的时候包含一个集合快照。通常在遍历一个Iterator的时候不建议修改集合本省。
3、 Iterator与ListIterator有什么区别?
Iterator:只能正向遍历集合,适用于获取移除元素。ListIerator:继承Iterator,可以双向列表的遍历,同样支持元素的修改。
4、 什么是HaspMap和Map?
Map是接口,Java 集合框架中一部分,用于存储键值对,HashMap是用哈希算法实现Map的类。
5、 HashMap与HashTable有什么区别?对比Hashtable VS HashMap
两者都是用key-value方式获取数据。Hashtable是原始集合类之一(也称作遗留类)。HashMap作为新集合框架的一部分在Java2的1.2版本中加入。它们之间有一下区别:
● HashMap和Hashtable大致是等同的,除了非同步和空值(HashMap允许null值作为key和value,而Hashtable不可以)。
● HashMap没法保证映射的顺序一直不变,但是作为HashMap的子类LinkedHashMap,如果想要预知的顺序迭代(默认按照插入顺序),你可以很轻易的置换为HashMap,如果使用Hashtable就没那么容易了。
● HashMap不是同步的,而Hashtable是同步的。
● 迭代HashMap采用快速失败机制,而Hashtable不是,所以这是设计的考虑点。
6、 在Hashtable上下文中同步是什么意思?
同步意味着在一个时间点只能有一个线程可以修改哈希表,任何线程在执行hashtable的更新操作前需要获取对象锁,其他线程等待锁的释放。
7、 什么叫做快速失败特性
从 高级别层次来说快速失败是一个系统或软件对于其故障做出的响应。一个快速失败系统设计用来即时报告可能会导致失败的任何故障情况,它通常用来停止正常的操 作而不是尝试继续做可能有缺陷的工作。当有问题发生时,快速失败系统即时可见地发错错误告警。在Java中,快速失败与iterators有关。如果一个 iterator在集合对象上创建了,其它线程欲“结构化”的修改该集合对象,并发修改异常 (ConcurrentModificationException) 抛出。
8、 怎样使Hashmap同步?
HashMap可以通过Map m = Collections.synchronizedMap(hashMap)来达到同步的效果。
9、 什么时候使用Hashtable,什么时候使用HashMap
基本的不同点是Hashtable同步HashMap不是的,所以无论什么时候有多个线程访问相同实例的可能时,就应该使用Hashtable,反之使用HashMap。非线程安全的数据结构能带来更好的性能。
如 果在将来有一种可能—你需要按顺序获得键值对的方案时,HashMap是一个很好的选择,因为有HashMap的一个子类 LinkedHashMap。所以如果你想可预测的按顺序迭代(默认按插入的顺序),你可以很方便用LinkedHashMap替换HashMap。反观 要是使用的Hashtable就没那么简单了。同时如果有多个线程访问HashMap,Collections.synchronizedMap()可以 代替,总的来说HashMap更灵活。
10、为什么Vector类认为是废弃的或者是非官方地不推荐使用?或者说为什么我们应该一直使用ArrayList而不是Vector
你 应该使用ArrayList而不是Vector是因为默认情况下你是非同步访问的,Vector同步了每个方法,你几乎从不要那样做,通常有想要同步的是 整个操作序列。同步单个的操作也不安全(如果你迭代一个Vector,你还是要加锁,以避免其它线程在同一时刻改变集合).而且效率更慢。当然同样有锁的 开销即使你不需要,这是个很糟糕的方法在默认情况下同步访问。你可以一直使用Collections.sychronizedList来装饰一个集合。
事 实上Vector结合了“可变数组”的集合和同步每个操作的实现。这是另外一个设计上的缺陷。Vector还有些遗留的方法在枚举和元素获取的方法,这些 方法不同于List接口,如果这些方法在代码中程序员更趋向于想用它。尽管枚举速度更快,但是他们不能检查如果集合在迭代的时候修改了,这样将导致问题。 尽管以上诸多原因,oracle也从没宣称过要废弃Vector