Java集合类相关面试题
1、Collection和Collections的差别
java.util.Collection 是一个集合接口,Collection接口在Java类库中有非常多详细的实现。比如List、Set
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能够由我们自己来设置增长的大小,ArrayList没有提供相关的方法。
3、LinkedList与ArrayList有什么差别
两者都实现的是List接口。不同之处在于:
(1)、ArrayList是基于动态数组实现的,LinkedList是基于链表的数据结构。
(2)、get訪问List内部随意元素时。ArrayList的性能要比LinkedList性能好。LinkedList中的get方法是要依照顺序从列表的一端開始检查,直到还有一端
(3)、对于新增和删除操作LinkedList要强于ArrayList。由于ArrayList要移动数据
4、去掉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;
}
}
5、HashMap与HashTable的差别
两者都实现了Map接口。主要差别在于:
(1)、HashTable是早期Java就有的,支持多线程操作。是线程安全的。HashMap是Java2才出现的。是HashTable的轻量级实现,仅支持单线程操作。线程不安
全的。
(2)、HashMap同意空的key和value HashTable不同意
6、List与Map的差别
List是存储单列数据的集合,Map是存储key和value这样双列数据的集合,List中存储的数据是有顺序的,而且同意反复。
Map其中存储的数据是没有顺序的,它
存储的key是不能反复的,value是能够反复的。
List继承Collection接口,Map不是。Map没有父类
7、List、Map、Set三个接口。存取元素时各有什么特点
首先List和Set都是单列元素的集合。它们有一个共同的父接口Collection。
List内的元素讲究有序性。内部元素可反复。可是Set恰恰相反。它讲究的是无序性,元素不可反复。Set的add方法有一个boolean的返回值,每当add一个新元
素的时候都会调用equals方法进行逐一比較,当新元素与全部的已存在元素的都不反复的时候add成功返回true。否则返回false。
Map与List和Set不同,它是双列存储的(键和值一一相应)。它在存储元素调用的是put方法,每次存储时,要存储一份key和value。不能存储反复的key,这个
反复的规则也是利用equals进行比較。取数据的时候则能够依据key获取value。另外还是以获得全部key的集合和全部value的集合。还能够获得key和value组成
的Map.Entry对象的集合。
8、介绍一下TreeSet
(1)TreeSet的原理
Tree在存储对象的时候须要排序。可是须要指定排序的算法。
Integer和String能够自己主动排序(有默认算法)
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()方法的实现方式:
/**
* Compares two {@code Integer} objects numerically.
*
* @param anotherInteger the {@code Integer} to be compared.
* @return the value {@code 0} if this {@code Integer} is
* equal to the argument {@code Integer}; a value less than
* {@code 0} if this {@code Integer} is numerically less
* than the argument {@code Integer}; and a value greater
* than {@code 0} if this {@code Integer} is numerically
* greater than the argument {@code Integer} (signed
* comparison).
* @since 1.2
*/
public int compareTo(Integer anotherInteger) {
return compare(this.value, anotherInteger.value);
} /**
* Compares two {@code int} values numerically.
* The value returned is identical to what would be returned by:
* <pre>
* Integer.valueOf(x).compareTo(Integer.valueOf(y))
* </pre>
*
* @param x the first {@code int} to compare
* @param y the second {@code int} to compare
* @return the value {@code 0} if {@code x == y};
* a value less than {@code 0} if {@code x < y}; and
* a value greater than {@code 0} if {@code x > y}
* @since 1.7
*/
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
自己定义的类存储的时候须要指定排序的算法,否则会出现异常。
假设想把自己定义的类存储到TreeSet对象中,那
么必须实现Comparable接口。重写它的compareTo()方法。在方法内定义比較大小的方法,依据大小关系,返回正数、负数或者0.
在使用TreeSet的add方法进行存储对象的时候就会自己主动调用compareTo()方法进行比較,依据比較结果依照二叉树的方式进行存储。
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("wangmazi", 3));
ts.add(new Teacher("wangwu",4));
ts.add(new Teacher("mazi", 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;
} //o中存放时的红黑二叉树中的节点,从根节点開始比較
public int compareTo(Object o) {
Teacher ss = (Teacher) o;
int result = num < ss.num ? 1 : (num == ss.num ? 0 : -1);//降序
//int result = num > ss.num ? 1 : (num == ss.num ? 0 : -1);//升序
if (result == 0) {
result = name.compareTo(ss.name);
}
return result;
}
}
Java集合类相关面试题的更多相关文章
- Java多线程相关面试题及答案-整理
1.什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完成 ...
- 一招破解 Java 集合类面试题
今日招式:Java集合类面试题 Java集合类绝对是我们的老朋友了,Java技术江湖里,谁人不知,谁人不晓,它的使用率非常高,使用难度却也不大,这也导致了很多人对它不屑一顾,殊不知其中却暗藏玄机,今天 ...
- Java线程相关的热门面试题
---恢复内容开始--- 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序 ...
- 面试题_ Java EE 相关的面试题
为了做 Java EE 的朋友,这里列出了一些 web 开发的特定问题,你们可以用来准备 JEE 部分的面试: 10 大 Spring 框架面试题及答案(参见)10 个非常好的 XML 面试问题(Ja ...
- Java 核心内容相关面试题【3】
目录 面向对象编程(OOP) 常见的Java问题 Java线程 Java集合类 垃圾收集器 异常处理 Java小应用程序(Applet) Swing JDBC 远程方法调用(RMI) Servlet ...
- Java线程和进程相关面试题与答案总结
有几天没有写一写博客了,今天就带给大家一些面试题和参考答案吧! 这些都是上海尚学堂Java培训的学员去面试时遇到的问题,今天总结出来的是Java线程相关类的面试题.把参考答案和解析也发布出来,供大家学 ...
- 大公司最喜欢问的Java集合类面试题
看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧. java.util包中包含了一系列重要的集合类,而对于集合类,主要 ...
- 2015年Java开发岗位面试题归类
一.Java基础 1. String类为什么是final的. 2. HashMap的源码,实现原理,底层结构. 3. 说说你知道的几个Java集合类:list.set.queue.map实现类咯... ...
- Java开发岗位面试题
看到一些java面试题,准备慢慢自己做出来试试. 一.Java基础 1. String类为什么是final的. 只有当字符串是不可变的,字符串池才有可能实现.字符串池的实现可以在运行时节约很多heap ...
随机推荐
- osX显示隐藏文件
终端输入: defaults write com.apple.finder AppleShowAllFiles -bool YES
- MYSQL 更改数据库data存储目录 创建用户 创建权限 设置远程访问的权限.
一. 怎么更改数据库data存储目录: 1. 安装MYSQL. 2. 切换到 C:\Program Files\MySQL\MySQL Server 5.6 3. 新建my.ini. 加入如下配置: ...
- 已有iptables表的查看
查看已有iptables表 iptables -L -nv --line-number-L是--list的简写,作用是列出规则-n是ip以数字方式显示,有的会用域名方式显示.-v是显示详细信息 v=v ...
- OOM问题定位方法
1. 背景 线上内存OOM问题是最难定位的问题,最常见的原因: (1)本身资源不够 (2)申请的太多 (3)资源耗尽 某服务器上部署了Java服务,出现OutOfMemoryError,请问有可能是什 ...
- CF 366E - Dima and Magic Guitar 最远曼哈顿距离
题目:http://codeforces.com/problemset/problem/366/E 事实上就是找 n * m 矩阵中数字 x 和 数字 y 的最远距离. 方法參照武森的论文<浅谈 ...
- yum 报错 Error: rpmdb open failed
# yum list rpmdb: unable to join the environment error: db3 error() from dbenv->open: Resource te ...
- 每日英语:Cyclists Live Six Years Longer
Cycling does the body good. New data from Tour de France cyclists finds that those athletes live an ...
- ny511 移动小球
移动小球 时间限制:1000 ms | 内存限制:65535 KB 难度:2 描述 给你n个小球,从左到右编号依次为1,2,3,4,5,6.........n,并规定小球1的左边的球号为n,小 ...
- 《CCNA(640-802)全套课程讲义》笔记
路由器: CLI(命令行界面)形式相对应的是GUI (图形用户界面) DTE:数据终端设备,指的是位于用户网络接口的用户端设备,通常情况下,路由器端为DTE端. DCE:数据通讯设备,为通信提供时钟 ...
- weblogic检查项
日常维护中,weblogic检查的几个项: 1.JVM: 如最大堆内存.最小堆内存. 2.GC回收: 查看jvm空闲内存变化情况,每次GC的回收情况:控制台可以强制垃圾回收,看看回收内存是否太小,如果 ...