JavaEE面试经验分享

微信公众号:javafirst

面试前话

     一大早起来到在科技一路与高新六路交汇处西安*晟公司开始面试了,来到后前台哥们直接让我把我带到此公司的一个接待室.不一会就来了个中年男性. 看着挺严肃, 当时我在心想没有笔试环节吗? 很庆幸还真没有笔试环节. 其实我挺反感做笔试题的没意思还是面试聊天比较好。

.
面试环节( 面试全靠嘴皮子功夫)
      首先和面试官闲聊几句,大概介绍下自己(自然自信点). 前期面试官问了我一些上一家公司的事,在这里就不多说了啊.。把面试中的问题整理了下,和大家一起分享~


1.什么是HTTP协议
       HTTP是超文本传输协议, 是一个客户端和服务器端请求和应答的标准。底层使用TCP,客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。


2.说说你对java集合体系的理解.
      Java集合是java提供的一个工具包,全部继承自java.util.*。主要包括两大接口Collection接口和Map接口以及相关的工具类(Iterator迭代器接口、Enumeration枚举类、Arrays和Colletions)。

①Collection是一个接口,包含List列表和Set集合。其中List是有序的队列,元素值可以重复,索引从0开始,实现类有LinkedList,ArrayList,Vector;而Set是一个不允许有重复元素的集合,Set的实现类有HashSet和TreeSet。HashSet依赖于HashMap,它实际上是通过HashMap实现的;TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。

②Map是一个映射接口,通过key-value键值对实现。实现类有HashMap,TreeMap,Hashtable。

③Iterator是遍历集合的工具,Enumeration也是遍历集合,但它的的功能要比Iterator少,只能在Hashtable, Vector, Stack中使用。

④Arrays和`Collections是操作数组、集合的两个工具类。

下面是具体一点的比较:

① ArrayList, LinkedList, Vector, Stack是List的4个实现类,比较他们的异同。

ArrayList 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。

LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但随机插入、随机删除效率高。

Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。

Stack 是栈,它继承于Vector。它的特性是:先进后出(FILO, First In Last Out)。

②HashMap、HashTable、TreeMap的区别

HashMap是键值对的方式存储的,但不能保证次序,单线程;

HashTable与HashMap存储方式相同,但是是线程安全的;

TreeMap是有序的键值对,基于红黑树排序。


3.synchronized 和 ReentrantLock 有什么不同(以前面试被问过)

    a.这两种方式最大区别就是对于Synchronized来说,它是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成。
      b.Synchronized进过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。在执行monitorenter指令时,首先要尝试获取对象锁。如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,相应的,在执行monitorexit指令时会将锁计算器就减1,当计算器为0时,锁就被释放了。如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。
     c. ReentrantLock由于ReentrantLock是java.util.concurrent包下提供的一套互斥锁,相比Synchronized,ReentrantLock类提供了一些高级功能,主要有以下3项:
     ①等待可中断,持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,这相当于Synchronized来说可以避免出现死锁的情况。
    ②公平锁,多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,Synchronized锁非公平锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过参数true设为公平锁,但公平锁表现的性能不是很好。
   ③锁绑定多个条件,一个ReentrantLock对象可以同时绑定对个对象。


4.对volatile有了解吗
  Java 内存模型中的可见性、原子性和有序性。

可见性:

  可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。

  可见性,是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的。也就是一个线程修改的结果。另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。但是这里需要注意一个问题,volatile只能让被他修饰内容具有可见性,但不能保证它具有原子性。比如 volatile int a = 0;之后有一个操作 a++;这个变量a具有可见性,但是a++ 依然是一个非原子操作,也就是这个操作同样存在线程安全问题。

  在 Java 中 volatile、synchronized 和 final 实现可见性。

原子性:

  原子是世界上的最小单位,具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题,需要我们使用同步技术(sychronized)来让它变成一个原子操作。一个操作是原子操作,那么我们称它具有原子性。java的concurrent包下提供了一些原子类,我们可以通过阅读API来了解这些原子类的用法。比如:AtomicInteger、AtomicLong、AtomicReference等。

  在 Java 中 synchronized 和在 lock、unlock 中操作保证原子性。

有序性:

Java 语言提供了 volatile 和 synchronized 两个关键字来保证线程之间操作的有序性,volatile 是因为其本身包含“禁止指令重排序”的语义,synchronized 是由“一个变量在同一个时刻只允许一条线程对其进行 lock 操作”这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行执行。


5.什么是乐观锁,什么是悲观锁 ?

悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。


6.什么是 Java 的反射机制  ?
  就是可以在程序运行的时候动态装载类,查看类的信息,生成对象,或操作生成对象。类在运行的时候,可以得到该类的信息,并且 可以动态的修改这些信息,自己能看到自己,跟照镜子一样,也就是说Java的反射机制是在编辑的时候并不确定哪个类被加载了,而是在程序运行的时候才加载、探知、自审,使用在编译期并不知道的类,这样的特点就是反射。

解惑

面试总结

       此次面试问的问题有深有浅,有的很浅的就不过多阐述,不管怎样都要冷静,会的尽量多说,不太懂得知道多少说多少. 要按照自己的想法去说,不要支支吾吾.要把自己的自然自信展示出来. 还有一点要和面试官保持互动, 避免一问一答很冷的场面. 还要有礼貌哦.


微信公众号:javafirst

猜你喜欢

转载自blog.csdn.net/xiamiflying/article/details/80593303