本帖最后由 逆风TO 于 2018-5-28 11:02 编辑
公司名称:西安泰晟 公司地址:在科技一路与高新六路交汇处,cross万象汇
公司规模:100余人 主要业务:医药,政府等方面的项目
面试前话 一大早起来到在科技一路与高新六路交汇处西安泰晟公司开始面试了,来到后前台哥们直接让我把我带到此公司的一个接待室.不一会就来了个中年男性. 看着挺严肃, 当时我在心想没有笔试环节吗? 很庆幸还真没有笔试环节. 其实我挺反感做笔试题的没意思还是面试聊天比较好.
面试环节( 面试全靠嘴皮子功夫)
首先和面试官闲聊几句,大概介绍下自己(自然自信点). 前期面试官问了我一些上一家公司的事,在这里就不多说了啊.
1.什么是HTTP协议
HTTP是超文本传输协议, 是一个客户端和服务器端请求和应答的标准。底层使用TCP,客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其它的工具,客户端发起一个到服务器上指定端口(默认端口为80)的HTTP请求。
2.说说你对java集合体系的理解.
Java集合是java提供的一个工具包,全部继承自java.util.*。主要包括两大接口Collection接口和Map接口以及相关的工具类(Iterator迭代器接口、Enumeration枚举类、Arrays和Colletions)。
1、Collection是一个接口,包含List列表和Set集合。其中List是有序的队列,元素值可以重复,索引从0开始,实现类有LinkedList,ArrayList,Vector;而Set是一个不允许有重复元素的集合,Set的实现类有HashSet和TreeSet。HashSet依赖于HashMap,它实际上是通过HashMap实现的;TreeSet依赖于TreeMap,它实际上是通过TreeMap实现的。 2、Map是一个映射接口,通过key-value键值对实现。实现类有HashMap,TreeMap,Hashtable。 3、Iterator是遍历集合的工具,Enumeration也是遍历集合,但它的的功能要比Iterator少,只能在Hashtable, Vector, Stack中使用。 4、Arrays和`Collections是操作数组、集合的两个工具类。 下面是具体一点的比较: 1. ArrayList, LinkedList, Vector, Stack是List的4个实现类,比较他们的异同。 ArrayList 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。 LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但随机插入、随机删除效率高。 Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。 Stack 是栈,它继承于Vector。它的特性是:先进后出(FILO, First In Last Out)。 2.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项:
1.等待可中断,持有锁的线程长期不释放的时候,正在等待的线程可以选择放弃等待,这相当于Synchronized来说可以避免出现死锁的情况。
2.公平锁,多个线程等待同一个锁时,必须按照申请锁的时间顺序获得锁,Synchronized锁非公平锁,ReentrantLock默认的构造函数是创建的非公平锁,可以通过参数true设为公平锁,但公平锁表现的性能不是很好。
3.锁绑定多个条件,一个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的反射机制是在编辑的时候并不确定哪个类被加载了,而是在程序运行的时候才加载、探知、自审,使用在编译期并不知道的类,这样的特点就是反射。 总结
此次面试问的问题有深有浅,有的很浅的就不过多阐述,不管怎样都要冷静,会的尽量多说,不太懂得知道多少说多少. 要按照自己的想法去说,不要支支吾吾.要把自己的自然自信展示出来. 还有一点要和面试官保持互动, 避免一问一答很冷的场面. 还要有礼貌哦.
|