Java集合框架常见面试题总结

List,Set,Map三者的区别及总结:

1.List:对付顺序的好帮手

List接口存储一组不唯一(可以有多个元素引用相同的对象),有序的对象

2.Set:注重独一无二的性质:

不允许重复的集合。不会有多个元素引用相同的对象。

3.Map:用key来搜索的专家

使用键值对存储,Map会维护与key有关联的值。两个key可以引用相同的对象,但key不能重复,典型的key是String类型

但ye也可以是任何对象。

Arraylist 与 LinkedList 区别

Arraylist底层使用的是数组(存读数据效率高,插入删除特定位置效率低),LinkedList底层使用的是双向循环链表数据结构(插入,删除效率特别高)。学过数据结构这门课后我们就知道采用链表存储,插入,删除元素时间复杂度不受元素位置的影响,都是近似O(1)而数组为近似O(n),因此当数据特别多,而且经常需要插入删除元素时建议选用LinkedList.一般程序只用Arraylist就够用了,因为一般数据量都不会蛮大,Arraylist是使用最多的集合类。

ArrayList 与 Vector 区别

Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector ,代码要在同步操作上耗费大量的时间。Arraylist不是同步的,所以在不需要同步时建议使用Arraylist。

HashMap 和 Hashtable 的区别

Java集合框架常见面试题总结_第1张图片

HashMap 和 ConcurrentHashMap 的区别

1.ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上都用lock锁进行保护,相对于HashTable的synchronized锁的粒度更精细了一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。(JDK1.8之后ConcurrentHashMap启用了一种全新的方式实现,利用CAS算法。)

2.HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。

HashSet如何检查重复

当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让加入操作成功。

hashCode()与equals()的相关规定:

  1. 如果两个对象相等,则hashcode一定也是相同的
  2. 两个对象相等,对两个equals方法返回true
  3. 两个对象有相同的hashcode值,它们也不一定是相等的
  4. 综上,equals方法被覆盖过,则hashCode方法也必须被覆盖
  5. hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会等。
  6. "=="与equals的区别:
    1. ==是判断两个变量或实例是不是指向同一个内存空间 equals是判断两个变量或实例所指向的内存空间的值是不是
    2. ==是指对内存地址进行比较equas()是对字符串的内容比较

              3.==指引用是否相同equals()指的是值是否相同。

comparable 和 comparator的区别

  • comparable接口实际上是出自java.lang包 它有一个 compareTo(Object obj)方法用来排序
  • comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序

Comparator定制排序

package org.java.Test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/**
 * 功能:Collections类方法测试之排序
 * @author   lee
 * @date  2018.10.29
 * @version 1.7
 * */
public class CollectionsSort {
    
    public static void main(String[] args) {
        ArrayList  arr=new ArrayList();    
        arr.add(-1);
        arr.add(3);
        arr.add(-5);
        arr.add(7);
        arr.add(4);
        arr.add(-9);
        arr.add(-7);
        System.out.println("原始数组:");
        System.out.println(arr);
        //void reverse(List  list):反转 
        Collections.reverse(arr);
        System.out.println("Collections.reverse(arr):");
        System.out.println(arr);
        // void sort(List list),按自然排序的升序排序
        Collections.sort(arr);
        System.out.println("Collections.sort(arr):");
        System.out.println(arr);
        
        // void shuffle(List list),随机排序
        Collections.shuffle(arr);
        System.out.println("Collections.sort(arr)");
        System.out.println(arr);
        
        //定制排序的用法
        Collections.sort(arr,new Comparator() {

            @Override
            public int compare(Integer o1, Integer o2) {
                // TODO Auto-generated method stub
                return o2.compareTo(o1);
            }
            
        });
        System.out.println("定制排序后:");
        System.out.println(arr);
        
    }

}


重写compareTo方法实现按年龄来排序:

package org.java.Test;

import java.util.Set;
import java.util.TreeMap;

/**
 * 功能:重写compareto方法实现按年龄来排序
 * @author  lee
 * @date    2018.10.29
 * 
 * */
public class TreeMap2 {

