腾讯-Java后台开发面经
-
HashSet 和 HashMap 的区别是什么?
- HashSet是通过HasMap来实现的,HashMap的输入参数有Key、Value两个组成,在实现HashSet的时候,保持HashMap的Value为常量,相当于在HashMap中只对Key对象进行处理。
- HashSet是通过HasMap来实现的,HashMap的输入参数有Key、Value两个组成,在实现HashSet的时候,保持HashMap的Value为常量,相当于在HashMap中只对Key对象进行处理。
-
HashMap 是线程安全的么?线程安全需要用到什么?
- 异步、非线程安全;如何实现线程安全
-
介绍一下 HashMap。如果一个对象为 key 时,hashCode 和 equals 方法的用法要注意什么?
阿里巴巴-Java后台开发面经
-
ArrayList 和 LinkedList 的区别是什么?
- ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素
- LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素
-
有了解过 HashMap 的具体实现么?
- HashMap:基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,可以调优初始容量和负载因子。HashMap非线程安全
-
HashMap 和 ConcurrentHashMap 哪个效率更高?
- 在1.8中ConcurrentHashMap的get操作全程不需要加锁,因为Node的成员val是用volatile修饰的和数组用volatile修饰没有关系,所以它比其他并发集合比如hashtable、用Collections.synchronizedMap()包装的hashmap;安全效率高。
今日头条-Java后台开发面经
- 编程题:判断一个链表是否是一个回文链表。
//判断一个链表是否是回文
public boolean chkPalindrome(){
if(this.head==null){
return false;
}
//找到当前链表的中间位置
Node fast = this.head;
Node slow = this.head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
//从中间位置开始 后半部分进行反转
Node cur = slow.next;
while (cur != null) {
Node curNext = cur.next;
cur.next = slow;
slow = cur;
cur = curNext;
}
//head从头往后走 slow从后往前走
while (slow!=head){
//只要发现对应的val值不一样,就返回false 直到head和slow相遇
if(head.val!=slow.val){
return false;
}
if(head.next==slow)
{
return true;
}
head = head.next;
slow = slow.next;
}
return true;
}
-
hashCode主要是用来做什么用的
-
为什么:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。 于是,Java采用了哈希表的原理。
-
是什么:hashCode方法实际上返回的就是对象存储的物理地址(实际上并不是真正的在内存的物理地址,不过可以这样理解)。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
-
-
Redis 的 zset 类型对应到 java 语言中大致是什么类型?