Java集合面试题
[面试题]Person类为已经重写好的hashCode()和equals()方法的类,试着写出每次打印set的值
HashSet set = new HashSet();
Person2 p1 = new Person2(1001, "AA");
Person2 p2 = new Person2(1002, "BB");
set.add(p1);
set.add(p2);
p1.name = "CC";
set.remove(p1);
/*
* remove时计算p1的HashCode值,此时p1的值已被修改,所以算出来的HashCode值并不是之前的,
* 所有这个remove并没有remove掉p1,此时打印set值为[(BB 1002), (CC 1001)]
*/
System.out.println(set);// [(BB 1002), (CC 1001)]
set.add(new Person2(1001, "CC"));
/*
* 添加的新的元素[1001,"CC"],虽然和set中的元素相同,但是两者的hashCode值并不相同,前一个元素HashCode
* 值为[1001,"AA"]的hashCode值,所以[1001,"CC"被存进来了
*/
System.out.println(set);// [(BB 1002), (CC 1001), (CC 1001)]
set.add(new Person2(1001, "AA"));
/*
* 添加的新元素[1001,"AA"]和p1的hashCode值相同,然后调用equals方法,和[1001,"CC"]不一样,所以
* 这个元素[1001,"AA"]也被存进来了
*/
System.out.println(set); // [(BB 1002), (CC 1001), (CC 1001), (AA 1001)]
[面试题]HashSet的底层实现原理
当我们向HashSet中添加一个数据时。会先调用该数据的hashCode方法来决定该数据在数组中所存储的位置
如果该位置上没有其他的元素,则将该数据直接存放即可。如果该位置已经有了其他的元素,调用该元素所在类的equals方法进行比较。如果返回值是个true则认为两个数据相同则不能存放。如果返回值是个false则以链表的形式将该数存在 该位置上。
(jdk8中):如果数量达到8则将链表换成红黑树
[面试题]List的主要实现类有哪些?有什么不同?
ArrayList:List的主要实现类,底层是数组,线程不安全,查找快,增删慢(数组快的特点)
Vetor:古老的实现类,底层是数组,线程安全的
LinkedList:底层是使用双向链表。增删块,查找满。
[面试题]:ArrayList的底层实现原理
通过ArrayList空参的构造器创建对象。底层会创建一个长度为10的数组。当我们向数组
中添加第11个元素时
底层会进行扩容,扩容为原来的1.5倍(创建一个新的数组长度为原来的1.5倍并将原数组
中的内容添加到新的数组中)
[面试题]TreeSet HashSet ArrayDeque LinkedList ArrayList HashMap的底层实现
TreeSet:底层是红黑树,有两种排序方式:自然排序和定制排序,需要实现Comparable接口或者实现Comparator匿名内部类。并不需要重写hashCode和equals
HashSet:底层是数组;需要重写hashCode和equals,先调用hashCode算出添加元素的hashCode值,找到该hashCode值对应的
ArrayDeque:双端数组:一般用于实现队列和栈这种数据结构;
实现队列:入队:offer() 出队:pull()
实现栈: 入栈:push() 出栈:pop()
LinkedList:底层是一个链表,删插快,但是遍历慢
ArrayList:底层是一个数组,当添加第一个数组时创建一个长度为10的数组,当存储超过数组长度时,扩容为原来的1.5倍
HashMap:调用HashMap空参的构造器,默认创建一个长度为16,默认加载因子为0.75的数组,即每次当达到数组的0.75时,自动扩容2倍。该数组存存在一个个Node元素,该Node元素包含的是entry,即key-value对。
HashMap的存储过程:取该元素的key,调用key的HashCode方法,算出该元素的位置,若该位置没有元素,则直接存入;若该位置有元素,再调用equals方法,如返回值为true,则覆盖之前的元素,若为false,则以链表的形式将这两个元素存在一起,当该链表达到8时,将链表换成红黑树,提高查询的效率。
上一篇: 最长不重复子串
下一篇: 两个相同结构的关系数据库表的差异比较方法
推荐阅读
-
使用javap分析Java的字符串操作 javapjdkjava字符串操作
-
Java面试题集合
-
JAVA敏捷开发环境搭建 博客分类: 创业java敏捷管理 java敏捷管理创业
-
java连接数据库Oracle|DB2|Sql Server|Sybase|Informix|MySQL||PostgreSQL|access
-
社会化海量数据采集爬虫框架搭建 博客分类: java架构hadoop 反监控海量数据抓取爬虫采集
-
Java程序执行内存分析(栈、堆、方法区)
-
海量数据相似度计算之simhash短文本查找 博客分类: 算法架构创业java simhash局部敏感哈希海明距离海量数据相似度
-
Java集合面试题
-
Java集合面试题
-
java 使用BigDecimal运算的时候报错No exact representable decimal result 博客分类: 技术分享 java运算BigDecimal