- 一、java中的编译器和解释器
- 二、多态的实现
- 三、Overload和Override的区别
- 四、什么是值传递和引用传递
- 五、引用拷贝、浅拷贝与深拷贝
- 六、a==b与a.equals(b)有什么区别
- 七、为什么要有 hashCode
- 八、Java集合类
- 九、HashTable 和concurrentHashMap 区别
- 十、 什么是CAS
编译器:将java源程序编译成字节码,字节码由虚拟机解释执行。
解释器:解释器将字节码翻译成特定机器上的机器码,然后在特定的机器上运行。
二、多态的实现Java源代码 --> 编译器 --> Jvm可执行的Java字节码(即虚拟指令) --> Jvm传输字节码 --> Jvm中解释器 --> 机器可执行的二进制机器码 --> 程序运行。
Java实现多态有三个必要条件:继承、重写、向上转型。
- 继承:在多态中必须存在有继承关系的子类和父类。
- 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
- 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法
Overriding :子类中重写父类的方法;
Overloaded:同一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载
- 值传递:是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量。
- 引用传递:一般是对于对象型变量而言的,传递的是该对象地址的一个副本,并不是原对象本身。
五、引用拷贝、浅拷贝与深拷贝一般认为,Java 基本变量的传递都是值传递,Java 中实例对象的传递是引用传递。
当我们把一个对象赋值给另外一个对象时,是引用拷贝。
- 引用拷贝:创建一个指向对象的引用变量的拷贝。
当调用clone方法时,我们实现的是对象拷贝。对象拷贝分为浅拷贝、深拷贝:
- 浅拷贝:是会将对象的每个属性进行依次拷贝,但属性值是引用类型时,实质复制的是其引用,修改其里面引用的对象,会影响原对象。
- 深拷贝:复制变量值,对于引用数据,则递归至基本类型后,再复制。深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象。
六、a==b与a.equals(b)有什么区别实现深拷贝的方法:
- 重写clone方法,对引用的对象,重新克隆一份。
- 利用序列化、反序列化实现深度拷贝。
== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。
基本数据类型 == 比较的是值
引用数据类型 == 比较的是内存地址
equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
- 情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
- 情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来两个对象的内容相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
以HashSet为例,当把对象加入HashSet时,会先用hashcode做快速判断,只有hashcode相等时,才作equals判断,这样能提高执行效率!
八、Java集合类Map接口和Collection接口是所有集合框架的父接口
- List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等
- Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等。
- Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
- HashTable属于同步集合,一个对象只有一把锁;
- ConcurrentHashMap属于并发集合,一个对象有多把锁;
concurrentHashMap在1.7版本和1.8版本的区别
1.7版本: 基于Segment+HashEntry数组实现的
1.8版本: synchronized+CAS+红黑树
使用CAS的方式,可以在特定场景进行无锁并发操作,使性能得以提升!
十、 什么是CASCAS可以简单理解为带原值更新,是一种无锁解决并发的操作。
CAS存在一个典型问题,就是ABA问题。一般这种情况概率较低,且产生的影响较小,我们只能减少发生的概率。
ABA常见的场景是
线程1 将对象值更新为A
线程2 将对象值更新为B
线程3 将对象值更新为A
则,线程1在更新时,会误以为对象没有被修改过,从而继续更新。



