java-五十一天---面试题

1  CAS模型和AQS

1. CAS:
CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该 位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前 值。)CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。”
通常将 CAS 用于同步的方式是从地址 V 读取值 A,执行多步计算来获得新 值 B,然后使用 CAS 将 V 的值从 A 改为 B。如果 V 处的值尚未同时更改,则 CAS 操作成功。
类似于 CAS 的指令允许算法执行读-修改-写操作,而无需害怕其他线程同时 修改变量,因为如果其他线程修改变量,那么 CAS 会检测它(并失败),算法 可以对该操作重新计算。
2.非阻塞算法
如果每个线程在其他线程任意延迟(或甚至失败)时都将持续进行操作,就可以说该算法是无等待的。与此形成对比的是,无锁定算法要求仅 某个线程 总是执行操作。(无等待的另一种定义是保证每个线程在其有限的步骤中正确计 算自己的操作,而不管其他线程的操作、计时、交叉或速度。

2  cvte一面

1.Spring IoC和aop?
2.数据库mysql的索引原理?b+树索引的缺点?
3.线程池的原理?线程池的参数?
4.Tcp的syn 的问题?
5.线程安全问题?hashmap的死锁
6.Spring boot? 的使用

3 hashMap和ConcurrentHashMap

ConcurrentHashMap引入了分段锁的机制,可以看做是将一个大的Map分为多个线程安全的HashTable。
在ConcurrentHashMap中,就是把Map分为N个Segment,put和get的时候。put和get的时候,都是先根据key.hashCode()算出应该放在哪个Segment中;

ConcurrentHashMap中默认是把segments初始化为长度为16的数组。 
根据ConcurrentHashMap.segmentFor的算法,3、4对应的Segment都是segments[1],7对应的Segment是segments[12]。
(1)Thread1和Thread2先后进入Segment.put方法时,Thread1会首先获取到锁,可以进入,而Thread2则会阻塞在锁上:

(2)切换到Thread3,也走到Segment.put方法,因为7所存储的Segment和3、4不同,因此,不会阻塞在lock():

以上就是ConcurrentHashMap的工作机制,通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。

 

4   Http和Https协议

Http协议我们就不多说了。这篇主要就是简单的提提Https协议。Https协议是基于Http协议开发的。它是一个安全的通信通道。用于客户端和服务器端进行信息的交换。它主要使用了安全套接字层(SSL)来来进行信息的交换的。简单的说它就是Http协议的安全版本。
 
Http和Https的区别:
1、Https协议是需要向CA申请证书的,是需要交费的。就是花钱买安全嘛,理解。
2、Http协议在传输的时候使用的都是超文本传输,信息是明文的,但是Https则是使用的是具有安全性的SSL加密的传输协议。
3、Http协议和Https协议使用的是完全不一样的连接方式,连端口号都不一样。 Http使用的端口号是80而Https使用的端口号是443。
4、Http协议的连接是无状态的,而Https则相对来说更安全一点。
 
 
总结一下:Https协议使用了安全套接字层(SSL)和Http协议构建的可进行加密传输等行为的协议。

5  interface和abstract

1.interface被继承时用的关键字是extends,而且可以同时extends多个interface,而abstract class被继承时用的关键字是extends,而且只能同时extends一个abstract class。
2.interface内定义的方法都是public的,而abstract class内的则不一定。
3.interface内定义的成员对象都是static & final的,而abstract class不是(一定不能是final)
4.interface的方法不能有默认实现,只有一个申明,而abstract class内申明abstract的方法不能有实现,非申明abstract的方法可以有默认实现。
5.interface被implements时,所有方法都必须被实现,必须申明是public的,而abstract class被extends时只有abstract的方法才必须被实现,别的有默认实现的直接被继承过来。
注:不能创建接口或抽象类的实例。

 

6   今日头条一面

1.上来直接让你做题,http://blog.csdn.net/jingsuwen1/article/details/51681249  (参考看看)
2.有没有操作系统这门课?什么是线程?什么是进程? 进程间的通信方式有哪些?
我们专业没有开这门课,每打开一个应用程序就是一个进程,线程是依赖进程存在的,是进程中的最小执行单元
3.tcp和udp的协议区别?udp 每次传输数据,数据包大小是多少?(1472个字节)为什么tcp协议是安全的?因为面向连接!为什么面向连接就安全??因为将数据写入通道!为什么写入通道就安全?呃呃呃,事后才知道,他应该是想问你,三次握手四次挥手。(尴尬。。。),最后查了下,还有拥塞控制,流量控制,数据排序,确认和重传机制。
4.sql优化,你知道哪些?数据库怎么存储数据的?数据库除了增删改查你还会什么?数据库索引原理,你知道吗?平常看数据库的什么书?...
在查询表的时候,指定某个列的查询效率比count(*)的查询效率高,为什么?因为count(*)是全表扫描。
5.创建线程有几种方式?4种,(Runnable,Callable,Thread,线程池)你了解线程池吗?了解一点,当时不知道脑子抽风,说成了连接池。。。还c3p0....真想抽自己几巴掌,,,
6.你知道哪些Map集合?HashMap,TreeMap,HashTable,LinkedHashMap,ConcurrenthashMap,说一下HashMap和TreeMap的区别?hanshMapd底层是hash表结构,..打断,那Treemap底层原理?TreeMap使用什么数据结构实现的?,当时说了二叉树,不对,你下去查一下....
7.事务你了解吗?事务的特性是什么?
嗯,了解。ACID 巴拉巴拉说了一遍,,讲一下事务的隔离级别。讲到可重复读的时候,在一个事务开启的时候,不允许进行修改(即update和delete操作),打断...为什么不能进行修改操作?晕。。。
8.谈了一下项目,有什么功能,购物车怎么实现的?
   事后,面试官建议多看看数据库和操作系统的书,先不用着急,离找工作还有一段时间.不用说,肯定凉了。

7   京东

  1. java中的面向对象思想?
  2. 反射?怎么理解反射?
  3. 对象的引用?强软弱虚?应用哪些场景?
  4. String a= “hello world”; String b = a; String c = new String(“hello world”);

       a==b; (true)c==a;(false)

  1. synchronized 和 autoInteger 的区别?
  2. CAS的实现? CAS如何保证原子性?

CAS通过调用JNI的代码实现的。JNI:Java Native Interface为JAVA本地调用,允许java调用其他语言。而compareAndSwapInt就是借助C来调用CPU底层指令实现的。下面从分析比较常用的CPU(intel x86)来解释CAS的实现原理。

扫描二维码关注公众号,回复: 8970487 查看本文章

Unsafe类中的那个本地方法在openjdk中依次调用的c++代码为:unsafe.cpp,atomic.cpp和atomicwindowsx86.inline.hpp。这个本地方法的最终实现在openjdk的如下位置:openjdk-7-fcs-src-b147-27jun2011\openjdk\hotspot\src\oscpu\windowsx86\vm\ atomicwindowsx86.inline.hpp

  1. 解决 CAS的ABA问题,

总结: AtomicStampedReference和 AtomicMarkableReference是通过版本号(时间戳)来解决ABA问题的,我们也可以使用版本号(verison)来解决ABA。

即乐观锁每次在执行数据的修改操作时,都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行+1操作,否则就执行失败。

  1. Volatile关键字的了解?原子性?指令重排性?
  2. HashMap的实现原理?和HashTable的区别?

   (1)继承的父类不同

 

      Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。

   (2)线程安全性不同

      javadoc中关于hashmap的一段描述如下:此实现不是同步的。如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。  Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省情况下是非Synchronize的。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步,但使用HashMap时就必须要自己增加同步处理。(结构上的修改是指添加或删除一个或多个映射关系的任何操作;仅改变与实例已经包含的键关联的值不是结构上的修改。)这一般通过对自然封装该映射的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedMap 方法来“包装”该映射。最好在创建时完成这一操作,以防止对映射进行意外的非同步访问,如下所示:

  Map m = Collections.synchronizedMap(new HashMap(...));

 

 (3)是否提供contains方法

HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。

      Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。

 

 

   (4)key和value是否允许null值

 其中key和value都是对象,并且不能包含重复key,但可以包含重复的value。

      通过上面的ContainsKey方法和ContainsValue的源码我们可以很明显的看出:

      Hashtable中,key和value都不允许出现null值。但是如果在Hashtable中有类似put(null,null)的操作,编译同样可以通过,因为key和value都是Object类型,但运行时会抛出NullPointerException异常,这是JDK的规范规定的。

HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,可能是 HashMap中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。

     (5)两个遍历方式的内部实现上不同

      Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

     (6)hash值不同

      哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

      hashCode是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值。

      Hashtable计算hash值,直接用key的hashCode(),而HashMap重新计算了key的hash值,Hashtable在求hash值对应的位置索引时,用取模运算,而HashMap在求位置索引时,则用与运算,且这里一般先用hash&0x7FFFFFFF后,再对length取模,&0x7FFFFFFF的目的是为了将负的hash值转化为正值,因为hash值有可能为负数,而&0x7FFFFFFF后,只有符号外改变,而后面的位都不变。

      (7)内部实现使用的数组初始化和扩容方式不同

      HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。

      Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。

      Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。

  1. concurrentHashMap():分段锁?1.7,1.8 CAS和Synchronized    红黑树?
  2. NIO 和IO? 远程调用时候要解决的问题? RPC协议?
  3. TCP粘包,拆包?
  4. 如何避免用户多次提交???(重定向)
  5. Linux命令?
  6. Sql注入?PreparedStatement(预编译)
  7. Mysql的理解?存储引擎?数据结构,事务?索引失效?

8  网易一面

1.Spring 为什么是轻量级的?
2.Spring的bean的注入过程?
3.Spring的IoC和aop的过程?
4.有没有写过aop的?
AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
5.Spring boot 了解过吗?了解过什么设计模式?
6.看过什么源码?
7.学习java过程中?遇到什么让你难忘的困难吗?
8.项目怎么部署的?说一下HashMap的实现?
9.MQ了解过吗?
10.Redis了解过吗?
11.怎么解决秒杀功能?
12.分布式锁怎么实现的?(Zookeeper)中实现过?
13.Lock? 什么是可重入锁?默认是非公平的?为什么?
 *可重入锁
 *所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的
 *synchronized 和   ReentrantLock 都是可重入锁
 *可重入锁的意义在于防止死锁
 *实现原理实现是通过为每个锁关联一个请求计数和一个占有它的线程。
 *当计数为0时,认为锁是未被占有的。线程请求一个未被占有的锁时,jvm讲记录锁的占有者,并且讲请求计数器置为1 。
 *如果同一个线程再次请求这个锁,计数将递增;
 *每次占用线程退出同步块,计数器值将递减。直到计数器为0,锁被释放。
14.线程池介绍一下?
15. 非公平锁性能高于公平锁性能的原因:
在恢复一个被挂起的线程与该线程真正运行之间存在着严重的延迟。

假设线程A持有一个锁,并且线程B请求这个锁。由于锁被A持有,因此B将被挂起。当A释放锁时,B将被唤醒,因此B会再次尝试获取这个锁。与此同时,如果线程C也请求这个锁,那么C很可能会在B被完全唤醒之前获得、使用以及释放这个锁。这样就是一种双赢的局面:B获得锁的时刻并没有推迟,C更早的获得了锁,并且吞吐量也提高了。
当持有锁的时间相对较长或者请求锁的平均时间间隔较长,应该使用公平锁。在这些情况下,插队带来的吞吐量提升(当锁处于可用状态时,线程却还处于被唤醒的过程中)可能不会出现。

1.java内存模型?javaGC机制?
2.类加载过程
3.冒泡排序和快速排序有什么区别
4.数据库使用的什么?
5.聚集索引?和非聚集索引的局别?
6.多线程有使用过吗?线程池的参数?
7.ThreadLocal有使用过吗?详细介绍一下。
8.spring aop的两种实现方式?jdk动态代理,CGLB代理的区别
9.Spring的启动过程?XML文件中是怎么配置的?
10.逻辑外键? 
11.Xss()xss (跨站脚本攻击)(了解一下)
跨站脚本攻击(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
12.线程池的参数??

9 西山居

1.有没有对项目做过测试?
2.java的垃圾回收机制?
3.堆和栈中的对象有什么区别?
4.mysql怎么用的? 你用的mysql是哪个版本的?存储过程用过没有?
5.mysql触发器了解过吗?
6.怎么解决秒杀功能?
7.一万个人来访问数据库怎么办?(缓存机制)
8.用户管理是你做的吗?你负责的是哪一个模块?
9.你这个项目(七牛云)上传的头像?
10.怎么解决机器人注册问题?
11.是选择Git作为版本控制的吗?为什么要选择git?
12.拦截器和过滤器的区别?
13.Spring的声明式事务管理? 编程式事务?
14.Spring aop 的两种代理,jdk和cglib,默认是那种?(jdk)
15.类加载器?类加载顺序?
16.http:请求方式,post和get?

10  面试

1.组合索引? 为什么会失效?
2.索引的底层是什么数据结构?
3.InnoDB 存储引擎的数据结构,为什么要这样存储?
4,Spring 你怎么理解?,aop的两种代理方式有什么区别?
5.怎么直接设置aop 的代理方式?
6.redis,如何让他的数据和数据库中的数据保持同步?
7.Mybatis 和Hibernate的区别?
8.你这个项目的让你印象深刻的一点?
------------------------------------------------------
java内存模型?gc机制?了解常用的垃圾收集器?


发布了78 篇原创文章 · 获赞 83 · 访问量 9261

猜你喜欢

转载自blog.csdn.net/weixin_41847891/article/details/92850270