1、Collection 和 Collections的区别。
Collection是集合类的上级接口,继承与他的接口主要有Set和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
2、Collection框架。
集合框架(Collection Framework)泛指java.util包的若干个类和接口,如Collection,List,ArrayList,LinkedList,Vector(自动增长数组),HashSet,HashMap等.
集合框架中的类主要封装的是典型的数据结构,如动态数组,链表,堆栈,集合,哈希表等.
集合框架类似编程中经常用到的工具类,使得编码只需要专注于业务层的实现,不需要从底层实现相关细节,如:“数据结构的封装”和“典型算法的实现”。
3、Collection框架中实现比较要实现什么接口。
Comparable/comparator
4、List, Set, Map是否继承自Collection接口。
List,Set是,Map不是
5、List、Map、Set三个接口,存取元素时,各有什么特点。
List以特定次序来持有元素,可有重复元素。
Set有自己的内部排序,无法拥有重复元素。
Map保存key-value键值对。
6、List和Map的区别。
List是存储单列数据的集合,Map是存储键值对双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键是不能重复的,但值是可以重复的。
7、说出ArrayList,Vector,LinkedList的存储性能和特性。
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
LinkedList是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。
8、HashMap和Hashtable的区别。
HashMap和Hashtable都实现了Map接口,主要区别在于HashMap的方法不是同步的,Hashtable是同步的,所以在多线程场合要手动同步HashMap,这个区别就像ArrayList和Vector一样。HashMap允许null值(key和value都可以,只容许有一个null值的key,可以有多个null值的value),Hashtable不允许null值(key和value都不可以)。Hashtable有一个contains(Object value),功能和containsValue(Object value)功能一样
总之有三条:
(1)历史原因:Hashtable继承自陈旧的Dictionary类,而HashMap是Java1.2引进的Map接口的一个实现。
(2)同步性: Hashtable是线程安全的,是同步的,而HashMap是线程不安全的,不是同步的,在多个线程访问Hashtable时,不需要为它的方法实现同步,而HashMap 就必须为之提供外同步(Map m = Collections.synchronizedMap(new HashMap()))。
(3)值:只有HashMap可以将空值作为一个表的条目的key或value。
9、 ArrayList和Vector的区别。
这两个类都实现了List接口,List接口继承了Collection接口,他们都是有序集合.即存储在这两个集合中元素的位置都是有顺序的,可以按位置索引号来取出某个元素,并且其中的数据是允许重复的.这是与HashSet之类集合的最大不同处,HashSet之类的集合不能按索引号去检索其中的元素.也不允许有重复的元素.(本题目本与hashset没有任何关系,但为了说清楚ArrayList和Vector的功能,我们使用对比方式,有利于说明问题)
接着说ArrayList与Vector的区别,主要包括两个方面:
(1)同步性
Vector是线程安全的,也就是说它的方法之间线程同步.而ArrayList是线程不安全的,它的方法之间的线程数不同步,如果只有一个线程会访问到集合,那么最好用ArrayList,因为它不考虑线程安全,效率会高些.如果有多个线程会访问到集合,那么就使用Vector,因为不需要我们自己去考虑和编写线程安全代码.
备注:对于Vector和ArrayList,Hashtable和HashMap,线程安全是前2个,记住Vector和Hashtable是旧的,是java一诞生就提供了的,他们是线程安全的.而Arratlist和HashMap是java2才提供的,他们是线程不安全的.
(2)数据增长
ArrayList和Vector都有一个初始的容量大小,但存储在他们里面的元素个数超过了容量时,就需要增加ArrayList和Vector的存储空间,每次要增加时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间里和程序效率之间要取得一定的平衡.Vector增长为原来的一倍,ArrayList增加原来的0.5倍.
10、去掉一个Vector集合中重复的元素
Vector newVector = new Vector();
for (int i=0; i<vector.size(); i++){
Object obj = vector.get(i);
if(!newVector.contains(obj){
newVector.add(obj);
}
}
还有一种简单的方式,HashSet set = new HashSet(vector);
11.TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是父类的compareTo方法,还是使用的子类的compareTo方法,还是抛异常!
(应该是没有针对问题的确切答案,当前的add方法放入的是哪个对象,就调用哪个对象的compareTo方法,至于这个compareTo方法怎么做,就看当前这个对象的类中是如何编写这个方法的)
实验代码:
public class Parent implements Comparable {
private int age = 0;
public Parent(int age) {
this.age = age;
}
public int compareTo(Object o) {
System.out.println("method of parent");
Parent o1 = (Parent) o;
return age > o1.age ? 1 : age < o1.age ? -1 : 0;
}
}
public class Child extends Parent {
public Child() {
super(2);
}
public int compareTo(Object o) {
System.out.println("method of child");
return 1;
}
}
public class TreeSetTest {
public static void main(String[] args) {
TreeSet set = new TreeSet();
set.add(new Child());
set.add(new Parent(3));
set.add(new Parent(4));
}
}
12、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
Set里的元素是不能重复的,元素重复与否是使用equals()方法进行判断的。
equals方法(是String类从它的超类Object中继承的)被用来检测两个对象的内容是否相等。== 用于比较引用和比较基本数据类型时具有不同的功能:比较基本数据类型,如果两个值相同,则结果为true;而在比较引用时,如果引用指向内存中的同一对象,结果为true。
13、你所知道的集合类都有哪些?主要方法?
最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList、LinkedList 和 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素列表。 List 适用于按数值索引访问元素的情形。
Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值。
Collection
ArrayList/LinkedList/Vector List
HashSet/TreeSet Set
HashMap/HashTable/TreeMap Map
对于set,大概的方法是add,remove, contains;对于map,大概的方法就是put,remove,contains等,我记住的一些思想就是List类会有get(int index)这样的方法,因为它可以按顺序取元素,而set类中没有get(int index)这样的方法。List和set都可以迭代出所有元素,迭代时先要得到一个iterator对象,所以,set和list类都有一个iterator方法,用于返回那个iterator对象。map可以返回三个集合,一个是返回所有的key的集合,另外一个返回的是所有value的集合,再一个返回的key和value组合成的EntrySet对象的集合,map也有get方法,参数是key,返回值是key对应的value。