0
点赞
收藏
分享

微信扫一扫

13 Java程序员面试宝典视频课程之容器

IT影子 2022-01-09 阅读 71

一、容器指的是"可以容纳其他对象的对象",这种说法对吗?
答:
对。容器自己也是对象,同时可以装其他对象的引用。

二、Collection/Set/List 的联系跟区别?
答:
Collection 是 Java 集合顶级接口;
List 接口和 Set 接口是 Collections 接口有两个子接口;
List 接口存储一组不唯一(可重复),有序(插入顺序)的对象;
Set 接口存储一组唯一,无序的对象;
Collection,List,Set 的架构关系图:
image_1c9kk0m1012c6g6o4l6u9a1lsq9.png-59.6kB
三、Set 和 List 的特点跟区别?
答:
List:
是有序的 Collection,使用此接口能够精确的控制每个元素插入的位置。
用户能够使用索引来访问 List 中的无素,这类似于 Java 的数组
凡是可以操作索引的方法都是 List 接口特有方法
Set:
接口存储一组唯一,无序的对象(存入和取出的顺序不一定一致)。

四、想取两个容器中元素的交集,使用哪个方法?
答:

retainAll(Collection c);
    public static void main(String[] args) {
             ArrayList<Integer>  arry=new ArrayList<Integer>();
             ArrayList<Integer>  arry1=new ArrayList<Integer>();
             arry.add(2);
             arry.add(3);
             arry.add(4);
             arry1.add(3);
             arry1.add(4);
             arry1.add(6);
             arry.retainAll(arry1);//保留相同的数据
           for (int i = 0; i < arry.size(); i++) {
            System.out.println(arry.get(i));
        }
     }

五、说明 isEmpty 的作用,并说明下面代码有问题吗?

Collection co = null;
System.out.println(co.isEmpty());

答:
isEmpty():判断集合是否为空,也就是集合中实际元素个数是否为 0,由此得知调用此方法时集合是存在的(如果集合都不存在,也就谈不上为空与否了)。

没有指向任何集合,集合不真实存在,调用isEmpty()方法会报空指针异常

六、List 接口中增加了一些与顺序相关的操作方法,下面 add(int index, E element),get(int index)两个方法的作用是什么?
答:
add(int index, E element) :把元素 element添加到索引为index的位置;
get(int index):得到索引为 index 的元素

七、说出 ArrayLIst、LinkedList、Vector 的区别?
答:
ArrayList、LinkedList 两者都实现了 List 接口,都具有 List 中元素有序、不唯一的特点。
ArrayList :
实现了长度可变的数组,在内存中分配连续空间。遍历元素和访问元素的效率比较高;
LinkedList:
采用链表存储方式。插入、删除元素时效率比较高
image_1c9ll1mtl1v3d176737ksvqd7s9.png-163.8kB

Vector 和 ArrayList 的区别和联系
实现原理相同,功能相同,都是长度可变的数组结构,很多情况下可以互用
两者的主要区别如下

  1. Vector 是早期 JDK 接口,ArrayList 是替代 Vector 的新接口
  2. Vector 线程安全,ArrayList 重速度轻安全,线程非安全
  3. 长度需增长时,Vector 默认增长一倍,ArrayList 增长 50%

八、需要频繁的查询,插入和删除操作非常少,并且没有线程之间的共享,使用 List 下面的哪个实现类好一些?
答:
ArrayList :
ArrayList 实现了长度可变的数组,在内存中分配连续空间。遍历元素
和随机访问元素的效率比较高。

九、equals 返回 true,hashcode 一定相等吗?
答:
是的

十、HashSet 和 TreeSet 的区别?
答:
HashSet:
存储结构:采用 Hashtable 哈希表存储结构
优点:添加速度快,查询速度快,删除速度快
缺点:无序
TreeSet:
存储结构: 采用二叉树的存储结构
优点:有序(排序后的升序)查询速度比 List 快(按照内容查询)
缺点:查询速度没有 HashSet 快

