【八股文】Java基础
1.面向对象的特征
2.JDK和JRE的区别
3.Java的特点
4.Java和C++的区别
5.Java的基本数据类型有哪些
6.什么是值传递,什么是引用传递
7.自动装箱和拆箱
8.String为什么是不可变的
9.String,StringBuilder和StringBuffer的区别
10.Object常用方法有哪些
11.两个对象的hashCode()相同,则equals()是否也一定为true
12.java创建对象的方式
13.equels和==的区别
14.接口和抽象类的区别
15.方法重载和重写的区别
16.final类的细节
17.反射
1.面向对象的特征
-
封装:将类的信息封装在类的内部,不允许外部直接访问,而是通过该类的方法实现对隐藏信息的操作和访问
-
继承:从已有的类派生出新的类,新的类继承父类的属性和行为,并能扩展出新的能力,大大的增加了程序的重用性和易维护性
-
多态:同一个行为具有不同表现形式的能力。实现多态的三要素:继承,重写,父类引用指向子类对象
2.JDK和JRE的区别
-
JDK:java开发工具包。包含了java的运行环境和java工具
-
JRE:java运行时环境。包含了jvm标准和java核心类库
3.Java的特点
-
面向对象
-
平***立性和移植性。一处编写到处运行,JVM
-
稳健性。强语言类型和异常处理
4.Java和C++的区别
-
Java是纯粹的面向对象语言,所有的对象都继承于java.lang.Object,C++兼容C,既支持面向对象也支持面向过程
-
C++有指针,Java的引用相当于安全指针
-
Java自动回收垃圾,C++需要手动
-
Java通过虚拟机从而实现跨平台,C++依赖于特定的平台
-
java不支持多继承,需要实现多个接口来达到目的。C++支持多继承
5.Java的基本数据类型有哪些
byte 1字节
char 2字节
short 2字节
int 4字节
lang 8字节
float 4字节
double 8字节
boolean 1字节
6.什么是值传递,什么是引用传递
-
值传递:对于基本数据类型。传递的是变量的副本,改变不会影响原值
-
引用传递:对于对象型变量。会进行复制,但复制后的引用变量还是指向内存的同一个对象,函数对其修改会影响到原值
注:引用类型的String的值是放在常量池中,我们改变副本不会影响原来的值
7.自动装箱和拆箱
-
装箱:将基础类型转换成包装类型
-
拆箱:将包装类型转换成基础类型
8.String为什么是不可变的
因为String类是final修饰的,而且它的成员变量也全是final修饰的
为什么要使用final修饰?
-
线程安全:同一个字符串实例可以被多个线程共享,因为字符串不可变,本身就是安全的
-
hash不变:不可变的特性也使得hash值不会改变,不需要重新计算
-
字符串常量池优化:String对象创建之后,会缓存到字符串常量池,下次需要创建同样的对象,直接返回缓存即可
9.String,StringBuilder和StringBuffer的区别
线程安全:String和StringBuffer是线程安全的,String被final修饰,StringBuffer添加了synchronized
可变:String不可变,StringBuilder和StringBuffer可变
10.Object常用方法有哪些
-
toString():默认输出地址对象
-
equals():默认比较两个引用变量是否指向同一个对象
-
hashCode():将与对象相关的信息映射成一个哈希值,默认的实现hashCode值是跟据内存地址换算出来
-
clone():java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的
-
getClass():返回此Object的运行时类,常用于java反射机制
-
wait():当前线程调用对象的wait()方法之后,当前线程会释放对象锁,进入等待状态。
-
notify():唤醒等待的线程
11.两个对象的hashCode()相同,则equals()是否也一定为true
两个对象的hashCode()相同,equlas()不一定为true。
hashCode()方法主要是用来提升对象比较效率的,我们先进行hashCode的比较,如果不相同,那么就不必要进行equals的比较,这样就大大减少了equals比较的次数
对于重写的问题:之所以重写equals()要重写hashcode(),是为了保证equals()方法返回true的情况下hashcode值也要一致,如果重写了equals()没有重写hashcode(),就会出现两个对象相等但hashcode()不相等的情况。这样,当用其中的一个对象作为键保存到hashMap、hashTable或hashSet中,再以另一个对象作为键值去查找他们的时候,则会查找不到。
12.java创建对象的方式
-
new
-
反射
-
反序列化
-
第三方库
-
克隆
13.equels和==的区别
==比较的是原生类型,equlas重写前用于检查对象的相等性,重写后一般比较值。
对于基本数据类型:只有==
对于引用类型:==比较的是对象在堆内存中的地址值是否相等
对于字符串:==比较的是内存地址,equals比较的是值
14.接口和抽象类的区别
抽象类:
JDK1.8以前:抽象类的方法默认访问权限为protected
JDK1.8时:变成default
不能被实例化,但可以在类的实体定义成员变量,构造方法
接口:
JDK1.8以前:接口的方法必须是public
JDK1.8时:变成default或public
JDK1.9时:变成private
除了static,final不能有其他变量
区别:
-
抽象类是被子类继承,接口是被类实现
-
抽象类能做方法实现,接口不能
-
抽象类允许定义普通变量,接口只能定义静态常量
-
接口主要用于对类的行为进行约束,实现了某个接口就具有了对应的行为。抽象类主要用于代码复用,强调的是所属关系
15.方法重载和重写的区别
-
方法重载:同个类中的多个方法可以有相同的方法名称,但有不同的参数列表(参数类型,参数个数,参数顺序有一个不同就是参数列表不同)
-
方法重写:描述的是父类和子类的之间的。当父类的功能无法满足子类的需求时,子类可以重写父类的方法
16.final类
final类可以修饰
-
类:这个类不能被继承
-
方法:不能修改它的含义
-
基础数据类型:变成了常量
-
引用类型:初始化后不能指向其他对象,但内容可以变化
final修饰的静态常量,在编译的时候就可以确定的值,类不需要被加载。
final 修饰的是静态变量的对象,在运行时才能确定它的值,需要加载类。
17.反射
反射机制的作用:
-
在运行时判断任意一个对象所属的类
-
在运行时构造一个类的对象
-
在运行时判断任意一个类所具有的成员变量和方法
-
在运行时调用任意一个对象的方法,生产动态代理
与反射相关的类:
-
Class:表示类,用于获取类的相关信息
-
Field:表示成员变量,用于获取实例变量和静态变量
-
Method:表示方法,用于获取类中的方法参数和方法类型
-
Constructor:表示构造器,用于获取构造器的相关参数和类型
18.jdk1.8有哪些新特征
1)lambda表达式
允许把函数作为一个方法的参数
用法示例:
//对集合进行排序 //jdk1.7 List<Integer> list = Arrays.asList(10,5,25,-15,20); Collections.sort(list, new Comparator<Integer>() { public int compare(Integer o1, Integer o2) { return o1 - o2; } }); //jdk1.8 list.sort((i1, i2) -> {return i1 - i2;});
2)Stream
把真正的函数式编程风格引入到java中。这种风格将要处理的元素集合看成一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如排序,筛选
Stream操作的三个步骤:
-
创建Stream:一个数据源,获取一个流
-
中间操作:一个操作链,对数据源的数据进行处理
-
终止操作:执行操作链并产生结果
#java##八股文#
本专栏是我总结的八股大全