面试
1、synchoronized和lock区别
synchoronized是JVM的内置锁,而lock是Java代码实现的。lock是sync对的扩展,完全可以替代后者。
lock可以重入,允许同一个线程连续多次获得同一把锁。其次,lock独有的功能有:
- 可以响应中断,sync要么获得锁执行,要么保持等待。而重入锁可以响应中断,使得线程在迟迟得不到锁的情况下,不用再等待。主要由lockInterruptibly()实现,这是一个可以对中断进行响应的锁申请动作,锁中断可以避免死锁。
- 锁的申请可以有等待时限,用tryLock()可以实现限时等待,如果超时还未获得锁会返回false,也防止线程迟迟得不到锁时一直等待,可以避免死锁。
- 公平锁,即锁的获得按照线程先来后到的顺序依次获得,不会产生饥饿现象。sync的锁默认不公平,可通过传入构造方法的参数实现公平锁。
- 重入锁可以绑定多个Condition条件,这些Condition通过调用await/singal实现线程间通信。
2、java如何对对象排序
有时我们需要对类按照类中的某一个属性(或者多个属性)来对类的对象进行排序,有两种方法可以实现
- 类实现Comparable<t>接口,然后调用Collections.sort(List)方法进行排序</t>
- 类不实现Comparable<t>接口,而在排序时使用Collections.sort(List, Comparator<t>)方法,并实现其中的Comparator<t>接口。</t></t></t>
3、java有哪几种集合?有什么区别?
Java中的集合有List,Set,Map.
List和Set有着很多的相似之处,都是存储单例数据的集合,父接口都是Collection。
List是有序的,值允许重复,每次插入数据,不是把对象本身存储到集合中,而是在集合中用一个索引变量指向这个对象。Set是无序的不允许有重复的值出现。
Map集合是存储双列数据的集合,存储的数据是无序的,键不可以重复,值可以重复。
1.List集合
ArrayList:
** 底层数据结构是数组,查询快,增删慢,查询是根据数组下标直接查询速度快,增删需要移动后边的元素和扩容,速度慢。线程不安全,效率高**LinkedList:
底层数据结构是链表,查询慢,增删快,查询需要遍历数组,速度慢,增删只需要增加或删除一个链接即可,速度快,线程不安全,效率高
- Vector:
底层数据结构是数组,查询快,增删慢,线程安全,效率低
2.Set集合
Hashset:
底层数据结构是哈希表,是根据哈希算法来存取对象的,存取速度快,当Hashset中元素个数超过数组大小(默认值位0.75)时,会进行近似两倍的扩容,哈希表依赖两个方法hashcode()和equals()方法,方法的执行顺序,判断hashcode值是否相同,是:执行equals方法看其返回值,true:说明元素重复不添加,false:直接添加到集合,hashcode值不相同直接添加到集合。LinkedHashset:
底层数据结构是链表和哈希表,由链表保证元素有序,由哈希表保证元素的唯一Treeset
底层数据结构是红黑树(唯一,有序)由自然排序和比较器排序保证有序,根据返回值是否是0判断元素是否唯一
Map集合
HashMap:
HashMap是基于散列表实现的,其插入和查询的<k,v>的开销是固定的,可以通过构造器设置容量和负载因子来调整容器的性能,线程不安全,效率低Treemap:
基于红黑树实现,查看<k,v>时,它们会被排序,TreeMap是唯一带有subMap()方法的Map,subMap()方法可以返回一个子树。LinkedHashMap:
类似于HashMap,但是迭代遍历它时,取得<K,V>的顺序是其插入次序,或者是最近最少使用(LRU)的次序。
Map取键值的两种方法
第一个,使用keySet方法,获得key的set,然后遍历set,就可以获得所有的value
第二个,使用entrySet方法,获得map中的所有键值对的一个视图,遍历就可获得所有的key、value
4、数组(Array)和列表(ArrayList)有什么区别
一、数组
- 数组在内存中是连续存储的,所以它的索引速度是非常的快,而且赋值与修改元素也很简单
- 声明数组的时候,必须同时指明数组的长度,数组的长度过长,会造成内存浪费,数组和长度过短,会造成数据溢出的错误。
- 数组只能存放类型一样的数据(基本类型/引用类型)
二、list
- List (列表)是接口,与Set(集)一起继承了Collection接口
- 元素有放入顺序,元素可重复
JAVA语言为什么能跨平台?
因为Java程序编译之后的代码不是能被硬件系统直接运行的代码,而是一种“中间码”——字节码。然后不同的硬件平台上安装有不同的Java虚拟机(JVM),由JVM来把字节码再“翻译”成所对应的硬件平台能够执行的代码。因此对于Java编程者来说,不需要考虑硬件平台是什么。所以Java可以跨平台。