十一、数组(Array)和列表(ArrayList)有什么区别?
答:
1、Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。
2、Array大小是固定的,ArrayList的大小是动态变化的
3、ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),iterator()等等。

十二、什么时候应该使用Array而不是ArrayList?
答:
1、对于基本类型数据,集合使用自动装箱来减少编码工作量。
2、当处理固定大小的基本数据类型的时候,这种方式比Array较慢。
3、如元素的数量是固定的,而且能事先知道,我们就应该用Array而不是ArrayList。

十三、使用 HashSet 存储自定义对象,为什么需要重写 hashCode()和 equals()?
答:
1、HashSet 存储用的哈希表结构,哈希表需要用到 hashCode()和 equals()方法:
2、hashCode()产生 hash 值以计算内存位置;
3、当 hash 值相同时要调用 equals()方法进行比较。
4、如果不重写,调用的是 Object 的 hashcode,而 Object 的 hashCode 实际上是地址。系统类已经覆盖了 hashCode 方法。
5、所以 HashSet 存储自定义对象的化要重写 hashCode()和 equals()方法,目的是告诉程序去除重复元素的策略。
如下

不重写hashCode();equals();方法就会有重复的元素

public class Test {
private Integer age;
public Test(Integer age) {
super();
this.age = age;
}
public static void main(String[] args) {
HashSet hs=new HashSet();
hs.add(new Test(12));
hs.add(new Test(12));
hs.add(new Test(13));
hs.add(new Test(14));
Iterator it=hs.iterator();
while(it.hasNext()){
Test p=(Test)it.next(); //强制转换
System.out.println(p.getAge()); //有重复元素
}
}
//对应的get set方法
重写hashCode();equals();方法就无重复的元素

/**

  • 其他代码如上:
  • 重写equals方法
  • /
    @Override
    public boolean equals(Object arg0) {
    if(thisarg0) return true;
    if(!(arg0 instanceof Test)) //这里是判断obj对象是否是Test类的一个实例。
    throw new ClassCastException(“类型错误”); //输入类型错误
    Test p = (Test)arg0;//强制转换
    return this.age
    p.age; //说明姓名和年龄相同则为同一元素
    }
    /
    *
  • 重写hashCode方法
  • */
    @Override
    public int hashCode() {
    return age;
    }
    十四、Map 中,key 能否重复?如果重复,会有什么现象?
    答:
    key:无序,唯一;
    添加重复的 key 不报错,会把之前重复的 key 覆盖了。

十五、HashMap的工作原理是什么?
答:
1、HashMap是以键值对(key-value)的形式存储元素的
2、HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。
3、当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上
4、如果key已经存在了,value会被更新成新值
5、HashMap的一些重要的特性是它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。

十六、Set 和 Map 的集合类名称相似,有没有内在的联系?
答:
HashMap 和 HashSet 这些集合类采用的是哈希表结构,需要用到 hashCode 哈希码和 equals方法。

十七、写出 List、Set、Map 中使用泛型的例子?
答:
1、ArrayList< String> aList=new ArrayList< String>();//只能接收 String 类型;
2、Set< Integer> set=new HashSet< Integer>();//只能接收 Integer 类型;
3、Map< Integer,String> map=new HashMap< Integer,String>();//只能接收 key 类型为 Integer,value 类型为 String。

十八、使用泛型有什么好处?
答:
1、泛型是 JavaSE1.5 的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数
2、Java 语言引入泛型的好处是安全简单

十九、【编程题】自定义一个List集合写出三种遍历方式?
答:

List array = new ArrayList<>();
array.add(“a”);
/**
* 1、普通遍历
* /
for (int i = 0; i<array.size(); i++) {
System.out.print(array.get(i));
}
/
*
* 2、增强for遍历
* /
for (String string : array) {
System.out.print(string);
}
/
*
* 2、通过迭代遍历
* */
Iteratorit = array.iterator();
while(it.hasNext()){
System.out.print(it.next());
}
二十、【编程题】自定义一个Set集合写出两种遍历方式?
答:

Set array = new HashSet<>();
array.add(“a”);
/**
* 1、增强for遍历
* /
for (String string : array) {
System.out.print(string);
}
/
*
* 2、通过迭代遍历
* */
Iteratorit = array.iterator();
while(it.hasNext()){
System.out.print(it.next());
}
二十一、【编程题】自定义一个Map集合分别遍历出所有的 key?所有的 value?所有的 key 和 value?
答:

Map<String, String> map = new LinkedHashMap<String, String>();
map.put(“null”, “a”);
map.put(“key2”, “b222ss2”);
map.put(“key2”, “wwww22”);
map.put(“key4”, “c222”);
map.put(“key1”, “c222”);
/**
* 方法一
/
Set s = map.keySet();
Iterator i = s.iterator();
while (i.hasNext()) {
String key = i.next();
String value = map.get(key);
System.out.println(key + " =" + value);
}
/
*
* 方法二
/
Set k = map.entrySet();
Iterator iterator = k.iterator();
while (iterator.hasNext()) {
Map.Entry me = (Map.Entry) iterator.next();
Object Key = me.getKey();
Object value = me.getValue();
System.out.println(Key + “=” + value);
}
/
*
* 方法三
*/
Collection c = map.values();
Iterator x = c.iterator();
while (x.hasNext()) {
System.out.println(x.next());
}
二十二、采用增强 for 循环遍历 List 或者 Set,如果 List 或者 Set 没有加泛型,能遍历吗?
答:

二十三、如果我想在遍历时删除元素,采用哪种遍历方式最好?
答:
Iterator 接口。Iterator 有 remove 方法可以移除元素。

Iterator iter=lists.iterator();
while (iter.hasNext()) {
String str =iter.next();
if(“B”.equals(str)){
iter.remove();
}else{
System.out.println(str);
}
}
二十四、Iterator 是一个接口还是类?
答:
Iterator 接口。

二十五、Iterator和ListIterator的区别是什么?
答:
1、Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
2、Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。
3、ListIterator继承了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等

二十六、Enumeration接口和Iterator接口的区别有哪些?
答:
1、Enumeration速度是Iterator的2倍,同时占用更少的内存
2、但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象
3、Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。

二十七、Collection 和 Collections 有什么区别?
答:
1、Collection 是 Java提供的集合接口,存储一组不唯一,无序的对象。它有两个子接口 List 和Set。
2、Collections 类,专门用来操作集合类,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

二十八、【编程题】创建一个工程资源文件,使用Property 类读取数据?
答:

try {
InputStream inputStream = JavaTest06.class.getClassLoader()
.getResourceAsStream(“db.properties”);
Properties properties = new Properties();
properties.load(inputStream);
String property = properties.getProperty(“key”);
System.out.println(property);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
二十九、Hashtable 和 HashMap 的区别?
答:
实现原理相同,功能相同,底层都是哈希表结构,查询速度快
区别如下
1、Hashtable 是早期 JDK 提供的接口,HashMap 是新版 JDK 提供的接口
2、Hashtable 继承 Dictionary 类,HashMap 实现 Map 接口
3、Hashtable 线程安全 写入时会比较慢 ,HashMap 线程非安全 快速查找
4、Hashtable 不允许 null 值,HashMap 允许 null 值

Map<String, String>map =new Hashtable<String,String>();
map.put(null, “a”);//不能有null值
Collection c = map.values();
Iterator x = c.iterator();
while(x.hasNext()){
System.out.println(x.next());
}
三十、Java 主要容器的选择依据和应用场合
答:
1、 HashTable,Vector 类是同步的,而 HashMap,ArrayList 不是同步的。 因此当在多线程的情况下,应使用 HashTable 和 Vector,相反则应使用 HashMap,ArrayList.
2、除需要排序时使用TreeSet,TreeMap外,都应使用HashSet,HashMap,因为他们的效率更高。
3、ArrayList 由数组构建,LinkList由双向链表构建,因此在程序要经常添加,删除元素时速度要快些,最好使用 LinkList,而其他情况下最好使用 ArrayList.因为他提供了更快的随机访问元素的方法。

举报

相关推荐

0 条评论