阿里《JAVA实习生入职测试题——2019最新》之答…
2019-08-29 09:10:36来源:博客园 阅读 ()
阿里《JAVA实习生入职测试题——2019最新》之答案详解
根据我的理解和搜集的资料,力争清晰完整准确的回答(逐步完善,持续更新)
1、String类为什么是final的
首先分析String的源码:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];
- 类被final关键字限定,说明它不可以被继承,没有子类。即持有一个String对象的引用,它必然是String类,而不会是其他的类。
- value是用来存储值的,它是一个private final char数组,说明这个数组不可被其它数组替换-即数组的地址不可变更,但是数组的每个元素得值可以变更
private 限定符,保证String字符串数组的值不可在类外被修改。由于未对外暴露可修改的接口,所以String的值一旦被创建,即不可被修改。
- 线程安全
因为字符串是不可修改的,即多个线程可以共享同一个字符串实例。
- 字符串常量池可以大大提高时空间效率
字符串常量池,详见 https://segmentfault.com/a/1190000009888357
2、JDK8的HashMap的源码,实现原理,底层结构
HashMap的Hash冲突解决,后面单独会写一篇博客。
ConcurrentHashMap的锁分段,大厂很喜欢问(最近华为电话面试问过我),简单说一句,就是hashMap的数据是一个数组,用多个锁来锁,一个锁锁一部分数据。
不像以前一个锁锁住整个数组,多个线程可分段访问这些数据,自然效率就高了。后面单独写一篇博客,系统论述这个问题。
- 首先看Node的源码
static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; Node(int hash, K key, V value, Node<K,V> next) { this.hash = hash; this.key = key; this.value = value; this.next = next; }
HashMap用 transient Node<K,V>[] table 存值,本质上是链表数组(哈希数组+链表+红黑树),是Hash散列的,即数组不是紧密排列的,详见下图
图01
为什么有红黑树,看put(新增元素)的源码片段,如下:
else if (p instanceof TreeNode) e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
TreeNode定义的源码片段,如下:
static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V> { TreeNode<K,V> parent; // red-black tree links TreeNode<K,V> left; TreeNode<K,V> right; TreeNode<K,V> prev; // needed to unlink next upon deletion boolean red; TreeNode(int hash, K key, V val, Node<K,V> next) { super(hash, key, val, next); }
- 容量及动态扩容
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
默认容量-16。resize时,newCap = oldCap << 1( 2进制,左移1位,即*2,旧的容量翻倍,容量可能不是2的幂)
- 新增元素
public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }
1)如果以前这个key有值,put 操作会用新值替换旧值。
2)Hash冲突怎么解决
hash(散列),就是key和存储位置有个映射关系f,我们称之为hash函数。hash冲突,就是不同的key,根据hash函数算出来的存储位置相同,后面添加的元素就和原来的hashCode冲突了,所以要重新按照一定规则计算存储位置。普通HashMap(java 8的HashMap结构如“图1”,有红黑树)结构如下图:
java8 中的HashMap为了提高查找效率,当链表冲突过高,大于阈值时,会将链表转化成红黑树
- 装载因子
static final float DEFAULT_LOAD_FACTOR = 0.75f;
load factor默认0.75 ,这个和概率统计有关,详见 http://en.wikipedia.org/wiki/Poisson_distribution
为了减少冲突,当hashMap的数组长度 > 临界值就会触发扩容,所有元素rehash(重新计算hashCode和存储位置)再放到扩容后的容器中,因为涉及到计算、数据查找、内存拷贝、移动等操作,非常耗时。
临界值 = current capacity * current load factor。默认临界值 = DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR = 16 x 0.75 = 12时,就会触发扩容操作。
3、反射中,Class.forName和ClassLoader.loadClass的区别
4、session和cookie的区别与联系,session的生命周期,多个服务部署时session管理
5、Java中的队列都有哪些,有什么区别
6、详谈一下Java的内存模型以及GC算法
7、JAVA10、JAVA11的新特性
JAVA10 新特性官方发布页: https://www.oracle.com/technetwork/java/javase/10-relnote-issues-4108729.html
- 新增 Optional.orElseThrow() 方法
- 新增几个Unmodifiable Collections API,如
Collectors
类新增toUnmodifiableList
,toUnmodifiableSet
, 和toUnmodifiableMap
方法 - ...
JAVA11 新特性官方发布页: https://www.oracle.com/technetwork/java/javase/11-relnote-issues-5012449.html
8、Java内存泄漏的问题调查定位:jmap, jstack的使用
9、Spring的体系结构和jar用途
10、Spring MVC的运行原理
11、Spring Boot的执行过程
12、Spring IOC和AOP的底层实现
14、Spring boot 的优势和劣势,以及适用场景等
15、讲一下Sping Cloud和Dubbo的优缺点
16、什么是Hystrix?它如何实现容错?
hystrx 工作原理,详见 https://segmentfault.com/a/1190000012439580
17、什么Netflix Feign?它的优点是什么?
18、谈一谈分布式一致性到CAP理论,BASE理论
CAP(compare and swap)
19、常用的线程池模式以及不同线程池的使用场景—面试出现频率非常高
- FixedThreadPool
- CachedThreadPool
- SingleThreadExecutor
- ScheduledThreadPool
推荐: https://blog.csdn.net/z_s_z2016/article/details/81674893
20、ReentrantLock 和synchronized的区别
21、atomicInteger和volatile等线程安全操作的关键字的理解和使用
22、分布式锁三种实现方式
23、socket框架netty的使用,以及NIO的实现原理,为什么是异步非阻塞
24、简述NIO的最佳实践
25、Zookeeper的用途,选举的原理是什么
26、手写一个哈夫曼树
哈夫曼树(Huffman Tree)又称最优二叉树
*****************************************************************************************************
精力有限,欲望太多,专注做好一件事就行
- 5年内把代码写好,技术博客字字推敲,坚持零拷贝和原创
- 写博客的意义在于锻炼逻辑条理性,加深对知识的系统性理解,锻炼文笔,如果恰好又对别人有点帮助,那真是一件令人开心的事
*****************************************************************************************************
原文链接:https://www.cnblogs.com/NaughtyCat/p/alibaba-java-interview.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Java连载22-for循环
下一篇:掌握 Maven 私服
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 阿里巴巴26个屌炸天的开源项目,你知道几个? 2020-06-09
- 为什么阿里巴巴Java开发手册中不允许魔法值出现在代码中? 2020-06-09
- 来看看阿里架构师Java 代码打日志姿势!你也是这样写的吗 2020-06-08
- 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用 2020-06-06
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash