Java集合类相关面试题

1.Collection和Collections的区别

(1)java.util.Collection是一个集合接口,Collection接口在Java类库中有非常多详细的实现。如:List,Set

(2)java.util.Collections是针对集合类的一个帮助类,它提供了一系列的静态方法实现对各种集合的搜索,排序,线程安全化等操作。

2.ArrayList与Vector的差别

这两个类都实现了List接口(List接口继承自Collection接口);它们都是有序集合;它们内部的元素都是能够反复的,都能够依据序号取出当中的某一个元素。区别:

(1)线程安全:Vector是早期Java就有的,是同意多线程操作的,是线程安全的;ArrayList是Java2中才出现,它是线程不安全的,仅仅使用单线程操作。因为Vector支持多线程操作,所有在性能上比不上ArrayList。类似的HashTable相比于HashMap也是支持多线程的操作,导致性能不如HashMap。

(2)数据增长:ArrayList和Vector都有一个初始的容量大小,当存储进去的元素个数超出容量的时候。就需要添加ArrayList和Vector的存储空间,每次添加存储空间的时候不是仅仅添加一个存储单元,而是添加多个存储单元。Vector默认添加原来的一倍,ArrayList默认添加原来的0.5倍。Vector能够由我们自己来设置增长的大小(java.util.Vector.setSize()   ),ArrayList没有提供相关的方法。

3.LinkedList与ArrayList的区别

两者都是List接口,LinkedList和ArrayList都是线程不安全。区别:

(1)ArrayList是基于动态数组实现的,LinkedList是基于链表的数据结构。

(2)get访问List内部随意元素时,ArrayList的性能要比LinkedList性能好;LinkedList中的get方法是要依照顺序从列表的一端开始检查,直到结束。

(3)对于新增和删除操作LinkedList要强于ArrayList,因为ArrayList要移动数据。

4.HashMap和HashTable的区别

两者都实现了Map接口。主要差别在于:

(1)HashTable是早期Java就有的,支持多线程操作,是线程安全的;HashMap是Java2才出现的,仅支持单线程操作,线程不安全。

(2)HashMap中key,value可以为空;HashTable的key,value不能为空。

5.List与Map的差别

List是存储单列数据的集合,Map是存储key和value这样双列数据的集合,List中存储的数据是由顺序的,而且可以重复。

Map存储的数据是没有顺序的,它存储的key不能重复,value可以重复。

List继承Collection接口,Map不是,Map没有父类。

6.List,Map,Set三个接口,存储元素时各有什么特点

List和Set都是单列元素的集合,它们有一个共同的父接口Collection.

(1)List元素存储有序,内部元素可重复;Set存储元素无序,元素不可重复。Set的add方法有一个boolean返回值,每当add一个新元素的时候都会调用equals方法进行逐一比较,当新元素与全部的已存在元素都不一样时add成功并返回true,否则返回false。

(2)Map与List和Set不同,它是双列存储的(键和值一一对应)。它在存储元素调用的是put方法,每次存储时,要存储一份key和value,且key不能重复。

7.TreeSet

Tree在存储对象时须要排序,须要指定排序算法。Integer和String能够自动排序。

8.练习

(1)去掉Vector中的重复元素:

import java.util.HashSet;
import java.util.Iterator;
import java.util.Vector;
public class VectorDemo {
	public static void main(String[] args) {
		Vector veList=new Vector();
		veList.add("aa");
		veList.add("bb");
		veList.add("aa");
		veList.add("bb");
		veList.add("cc");
		
		//去掉Vector中的反复元素方法一:
		veList=getNewVector(veList);
		//迭代结果
		System.out.println("*************************第一种方式************************");
		for(int i=0;i<veList.size();i++){
			System.out.println(veList.get(i));
		}
		
		//去掉Vector中的反复元素方法二:
		Vector veList1=getNewVector1(veList);
		System.out.println("*************************另外一种方式************************");
		for(int i=0;i<veList1.size();i++){
			System.out.println(veList1.get(i));
		}		
	}

	private static Vector getNewVector(Vector veList) {
		Vector newVector=new Vector();
		for(int i=0;i<veList.size();i++){
			String str=(String) veList.get(i);
			if(!newVector.contains(str)){
				newVector.add(str);
			}
		}
		return newVector;
	}
	
	private static Vector getNewVector1(Vector veList) {
		Vector newVector=new Vector();
		HashSet set=new HashSet(veList);
		Iterator it =set.iterator();
		while (it.hasNext()) {
			String str=(String) it.next();
			newVector.add(str);
		}
		return newVector;
	}
}

TreeSet的练习:

import java.util.*;
public class TreeSetDemo1 {
    public static void main(String[] args) {
        Set ts = new TreeSet();
        ts.add(new Integer(5));
        ts.add(new Integer(10));
        ts.add(new Integer(1));
        ts.add(new Integer(6));
        ts.add(new Integer(2));
        Iterator it = ts.iterator();
        /**
         * 结果打印的顺序是1 2 5 6 10是依照规律的顺序排列的,这是由于Integer类实现了Comparable接口
         * 重写了它的compareTo()方法
         */
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}
注:Integer类中compareTo()方法的实现方式:
    public int compareTo(Integer anotherInteger) {
        return compare(this.value, anotherInteger.value);
    }

    public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ?0 : 1);
    }
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetDemo2 {

	public static void main(String[] args) {
		Set ts=new TreeSet();
		ts.add(new Teacher("zhangsan",1));
		ts.add(new Teacher("lisi",2));
		ts.add(new Teacher("wangwu",3));
		Iterator it=ts.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}

	}

}

class Teacher implements Comparable{
	int num;
	String name;
	Teacher(String name,int num){
		this.num=num;
		this.name=name;
	}
	public String toString() {
		return "工号:"+num+"\t\t姓名:"+name;
	}
	@Override
	public int compareTo(Object o) {
		Teacher ss=(Teacher)o;
		int result=num<ss.num?1:(num==ss.num?0:-1);
		if(result==0) {
			result=name.compareTo(ss.name);
		}
		return result;
	}
}

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值