目录:

  • java 容器都有哪些?
  • Collection 和 Collections 有什么区别?
  • List、Set、Map 之间的区别是什么?
  • HashMap 和 Hashtable 有什么区别?
  • 如何决定使用 HashMap 还是 TreeMap?
  • 说一下 HashMap 的实现原理?
  • 说一下 HashSet 的实现原理?
  • ArrayList 和 LinkedList 的区别是什么?
  • 如何实现数组和 List 之间的转换?
  • ArrayList 和 Vector 的区别是什么?
  • Array 和 ArrayList 有何区别?
  • 在 Queue 中 poll()和 remove()有什么区别?
  • 哪些集合类是线程安全的?
  • 迭代器 Iterator 是什么?
  • 怎么确保一个集合不能被修改?

java 容器都有哪些?

Collection、Map:

Collection:

  • List:有序集合。

    • ArrayList:基于数组实现的有序集合。
    • LinkedList:基于链表实现的有序集合。
    • Vector:矢量队列
  • Set:不重复集合。
    • HashSet:基于hash实现的不重复集合,无序。

      • LinkedHashSet:基于hash实现的不重复集合,有序。
    • SortedSet:可排序不重复集合。
      • NavigableSet:可导航搜索的不重复集合。
      • TreeSet:基于红黑树实现的可排序不重复集合。
  • Queue:队列。
    • BlokingQueue:阻塞队列。
    • Deque:可两端操作线性集合。

Map:键值映射集合。

  • HashMap:类似Hashtable,但方法不同步key、value可为null

    • LinkedHashMap:根据插入顺序实现的键值映射集合。
  • Hashtable:基于哈希表实现的键值映射集合,key、value均不可为null
  • IdentityHashMap:基于哈希表实现的键值映射集合,两个key引用相等==,认为是同一个key
  • SortedMap:可排序键值映射集合。
    • NavigableMap:可导航搜索的键值映射集合。
  • WeakHashMap:弱引用建,不阻塞被垃圾回收器回收,key回收后自动移除键值对。

Collection 和 Collections 有什么区别?

Collection是java有序集合中最根本的接口定义,Collections是java有序集合的工具类

List、Set、Map 之间的区别是什么?

List:有序集合,元素可重复。

Set:元素不能重复,LinkedList按照元素插入数据排序,SortedSet可排序,HashSet无序。

Map:键值对集合,key无序且唯一,value不要求有序且允许重复。

HashMap 和 Hashtable 有什么区别?

  • 线程安全:HashMap线程不安全;Hashtable线程安全。
  • 允许有null值:HashMap允许key、value为null;Hashtable不允许key、value为null。
  • 迭代器:HashMap的Iterator是fail-fast迭代器;Hashtable还使用了enumerator迭代器。
  • hash的计算方式:HashMap计算了hash值;Hashtable使用了key的hashCode方法。
  • 默认容器大小和扩容方式:HashMap默认初始大小16,容量必须是2的整数次幂,扩容时将容量变为原来的2倍;Hashtable默认初始大小11,扩容时将容量变为原来的2倍加1。
  • contains方法:HashMap没有contains方法;Hashtable包含contains方法,类似于containsValue。
  • 父类:HashMap继承自AbstractMap;Hashtable继承自Dictionary。

如何决定使用 HashMap 还是 TreeMap?

HashMap基于数组和链表,TreeMap基于红黑树。

因HashMap不支持排序,而TreeMap默认按照key升序排序的,所以在没有排序要求的情况下使用HashMap会有更好的性能。

说一下 HashMap 的实现原理?

1.8以前HashMap使用的是数组+链表的方式实现,首先它会拿到key值计算hash值,确认hash值后再将数据放到对应的槽中。

既然是计算hash值来找槽的话,那必然就会有hash冲突,java中解决hash冲突是采用链表的方式,也就是说具有向hash值key会放到同一个链表中。

而当HashMap数据过大的话势必会产生链表长度多大,导致访问数据过慢。

所以在1.8+的HashMap会在链表长度超过8的时候,将链表转为红黑树

说一下 HashSet 的实现原理?

HashSet 是基于 HashMap 实现的,查询速度特别快。

ArrayList 和 LinkedList 的区别是什么?

实现:ArrayList基于动态数组;LinkedList基于链表。

随机访问:ArrayList随机访问速度快(下标访问);LinkedList随机访问速度慢(链表需要遍历全表)。

插入、删除数据:ArrayList插入删除会移动数组速度慢;LinkedList只需改变前后链表的引用速度快。

如何实现数组和 List 之间的转换?

array to list:Arrays.asList();

list to array:List.toArray();

ArrayList 和 Vector 的区别是什么?

相同点:

  • 都基于数组实现,动态扩容。
  • 功能相同,操作方法类似。

区别:

  • ArrayList是线程不安全的,Vector是线程安全的;ArrayList性能优于Vector。
  • 默认容器大小都是10,ArrayList扩容50%,Vector扩容一倍且可指定扩容大小。

Array 和 ArrayList 有何区别?

Array是数组,ArrayList是Array的扩展,实现了动态扩容。

在 Queue 中 poll()和 remove()有什么区别?

remote未找到元素会抛出异常,poll未找到只会返回null。

哪些集合类是线程安全的?

  • Vector
  • Stack
  • Hashtable
  • java.util.concurrent 包下所有的集合类 ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque...

迭代器 Iterator 是什么?

用于顺序访问集合对象的元素,无需知道集合对象的底层实现。

优点:Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。

缺点:缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。

怎么确保一个集合不能被修改?

