java阿里三面 面经 答案,20年面试阿里java研发(已通过)后整理的面经&答案

一、Java容器:List,Set,Map

(1)List:分为arrayList和LinkedList和Vector,Queue(基于linkedList实现),Stack(基于Vector实现),相比数组都可以动态伸缩,arrayList有很好的随机存取效率,因为使用的数组实现(内存中的连续区域,直接计算地址),默认容量10;LinkedList有较小的插入删除代价,因为用的是双向

链表实现的;Vector也是使用数组实现的,应用了synchronized方法,所以性能上比ArrayList差,但是线程安全。

(2)Set:主要是HashSet,TreeSet,LinkedHashSet。hashSet基于hashMap实现的,自定义类使用set的话需要实现comparable接口或者传给set一个comparator比较器,需要重写equals函数。treeSet是实现

红黑树数据结构后得到的顺序set。

红黑树每个节点的值都大于等于他的左子树小于等于右子树,这能确保

红黑树运行时能快速在树种找到所需节点,这样一来,就可以从一个set里提到一个顺序集合。因此与hashSet相比,treeSet的优势在于:treeSet中的所有元素总是根据指定

排序规则保持有序状态。hashSet初始是16个元素的数组,达到75%时扩容。LinkedHashSet是HashSet的子类,该类在HashSet的基础上将每一个元素根据插入顺序用

链表连接起来,可以按插入顺序遍历。

(3)Map:主要是hashMap和hashTable,treeMao,linkedHashMap。HashTable不允许键/值为空,支持多线程,即同一时刻只有一个线程可以写。hashMap除了Iterator遍历之外还可以用for-each遍历,for(T key:map.ketSet()){key.getValue;};

二、Map的遍历方式

1、map.entrySet()获得Entry集合,然后用foreach遍历或者获得entry集合的iterator遍历

2、map.keySet()获得键集合,然后调用map.get(key)方法访问值,使用forench遍历或者获得key集合的iterator遍历。

3、map.values()获得值集合,然后forench遍历或者获得值集合的iterator遍历

三、HashMap扩容为什么是扩为两倍?

散列函数

四、Java线程同步机制(信号量,闭锁,栅栏)

五、对volatile的理解:常用于状态标记

(1)对所有线程可见性:线程改变值后立即写回内存,读取时必须从主存中读取

(2)禁止指令重

排序: 插入许多内存屏障:

六、八种基本数据类型的大小以及他们的封装类(顺带了解自动拆箱与装箱)

七、线程阻塞几种情况?如何自己实现阻塞队列?

八、Java垃圾回收

可达性分析->引用级别->二次标记(finalize方法)->垃圾收集

算法(4个)->回收策略(3个)->垃圾收集器(GMS、G1)。

可达性分析的根结点:

1、虚拟机栈中引用变量指向的对象。

2、方法区中的静态引用的对象

3、方法区中的常量引用的对象

4、本地方法栈中引用的对象

九、java内存模型

十、TCP/IP的理解

十一、进程和线程的区别

十二、http状态码含义

最后,帮实习时认识的技术大佬打个广告,团队技术氛围非常好,绝对是走技术路线同学的天堂(本人去年在此实习),无门槛哈,任何学校的同学都可以投

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值