JavaSE集合相关题

JavaSE集合相关题
1、List、Set、Map 是否继承自Collection接口?
答:List,Set是,Map不是。
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java JDK不能提供直接继承自Collection的类,Java JDK提供的类都是继承自Collection的"子接口",如:List和Set。
Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当做一组key集合,一组value集合,或者一组key-value映射。
2、列出常见的集合类,简单写出区别,并写出一段将一个字符串插入该集合的代码
一、Set集合。其主要实现类有HashSet、TreeSet。存放对象的引用,不允许有重复对象。 代码: Set set=new HashSet(); //添加数据 set.add(“abc”);
二、List集合,其主要实现类有LinkedList、ArrayList,前者实现了链表结构,后者可代表大小可变的数组。List的特点是能够以线性方式储蓄对象,并允许存放重复对象。List能够利用Collections类的静态方法sort排序。sort(List list)自然排序;sort(List listm,Comparator codddmparator)客户化排序。
代码:List:线性集合接口,有序;ArrayList:动态数组[可变长度的动态数组];LinkedList:链表结构的集合List list=new ArrayList(); //添加数据 list.add(“abc”);
三、Map集合,其主要实现类有HashMap、TreeMap。Map对值没有唯一性要求,对健要求唯一,如果加入已有的健,原有的值对象将被覆盖。HashMap类按照哈希算法来存取键对象,可以重载equals()、hashCode()方法来比较键,但是两者必须一致。TreeMap,可自然排序,也可通过传递Comparator的实现类构造TreeMap。
代码:Map:键值对存储结构的集合,无序
//实例化一个集合对象
Map map=new HashMap();
//添加数据
map.put(“P01”, “zhangSan”);
3、以下关于集合的说法错误的是(D)。
A、ArrayList采用了和数组相同的存储方式,在内存中分配连续的空间
B、LinkedList的优点在于插入、删除元素时效率比较高
C、ArrayList的优点在于遍历元素和随机访问元素的效率比较高
D、ArrayList和LinkedList都不允许存储重复数据
4、集合有哪四种主要的接口,分别什么作用?
1、Collection:代表一组对象,每一个对象都是它的子元素。
2、Set:不包含重复元素的Collection。
3、List:有顺序的collection,并且可以包含重复元素。
4、Map:可以把键(key)映射到值(value)的对象,键不能重复。

5、说出ArrayList、Vector、LinkedList的存储性能和特性。
ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦
LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始
ArrayList和Vector都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加和插入操作,他们都允许直接用序号索引元素,但是插入数据元素涉及到元素移动等内存操作,所以索引数据快而插入数据慢.
Vector使用了sychronized方法(线程安全),所以在性能上比ArrayList要差些.
LinkedList使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以索引数据慢,是插入数据时只需要记录前后项即可,所以插入的速度快.
6、一组从小到大的数据存在ArrayList中,写个函数通过折半查找迅速找到对应的索引值。
package Algorithm_analysis;
public class Bisearch {
static int[] array={-3,-2,0,4,5,7,12,64};
public static void main(String args[]){
int left=0;
int right=array.length;
int center=0;
int k=7;
while(left<=right){
center=(right+left)/2;
if ((array[center]-k)==0){
System.out.print(center);
break;
} else{
if((array[center]-k)>0){
right=center;
}
else{
left=center;
}
}
}
}
}
7、实现单向链表的反转,如:a->b->c->d,反转后变为 d->c->b->a
public Node reverse(Node current){if (current == null || current.next == null) return current;
Node nextNode = current.next;
current.next = null;
Node reverseRest = reverse(nextNode);
nextNode.next = current;
}
8、请说一下你熟悉的集合,并说一下它们是如何取值的。
ArrayList是一个数组实现的列表,由于数据是存入数组中的。
List exampleList=new ArrayList();
第一种:List集合遍历的最基础的方式:for循环,指定下标长度,根据List集合的size()长度,for循环遍历;
//i的操作,小于或者小于等于集合的长度,根据自己的需求,可以
for(int i=0;i<exampleList.size();i++){
Example example = exampleList.get(i);//获取每一个Example对象
String name = example.getName();
System.out.print(“第”+i+“个=?”+name);
}
第二种:非常简单的写法:直接根据List集合的长度自动遍历,但是不能操作第几个;
for(Example example : exampleList){
String name = example.getName();//直接操作Example对象
System.out.print((“Name:”+name);
}
第三种:利用迭代器Iterator遍历:也是直接根据List集合的自动遍历,知道遍历完整个List;
for(Iterator iterators = exampleList.iterator();iterators.hasNext()?{
Example example = (Example) iterators.next();//获取当前遍历的元素,指定为Example对象
String name = example.getName();
System.out.print(“Name:”+name);
}
9、欲构造ArrayList类的一个实例,此类继承List接口,下列哪个方法时正确的?(B)
A、ArrayList list =new Object();
B、List list =new ArrayList();
C、ArrayList list =new List();
D、List list =new List();
10、下列关于ArrayList、Vector和LinkedList集合的说法正确是有( ACD )

(A) ArrayList集合底层是数组实现,该集合线程不安全
(B) Vector集合元素的存放是无序的
© LinkedList集合底层是链表结构,适合做元素的增删操作
(D) 这三个集合都是List接口的实现类
11、下面程序的输出结果是什么( D )
Set set= new HashSet();
set.add(“aaa”);
set.add(“bbb”);
set.add(“aaa”);
System.out.println(set.size());

(A) 编译不通过 (B) 运行时出错
© 输出3 (D)输出2

12、下列哪些方法是ArrayList和LinkedList集合中都定义的( ACD )

(A) add(Object o)
(B) removeFirst()
© remove(Object o)
(D) add(int index,Object o)

13、下列哪些集合属于Collection体系的子类( BD )

(A) TreeMap
(B) ArrayList
© Hashtable
(D) HashSet

14、欲构造ArrayList类的一个实例,此类继承了List接口,下列哪个方法是正确的 ? ( B )

(A) ArrayList myList=new Object();
(B) List myList=new ArrayList();
© ArrayList myList=new List();
(D) List myList=new List();

15、Java的集合框架中重要的接口java.util.Collection定义了许多方法。选项中哪个方法不是Collection接口所定义的?( C )

(A) int size()
(B) boolean containsAll(Collection c)
© compareTo(Object obj)
(D) boolean remove(Object obj)

16、下面的集合中,( AC )不可以存储重复元素。

(A) Set (B) Collection
© Map (D) List

08.关于Map和List,下面说法正确的是( D )

(A) Map继承List
(B) 0List中可以保存Map或List
© Map和List只能保存从数据库中取出的数据
(D) 0Map的value可以是List或Map

17、在JAVA中,以下( C )类的对象以键-值的方式存储对象

(A) java.util.List
(B) java.util.ArrayList
© java.util.HashMap
(D) java.util.LinkedList

18、给定如下Java 程序代码片段,编译运行这段代码,结果是( B )

java.util.HashMap map = new java.util.HashMap();
map.put("name",null);
map.put("name","Jack");
System.out.println(map.get("name"));

(A) null
(B) Jack
© nullJack
(D) 运行时出现异常

19、分析如下Java代码,编译运行后将输出( B )
public class Test{
public Test(){}
static void print(ArrayList al){
al.add(2);
al=new ArrayList();
al.add(3);
al.add(4);
}
public static void main(String[]args){
Test test=new Test();
ArrayList al=new ArrayList();
al.add(1);
print(al);
System.out.println(al.get(1));
}
}

(A) 1 (B) 2 © 3 (D) 4

20、在JAVA中,LinkedList类和ArrayList类同属于集合框架类,下列( D )选项中的方法是LinkedList类有而ArrayList类没有的。

(A) add(Object o)
(B) add(int index,Object o)
© remove(Object o)
(D) removeLast()

21、在java中,__B____类可用于创建链表数据结构的对象:
A:ArrayList 基于数组的存储方式
B::LinkedList 基于链表的存储方式
C::Collection 集合的顶级接口
D:HashMap MAP集合的实现类

22、写出List遍历的几种方法。
List list = new ArrayList();
list.add(“aaa”);
list.add(“bbb”);
list.add(“ccc”);
方法一:
超级for循环遍历
for(String attribute : list) {
System.out.println(attribute);
}
方法二:
对于ArrayList来说速度比较快, 用for循环, 以size为条件遍历:
for(int i = 0 ; i < list.size() ; i++) {
system.out.println(list.get(i));
}
方法三:
集合类的通用遍历方式, 用迭代器迭代
Iterator it = list.iterator();
while(it.hasNext()) {
System.ou.println(it.next);
}
23、用java实现双向链表结构及实现插入数据结点的方法。
//添加到链表表头
public boolean addFirst(Object o)
{
addAfter(new Node(o), head);
return true;
}
//将元素添加到链表表尾
public boolean addLast(Object o)
{
addBefore(new Node(o), head);
return true;
}
//在某元素之前添加元素
private void addBefore(Node newNode, Node node)
{
newNode.prev = node.prev;
newNode.next = node;
newNode.next.prev = newNode;
newNode.prev.next = newNode;
size++;
}
//在某元素之后添加元素
private void addAfter(Node newNode, Node node)
{
newNode.prev = node;
newNode.next = node.next;
newNode.next.prev = newNode;
newNode.prev.next = newNode;
size++;
}

24、说明Map、HashMap、LinkMap、TreeMap的关系和区别。
HashMap,LinkedHashMap,TreeMap都属于Map
Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。
LinkedHashMap LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序
TreeMap 不仅可以保持顺序,而且可以用于排序
25、在Java中,以下关于HashMap类的描述,错误的是( B )。
A. HashMap使用键/值得形式保存数据 B. HashMap 能够保证其中元素的顺序
C. HashMap允许将null用作键 D. HashMap允许将null用作值
26、如果频繁做插入操作使用下列哪种对象效率更高( D )
A、ArrayList
B、HashMap
C、Vector
D、LinkedList
27、HashMap与HashTable有什么区别?什么时候使用Hashtable,什么时候使用 HashMap?
1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。
2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。
3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。
4.HashTable使用Enumeration,HashMap使用Iterator。

以上只是表面的不同,它们的实现也有很大的不同。
5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);

28、Collections和Collection的区别。
Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection是个java.util下的接口,它是各种集合结构的父接口。


版权声明:本文为m0_46096880原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。