使用Collections.unmodifiableList()方法。

public class TestCollectionUnmodify {

    static List<String> list = new ArrayList<String>();
static Set<String> set = new HashSet<String>();
static Map<String, String> map = new HashMap<String, String>(); static {
list.add("1");
list.add("2");
list.add("3"); set.add("1");
set.add("2");
set.add("3"); map.put("1", "1");
map.put("2", "2");
map.put("3", "3");
} public static void main(String[] args) {
list = Collections.unmodifiableList(list);
set = Collections.unmodifiableSet(set);
map = Collections.unmodifiableMap(map);
listModify();
setModify();
mapModify();
} public static void listModify() {
list.add("4");
} public static void setModify() {
set.add("4");
} public static void mapModify() {
map.put("3", "4");
}
}

菜鸟刷面试题(五、Java容器篇)的更多相关文章

  1. java容器篇

    引言 第三天卡... 今天主要看了下java容器方面的知识,很累但是很充实.吃两把鸡去了,休息一下,再战. 开始 -Collection 存储对象的集合:Map 存储键值对的映射表    -Itera ...

  2. 菜鸟刷面试题(一、Java基础篇)

    目录: JDK 和 JRE 有什么区别? == 和 equals 的区别是什么? 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? final 在 java 中有什 ...

  3. 菜鸟刷面试题(四、Spring/Spring MVC/Spring Boot/Spring Cloud篇)

    目录: 为什么要使用 spring? 解释一下什么是 aop? 解释一下什么是 ioc? spring 有哪些主要模块? spring 常用的注入方式有哪些? spring 中的 bean 是线程安全 ...

  4. 菜鸟刷面试题(三、Redis篇)

    目录: redis是什么?都有哪些使用场景? redis有哪些功能? redis和memecache有什么区别? redis为什么是单线程的? 什么是缓存穿透?怎么解决? redis支持的数据类型有哪 ...

  5. 菜鸟刷面试题(二、RabbitMQ篇)

    目录: rabbitmq 的使用场景有哪些? rabbitmq 有哪些重要的角色? rabbitmq 有哪些重要的组件? rabbitmq 中 vhost 的作用是什么? rabbitmq 的消息是怎 ...

  6. Java面试题(Java Web篇)

    Java Web 64.jsp 和 servlet 有什么区别? jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将 ...

  7. Regex阅读笔记(五)java操作篇

    首先一个demo程序 Java的正则表达式包为java.util.regex,主要是使用其中的Pattern和Matcher. groupCount方法时候都可调用,而大多数方法都必须在匹配尝试成功之 ...

  8. Java面试题(Java基础篇)

    Java 基础 1.JDK 和 JRE 有什么区别? JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境. JRE:Java Run ...

  9. Java面试题(容器篇)

    容器 18.java 容器都有哪些? 如图:   首先分为Collection.Map: Collection下分为List.Set和Queue: List下分为ArrayList和LinkedLis ...

随机推荐

  1. kettle下载地址

    kettle 4.4和4.2 版本是好的,版本6.6和8.2 版本有bug Kettle下载和安装: 1.官网各个版本下载地址:https://sourceforge.net/projects/pen ...

  2. mysql中比较实用的几个函数

    1.曾有这样的需求: 可以使用如下函数: 语法:FIND_IN_SET(str,strlist). 定义: 1. 假如字符串str在由N子链组成的字符串列表strlist中,则返回值的范围在1到N之间 ...

  3. Python实现二叉树的非递归先序遍历

    思路: 1. 使用列表保存结果: 2. 使用栈(列表实现)存储结点: 3. 当根结点存在,保存结果,根结点入栈: 4. 将根结点指向左子树: 5. 根结点不存在,栈顶元素出栈,并将根结点指向栈顶元素的 ...

  4. Python中的with语句(上下文管理协议)

    在平时工作中总会有这样的任务,它们需要开始前做准备,然后做任务,然后收尾清理....比如读取文件,需要先打开,读取,关闭 这个时候就可以使用with简化代码,很方便 1.没有用with语句 f = o ...

  5. Linux 多命令语句与重定向

    多命令语句 Linux中我们在shell输入命令一般是一条一条执行,但是我们同样可以用一行语句写出多命令,下面就举出几个常见的方法 “;”分号用法 方式:command1 ; command2 用;号 ...

  6. c# 爬虫和组件HtmlAgilityPack处理html

    测试当前爬虫的User-Agent:http://www.whatismyuseragent.net/ 大佬的博客地址:https://www.cnblogs.com/jjg0519/p/670274 ...

  7. php--最新正则(手机号码)

    这次给大家带来正则验证(2018最新最全手机号验证),正则验证(2018最新最全手机号验证)的注意事项有哪些,下面就是实战案例,一起来看一下. 下面给大家分享2018手机号正则表达式验证方法,具体内容 ...

  8. 关于工作单元模式——工作单元模式与EF结合的使用

    工作单元模式往往和仓储模式一起使用,本篇文章讲到的是工作单元模式和仓储模式一起用来在ef外面包一层,其实EF本身就是工作单元模式和仓储模式使用的经典例子,其中DbContext就是工作单元,而每个Db ...

  9. LeetCode:627.交换工资

    题目链接:https://leetcode-cn.com/problems/swap-salary/ 题目 给定一个 salary 表,如下所示,有 m = 男性 和 f = 女性 的值.交换所有的 ...

  10. Jboss未授权访问部署木马 利用exp

    查看系统名称 java -jar jboss_exploit_fat.jar -i http://www.any.com:8080/invoker/JMXInvokerServlet get jbos ...