    public static void main(String[] args) {
        TreeMap  data=new TreeMap();     
        data.put(new Person("张三",30), "zhangsan");
        data.put(new Person("李四",20), "lisi");
        data.put(new Person("王五",18), "wangwu");
        data.put(new Person("小红",15), "xiaohong");
        //得到key的值的同时得到key所对应的值
        Set keys=data.keySet();
        for (Person key : keys) {
            System.out.println(key.getAge()+"-"+key.getName());
        }
        
    }

}

package org.java.Test;

public class Person implements Comparable{
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    @Override
    public int compareTo(Person o) {
        if(this.age>o.getAge()){
            return 1;
        }else if(this.age             return -1;
        }
        return age;
    }
    
}
 

 如何对Object的list排序

1.对Objects数组进行排序,我们可以用Arrays.sort()方法

2.对Objects的集合进行排序,需要使用Collections.sort()方法

如何实现数组与List的相互转换

List转数组:toArray(arraylist.size())方法;数组转List:Arrays的asList(a)方法

List   arrayList=new ArrayList();

arrayList.add("s");

arrayList.add("e");

arrayList.add("n");

/**
		 * ArrayList转数组
		 */
		int size=arrayList.size();
		String[] a = arrayList.toArray(new String[size]);
		//输出第二个元素
		System.out.println(a[1]);//结果:e
		//输出整个数组
		System.out.println(Arrays.toString(a));//结果:[s, e, n]
		/**
		 * 数组转list
		 */
		List list=Arrays.asList(a);                   
                 /**
		 * list转Arraylist
		 */
		List arrayList2 = new ArrayList();
		arrayList2.addAll(list);
		System.out.println(list);

如何求ArrayList集合的交集  并集   差集   去重复并集

需要用到List接口中定义的几个方法:

   addAll(Collection c):指定集合的iteator返回的顺序将指定集合中的所有元素追加到此列表的末尾 实例代码: 

   retainAll(Collection c):仅保留此列表中包含在指定集合中的元素。

   removeAll(Collection c):从此列表中删除指定集合中包含的所有元素。

package org.java.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 功能:两个集合之间求交集  并集  差集  去重复并集
 * @author lee
 * @dete  2018.10.29    
 * @version 1.7
 * */
public class Demo {

    public static void main(String[] args) {
        List  list1=new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list1.add(4);
        
        List  list2=new ArrayList<>();
        list2.add(2);
        list2.add(3);
        list2.add(4);
        list2.add(5);
        //并集
        System.out.println(list1.addAll(list2));
        //交集
        System.out.println(list1.retainAll(list2));
        //差集
        list1.removeAll(list2);
        //无重复集
        list2.removeAll(list1);
        list1.addAll(list2);
        for (Integer i : list2) {
            System.out.println(i);
        }
    }

}
 

 

 

集合框架底层数据结构总结

-Collection 

1.List  

ArrayList:数组(查询快,增删慢  线程不安全,效率高)

Vector:数组(查询快,增删慢  线程安全,效率低)

LinkedList:链表(查询慢,增删快  线程不安全,效率高)

2.Set

HashSet(无序,唯一):哈希表或者san散列集(hash table)。

LinkedList:链表和哈希表组成。由链表保证元素的排序,由哈希表证元素的唯一性。

TreeSet(有序,唯一):红黑树(自平衡二叉树)

-Map

HashMap:基于哈希表的Map接口实现(哈希表对键进行散列,Map结构即映射表存放键值对)。

LinkedHashMap:HashMap的基础上加上了链表数据结构。

HashTable:哈希表。

TreeMap:红黑树。

集合的选用.

主要根据集合的特点来选用,比如我们需要根据键值获取到元素值时就选用Map接口下的集合,需要排序时选择TreeMap,不需要排序时就选择HashMap,需要保证线程安全就选用ConcurrentHashMap.当我们只需要存放元素值时,就选择实现Collection接口的集合,需要保证元素唯一时选择实现Set接口的集合比如TreeSet或HashSet,不需要就选择实现List接口的比如ArrayList或LinkedList,然后再根据实现这些接口的特点来选用。

集合的常用方法

建议把API多看看。

你可能感兴趣的:(Java集合框架常见面试题总结)