参考:数组+链表+红黑树 jdk为了减少拉链过长引入红黑树
参考:扩容时机 length*loadFator
按理来说素数冲突更少,不过在经过高位运算和哈希取模后可以有效减小碰
ConcrrentHashMap 采用分堆的思想,锁住的粒度更小
循环
registerNative sleep wait() notify/notifyAll sleep hashcode equals clone finalize
运行时动态生成代理类
jdk 需要被代理的类实现一个一个接口 基于接口的代理 ,然后针对接口实现一个InvocationHandler
cglib 基于字节码技术 底层asm 基于类 ,被代理的类不需要去实现接口
Serializable
Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的。
exserserizle
序列化的用途:
1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
2) 在网络上传送对象的字节序列。
c)当你想通过RMI传输对象的时候;
8、总结:
a)当一个父类实现序列化,子类自动实现序列化,不需要显式实现Serializable接口;
b)当一个对象的实例变量引用其他对象,序列化该对象时也把引用对象进行序列化;
c) static,transient后的变量不能被序列化;
参考https://blog.csdn.net/dyl_yingmeng/article/details/81110816
简洁版概念图:
真正实现形状
特征:
内部节点并不存储真正的信息,而是保存其叶子节点的最小值作为索引。
每次插入删除都进行更新(此时用到parent指针),保持最新状态。
B+树还有一个最大的好处,方便扫库,B树必须用中序遍历的方法按序扫库,而B+树直接从叶子结点挨个扫一遍就完了,B+树支持range-query非常方便,而B树不支持。这是数据库选用B+树的最主要原因。
堆排序具体原理和实现可参考:https://www.cnblogs.com/chengxiao/p/6129630.html
步骤一:堆排序的过程是第一个非叶子节点从右到左,从上到下 调整
步骤二:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了
pc 堆 栈 本地栈 方法区
虽然方法进入退出 进行压栈和出栈
不会
参考:
标记清除:内存碎片
标记整理
默认比例是8:1:1,可以通过-XX:SurivorRation进行调整比例。
研究表明98%朝生墓死,预留10%保存存活对象
引用计数:缺陷是互相引用
可达性分析 :通过设置GCRoot,进行引用链分析
强引用:内存溢出也不会回收 A a=new A
软引用 :内存不足回收 依赖SoftRefrence
弱引用:gc来临直接回收 依赖WeakRefrence
虚 :不能保证通过引用获得对象
不可以
参考:
可从虚拟机启动-加载-链接-初始化来讲整个过程
Call run thread 线程池
get方法阻塞 直到获取返回结果
Lock实现原理Aqs cas
实现过程
先一个CAS获取等待
AQS利用CAS原子操作维护自身的状态,结合LockSupport对线程进行阻塞和唤醒从而实现更为灵活的同步操作。
偏向锁是指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。
轻量级锁是指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
重量级锁是指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让其他申请的线程进入阻塞,性能降低。
观察者模式代理模式单例模式,有五种写法,可以参考文章单例模式的五种实现方式可以考Spring中使用了哪些设计模式
分布式事务的控制。分布式锁如何设计。分布式session如何设计。dubbo的组件有哪些,各有什么作用。zookeeper的负载均衡算法有哪些。dubbo是如何利用接口就可以通信的。
redis和memcached的区别。redis支持哪些数据结构。redis是单线程的么,所有的工作都是单线程么。redis如何存储一个String的。redis的部署方式,主从,集群。redis的哨兵模式,一个key值如何在redis集群中找到存储在哪里。redis持久化策略。
SpringMVC的Controller是如何将参数和前端传来的数据一一对应的。Mybatis如何找到指定的Mapper的,如何完成查询的。Quartz是如何完成定时任务的。自定义注解的实现。Spring使用了哪些设计模式。Spring的IOC有什么优势。Spring如何维护它拥有的bean。一些较新的东西JDK8的新特性,流的概念及优势,为什么有这种优势。区块链了解如何设计双11交易总额面板,要做到高并发高可用
作者:关耳金名
链接:https://www.nowcoder.com/discuss/25118?type=2&order=3&pos=7&page=1
来源:牛客网
一面:
1.hashCode和equals方法的区别与联系??好像不太对
hashCode可以用来区分对象的,equals方法用来判断两个对象所存的值是否相同,如果是Object类型则比较的是地址。
如果两个对象hashcode相同那么他们的equals应返回true
2.HashMap的底层实现
哈希表采用链地址法解决哈希冲突,采用的是数组加上链表,在java8中当链表后缀数量大于阈值8时会转为红黑树//
3.AOP的思想,Spring注入的方式
面向切面,面向接口 比如日志处理
Spring注入方式 注解 配置 (构造 设置) javabean方式//
4.linux中文件权限控制
chmod指令 +3个数字+文件名 一个代表用户,第二个表示组,第三个为其他用户
5.MySql数据库优化方式
SQL语句 比如 采用varchar 规定字段长度 尽量不使用自定义函数
数据库优化 适当建立索引6个
架构优化 主从分离 (读写分离)当表的一行特别大,数据量特别多时
6.介绍快速排序
选取一个中柚,大于它的划分到左边小于的划分到右边 然后在递归的划分子区间
7.版本控制工具git的branch
git ,本地仓库,远程仓库,分支概念,master,feature,bughix,常用命令,冲突的处理
8. 评价自己优缺点,业余爱好,最近在看什么书
二面:
1.能够实习的时间
2. jvm堆栈静态区分别存储的内容
3.创建线程的4种方式
实现runable 的run方法
实现callable 的call方法
继承thread 实现了run方法 缺点:多重继承
public void run() {
if (target != null) {
target.run();
}
}
总结可返回的必须实现Callble,
线程池的实现
Excutors提供了一系列的工厂方法,用于创建线程池,返回结果都实现ExcutorService
ExcutorService提供了一个submit()方法,如果后台没有执行完则会Feture.get()方法会阻塞直到执行完。
4.sleep和wait的区别
sleep会使当前线程进入休眠状态不会释放锁,但可能发生中断异常 ,是Thread对象的方法
事实上,当传入一个Runnable target参数给Thread后,Thread的run()方法就会调用target.run()
需要try,catch处理InterrupptyExpection异常
wait使当前线程进入等待池,线程状态会进行改变,会释放它所拥有的锁 ,使用的时候对象肯定在同步代码块
5.对象的创建
clone方法,复制,应该是复制地址
Object的toString是类名@hashcode10进制
hr面:
自我介绍,我个人傻逼。。还说了一堆技术。。hr不应该说技术的
除了京东还有关注哪些公司的招聘,有offer嘛
为什么选择京东
介绍一下家庭和对工作地点的倾向
finalize返回Throwable
作者:Tars
链接:https://www.nowcoder.com/discuss/25094?type=2&order=3&pos=10&page=1
来源:牛客网
一面:
1.各种Web认证
这个不太会,不知道HTTP认证,权限认证算不算
2.MyBatis 的使用,多个查询能否用一个连接
3.服务器端Session的保存
4.Filter什么情况用到了
5.用第三方数据验证怎么做
6.联合索引ABC可以索引
7.Java的线程状态
5种线程状态
8.sleep和wait的区别
二面:
1.多线程框架讲一讲
2.转换成long的方法
3.JVM的类加载机制,双亲委派、破坏双亲委派机制
ClassLoder ExternClassLoder 子类加载 子类找不到的父类加载 找不到再返回//
4.MySQL的默认事务隔离级别,有什么用
repeateble 可重复读 保证多次执行结果一致
5.Spring的加载流程,Spring的源码中Bean的构造的流程
6.Redis的一致性哈希算法
7.讲一讲锁,volatile、synchronized、Lock
8.有没有用到过Linux的底层一点命令,查看堆栈之类的
HR面:
1.简单进行下自我介绍?
2.感觉最有成就的事情?
3.说一下自己优点和缺点?
4.为什么想来杭州?
5.有没有女朋友?
作者:菜少语
链接:https://www.nowcoder.com/discuss/25026?type=2&order=3&pos=16&page=1
来源:牛客网
今天上午参加的腾讯面试,在艾丽华酒店,进去后发现人好多,扫码签到还是很方便的
说一下面试吧
首先自我介绍
问了java的集合类hashMap,hashTable,TreeMap的特点及区别
都实现了map接口 hashMap和TreeMap不是线程安全的
hashtable是线程安全的 给予红黑树实现
TreeMap可以用来做什么,与AVL树的区别(当时没有答上)
数据按键排序都是BST树 保证数据有序
快速排序,java代码实现(只记得大概原理)
然后开始问java web,自己用的tomcat容器
问我们的项目请求方式,http
http与https的区别
服务器用的是什么
个人博客上写一些什么(写一些关于spring boot,hadoop等学习笔记)
问了hadoop包括什么,大概介绍一下
问进程与线程的区别
大概也就这些
问面试官我哪些需要提高,说基础需要提高
做项目和做技术不一样,做项目有很多方法,做技术不是,最后说还年轻!
作者:txlan
链接:https://www.nowcoder.com/discuss/25018?type=2&order=3&pos=17&page=1
来源:牛客网
坐标成都,某985渣本科生。之前也有在官网投简历,没做笔试题,GG。后来成都研究院来学校宣讲会,现场投简历。并在两天后收到了面试电话。京东好像有两面技术面加一面hr面。下面是面试情况。
一面:
一面面试官听声音挺年轻的,一来就先介绍京东成都研究院的情况。之后也就开始了正式的提问。
1.首先问的就是JVM的内存分配以及GC机制,这个都是老生常谈了,网上答案一大推,自己理解下也就好了。
2.Spring MVC原理、
3.HashMap的底层实现、各种线程安全的HashMap以及他们的实现方式(ConcurrentHashMap)
4.数据库的话有写sql语句、数据库的优化以及索引在什么情况下使用
5.由SpringIoc引申出来的反射、事务的隔离级别。
6.还有一个最重要的就是京东比较重视多线程,这点在二面时体现的尤为明显。所以打算面京东的同学可以多看看多线程方面的知识
二面:
一面过了两天京东打电话确认能否实习六个月并预约了第二天早上的现场面试。
第二天一早便各种倒公交来到了成都研究院,工作环境感觉一般般,给人一种阴凉的感觉。。。。。。在会议室登了不到十分钟便被叫去了二面,面试也都是这些套路。
1.一来就JVM的内存分配,
2、SpringMVC的请求过程、
3.HTTP的三次握手、
4.HashMap的冲突解决机制、
5.项目情况并手写了一个登陆时的Controller代码。
6.二面的时候问的最多的应该就是线程了,线程的状态、锁、什么情况下线程阻塞等等等等等等,由于对线程这块了解的并不是很多所以只能看些面试官在面前装逼。。。。。
hr面:
由于二面的糟糕表现,hr面估计是没了。
总的来说,我这次的面试经验就是对于想进京东的童鞋,理解好多线程开发会很加分,真的。
今天下午一点正准备睡觉,来了一个北京的电话,京东面试(本来安排我今天下午去北京现场面试的,我申请去不了,就电面了)。我迷迷糊糊的立马有精神了,准备面试。
开始
1.java的基本类型
8种基本类型 8种包装类
2.final都是怎么用?
加载方法在防止子类继承 加载类上也防止继承 加载变量上不可以修改是常量
3.throws throw 怎么用?
throws用在方法上检测可能抛出的异常 throw主动抛出异常
4.hashmap原理?为什么每次扩容都是扩大一倍为什么不是三倍四倍?
//
5.二叉树的遍历
前中后非递归 层次使用队列
6.快排
2种方式
7.堆排,如果从若干数中找最大N个数用最大堆还是最小堆?
最大堆 每次取堆顶 删除 他会自己调整
8.项目主要做什么?NAT穿越怎么实现?
9.了解Redis吗?
10.数据库了解吗?
11用过什么框架?
最后我提问:
我:您是什么部门,在哪个地方?
面试官:我是在北京北辰的AI部门。
我:我想了解一下具体都会有哪些工作?
面试官:自然语言处理,爬虫,大数据处理等。
我:我如果有幸去实习具体会做什么工作?
面试官:具体看你的爱好,还有我们这边的缺口。
结束
面试官应该在上班的路上面试的我,感觉比较随意~
你们的面试官怎么样?
//
1.接口和抽象类的区别
2.实现多线程的有哪几种方法
3.观察者模式
4.已排序好的10个记录如何快速查找关键字
//
1.extends 和super 区别
2.两种单利模式的区别
3.抽象基类和接口的各自主要场景
4.int和Integer的区别
5.链表合并
6.a,b两个文件各放50亿个url 每个url64B 内存限制4GB 请找出相同url
//
1.String 和String Buffer区别
2.HASHMAP和Hashtable区别
//
1.&和&&的区别
2.Collection和Collections的区别
3.简述设计模式
4.介绍Spring mvc ioc aop
5.Java调用存储过程的是
//
static 作用
JSP和Servlet区别 联系
数据库连接池的工作机制
多线程同步的工作机制
多线程同步有哪几种实现方法
forward和redirect的区别
Overload和Override的区别
应聘一般要经过笔试和面试。
作为一个技术人员,特别是刚出道的,笔试的成绩是比较重要。
以下是我经过几次笔试总结的一些经验教训。
一般来说,试题会分为三个部分,
Java基础、数据库基础和综合题。
首先是Java基础,这个很简单,也就是考考你对Java语言本身的理解,
包括语法,类库的使用等。
有选择题,也会有写代码题。写代码的时候认真仔细就是了。
基础题答案一般都比较死,所以尽量不要错。
在这,出一道我遇到的题考考大家,
Java编程:把American,Japan,China,France,Brazil按英文字母排序。说说思路就行了:)
其次是数据库。
准确的说,考的不是数据库,而是SQL语句。
一般题型是,给两三个表,然后让你根据需求写SQL。
最普通的就是学生表、选课表和成绩表。
要掌握的就是连接查询,还有就是一些函数(建表、表操作等就不说了哈)。
其实这些都相当简单,但是往往被新手忽略。
我就遭过,因为有半年没写过SQL了,连接查询搞忘完了,
有两次笔试都空起,结果可想而知。这些是必备技术,千万不能空起啊!
然后是综合题。
之所以说是综合题,是因为包含的内容比较多,一般都是主观题。
这里,人家是想看看你对Java高级技术以及周边技术的了解程度和运用能力,
说白了,就是考概念和考应用题。
这里说的Java高级技术,也就是J2EE架构中的技术,
这些不会的话,人家是不得要你的。
如果你会一些流行的技术框架,那就更好了。
所谓Java周边技术,包括HTTP,HTML,XML,UML,JavaScript,CSS等,
要求一般不是很高,要了解,比如让你用HTML写个表单你要会。
关于刚才提到的技术或者框架,希望要了解其工作的原理和机制,
一般要考,比如让你说说Struts的MVC。关于应用题,可能出一道网络应用来考。
以上就是我笔试的经验,一般是这样,不过我也遇到过变态的。
一次笔试,就被彻底甩翻,C/C++、数据库、Java技术、Shell编程、网络协议、
Unix、软件工程全部上了。
如果笔试做的好,那就成功大半了,不过不要轻视面试哦!
关于面试技巧,网上太多了,我就不多说。作为技术人员,虽说以技术为主,
但沟通能力同样重要,面试时要主动,表达要清楚,要微笑,要诚实,要稳
指示点:
是java的基础,基础好的话很容易进入公司,一般都会问
String,StringBuffer,StringBudilder区别
ArrayList,vector 等的区别
hashMap,hashTable 的区别
多线程的实现方式和方法了
传参数方面的 考传的是本身还是副本 如 a(String value);
a方法的value参数是传本身还是副本
其它的问题都是最基本的,基本能答上来
还有就是框架的知识了,比如spring 依赖注入,事务深入点的话 拦截器等
考其它框架的话 基本上问的都是比较基础的 难的话很少问到
db方面的话 简单考下你的sql , 可能会写几个表 要查什么让你写sql
主要考 多表连接查询,分组,分组后的查询,排序,取最大最小之类的 看你sql熟练否
Java NIO 和 JVM 底层就是最好的例子设计模式
为了给你一个大致的了解,下面列出这份 Java 面试问题列表包含的主题:
多线程,并发及线程基础
数据类型转换的基本原则
垃圾回收(GC)
Java 集合框架
数组
字符串
GOF 设计模式
SOLID (单一功能、开闭原则、里氏替换、接口隔离以及依赖反转)设计原则
抽象类与接口
Java 基础,如 equals 和 hashcode
泛型与枚举
Java IO 与 NIO
常用网络协议
Java 中的数据结构和算法
正则表达式
JVM 底层
Java 最佳实践
JDBC
Date, Time 与 Calendar
Java 处理 XML
JUnit
编程
JAVA中的4个核心技术
Java虚拟机
类装载的体系结构
JAVA class文件 类是一个直接继承Object类的子类。这个类没有构造函数,它们的对象是被Java虚拟机通过类加载器加载的。我们大多数人可能没有直接使用过它,但我认为它是一个重要的做反射的类。它自JDK 1.0开始引入
JAVA api
网址https://jingyan.baidu.com/article/f3e34a1297a9a5f5eb65353c.html
1.Java的HashMap是如何工作的?
HashMap是一个针对数据结构的键值,每个键都会有相应的值,关键是识别这样的值。
HashMap 基于 hashing 原理,我们通过 put ()和 get ()方法储存和获取对象。
当我们将键值对传递给 put ()方法时,它调用键对象的 hashCode ()方法来计算 hashcode,
让后找到 bucket 位置来储存值对象。
当获取对象时,通过键对象的 equals ()方法找到正确的键值对,然后返回值对象。
HashMap 使用 LinkedList 来解决碰撞问题,当发生碰撞了,
对象将会储存在 LinkedList 的下一个节点中。
HashMap 在每个 LinkedList 节点中储存键值对对象。
2.什么是快速失败的故障安全迭代器?
快速失败的Java迭代器可能会引发ConcurrentModifcationException在底层集合迭代过程中被修改。
故障安全作为发生在实例中的一个副本迭代是不会抛出任何异常的。
快速失败的故障安全范例定义了当遭遇故障时系统是如何反应的。
例如,用于失败的快速迭代器ArrayList和用于故障安全的迭代器ConcurrentHashMap。
3.Java BlockingQueue是什么?
Java BlockingQueue是一个并发集合util包的一部分。BlockingQueue队列是一种支持操作,
它等待元素变得可用时来检索,同样等待空间可用时来存储元素。
4.什么时候使用ConcurrentHashMap?
在问题2中我们看到ConcurrentHashMap被作为故障安全迭代器的一个实例,
它允许完整的并发检索和更新。当有大量的并发更新时,ConcurrentHashMap此时可以被使用。
这非常类似于Hashtable,但ConcurrentHashMap不锁定整个表来提供并发,
所以从这点上ConcurrentHashMap的性能似乎更好一些。
所以当有大量更新时ConcurrentHashMap应该被使用。
5.哪一个List实现了最快插入?
LinkedList和ArrayList是另个不同变量列表的实现。
ArrayList的优势在于动态的增长数组,非常适合初始时总长度未知的情况下使用。
LinkedList的优势在于在中间位置插入和删除操作,速度是最快的。
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的
get,remove,insert方法在LinkedList的首部或尾部。
这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
ArrayList实现了可变大小的数组。它允许所有元素,包括null。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。
这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。
当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加
ArrayList的容量以提高插入效率。
6.Iterator和ListIterator的区别
ListIterator有add()方法,可以向List中添加对象,而Iterator不能。
ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改。
7.什么是CopyOnWriteArrayList,它与ArrayList有何不同?
CopyOnWriteArrayList是ArrayList的一个线程安全的变体,其中所有可变操作(add、set等等)都是通过对底层数组进行一次新的复制来实现的。相比较于ArrayList它的写操作要慢一些,因为它需要实例的快照。
CopyOnWriteArrayList中写操作需要大面积复制数组,所以性能肯定很差,但是读操作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处理只是在写完后通过一个简单的"="将引用指向新的数组对象上来,这个几乎不需要时间,这样读操作就很快很安全,适合在多线程里使用,绝对不会发生ConcurrentModificationException ,因此CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。
8.迭代器和枚举之间的区别
如果面试官问这个问题,那么他的意图一定是让你区分Iterator不同于Enumeration的两个方面:
Iterator允许移除从底层集合的元素。
Iterator的方法名是标准化的。
9.Hashmap如何同步?
当我们需要一个同步的HashMap时,有两种选择:
使用Collections.synchronizedMap(..)来同步HashMap。
使用ConcurrentHashMap的
这两个选项之间的首选是使用ConcurrentHashMap,这是因为我们不需要锁定整个对象,
以及通过ConcurrentHashMap分区地图来获得锁。
10.IdentityHashMap和HashMap的区别
IdentityHashMap是Map接口的实现。
不同于HashMap的,这里采用参考平等。
在HashMap中如果两个元素是相等的,则key1.equals(key2)
在IdentityHashMap中如果两个元素是相等的,则key1 == key2
线程安全的集合:
concurrent包下
ArrayBlockingQueue
LinkedBlockingDeque
LinkedBlockingQueue
PriorityBlockingQueue
ConcurrentHashMap
ConcurrentLinkedQueue
ConcurrentLinkedDeque
ConcurrentSkipListMap
ConcurrentSkipListSet
CopyOnWriteArrayList
CopyOnWriteArraySet
DelayQueue
LinkedTransferQueue
网址:http://www.cnblogs.com/ijavanese/p/3778688.html
怎么样实现集合的线程安全
1.采用锁保护共享数据结构
2.高效的映射表、集合、队列
Java.util.concurrent包提供了映射表、有序表和队列的高效实现。
这些集合使用复杂的算法,通过允许并发地访问数据结构的不同部分来使竞争极小化。
集合返回弱一致性的迭代器。这意味着迭代器不一定能反映出它们被构造之后的所有的修改
,但是,它们不会被同一值返回两次,也不会抛出ConcurrentModificationException异常。
与之形成对照的是,集合如果在迭代器构造之后发生改变,java.util包中的迭代器将抛出ConcurrentModificationException异常。
并发的散列映射表,可高效地支持大量的读者和一定数量的写者。默认情况下,假定可以有多达16个写者线程同时执行。可以有更多的写者线程,但是,如果同一时间多于16个,
其他线程将暂时被阻塞。可以指定更大数目的构造器,然而,恐怕没有这种必要。
2>写数组的拷贝
CopyOnWriteArrayList和CopyOnWriteArraySet是线程安全的集合,
其中所有的修改线程对底层数组进行复制。如果在集合上进行迭代的线程数超过修改线程数,
这样的安排是很有用的。当构建一个迭代器的时候,它包含一个对当前数组的引用。
如果数组后来被修改了,迭代器仍然引用旧数组,
但是,集合的数组已经被替换了。因此,旧的迭代器拥有一致的试图,访问它无须任何同步开销。
3>较早的线程安全集合
从Java的初始版本开始,Vector和Hashtable类就提供了线程安全的动态数组和散列表的实现。
现在这些类被弃用了,取而代之的是ArrayList和HashMap类。
这些类不是线程安全的,而集合库中提供了不同的机制。
任何集合类通过使用同步包装器变成线程安全的:
结果集合的方法使用锁加以保护,提供了线程的安全访问。
应该确保没有任何线程通过原始的非同步方法访问数据结构。
最便利的方法是确保不保存任何指向原始对象的引用,
简单地构造一个集合并立即传递给包装器
最好使用java.util.concurrent包中定义的集合,不适用同步包装器中的。
特别是,加入他们访问的是不同的桶,由于ConcurrentHashMap已经精心地实现了,
多线程可以访问它们而且不会彼此阻塞。有一个例外是经常被修改的数组列表。
在那种情况下,同步的ArrayList可以胜过CopyOnWriteArrayList。
注:HashTable与ConcurrentHashMap的比较?
相同点: Hashtable 和 ConcurrentHashMap都是线程安全的,可以在多线程环境中运行; key跟value都不能是null
区别: 两者主要是性能上的差异,Hashtable的所有操作都会锁住整个对象,虽然能够保证线程安全,但是性能较差;
ConcurrentHashMap内部使用Segment数组,每个Segment类似于Hashtable,
在“写”线程或者部分特殊的“读”线程中锁住的是某个Segment对象,其它的线程能够并发执行其它的Segment对象。
一、阿里巴巴面试
第一个:阿里面试都问什么? :(55分钟)
1、开发中Java用了比较多的数据结构有哪些?
2谈谈你对HashMap的理解,底层原理的基本实现,HashMap怎么解决碰撞问题的?
这些数据结构中是线程安全的吗?假如你回答HashMap是线程安全的,接着问你有没有线程安全的map,接下来问了conurren包。
3、对JVM熟不熟悉?简单说说类加载过程,里面执行的哪些操作?问了GC和内存管理,平时在tomect里面有没有进行过相关的配置
4、然后问了http协议,get和post的基本区别,接着tcp/ip协议,三次握手,窗口滑动机制。
5、开发中用了那些数据库?回答mysql,储存引擎有哪些?然后问了我悲观锁和乐观锁问题使用场景、分布式集群实现的原理。
6、然后问了我springmvc和mybatis的工作原理,有没有看过底层源码?
二、京东金融面试
1、Dubbo超时重试;Dubbo超时时间设置
2、如何保障请求执行顺序
3、分布式事物与分布式锁(扣款不要出现负数)
4、分布式session设置
5、执行某操作,前50次成功,第51次失败a全部回滚b前50次提交第51次抛异常,ab场景分别如何设置Spring(传播性)
6、Zookeeper有哪些用
7、JVM内存模型
8、数据库垂直和水平拆分
9、MyBatis如何分页;如何设置缓存;MySQL分页
10、熟悉IO么?与NIO的区别,阻塞与非阻塞的区别
11、分布式session一致性
12、分布式接口的幂等性设计「不能重复扣款」
三、美团面试
1、最近做的比较熟悉的项目是哪个?画一下项目技术架构图
2、JVM老年代和新生代的比例?
3、YGC和FGC发生的具体场景
4、jstack,jmap,jutil分别的意义?如何线上排查JVM的相关问题?
5、线程池的构造类的方法的5个参数的具体意义?
6、单机上一个线程池正在处理服务如果忽然断电该怎么办?(正在处理和阻塞队列里的请求怎么处理)?
7、使用无界阻塞队列会出现什么问题?
8、接口如何处理重复请求?
9、具体处理方案是什么?
10、如何保证共享变量修改时的原子性?
11、设计一个对外服务的接口实现类,在1,2,3这三个主机(对应不同IP)上实现负载均衡和顺序轮询机制(考虑并发)
四、滴滴面试
1、自我介绍,技术特点
2、兴趣是什么,优势是什么
3、jvm,jre以及jdk三者之间的关系?
4、Dubbo的底层原理,Zookeeper是什么
5、cincurrentMap的机制;TreeMap;Volatil关键字
6、快速排序;广度优先搜索(队列实现)
7、缓存的雪崩以及穿透的理解?
8、HashMap的key可以重复吗?
9、synchronized和lock的区别?
10.开发一个大型网站你会考虑哪些问题?