Java基础
- JVM
运行java字节码的虚拟机。
- jre与jdk的区别?
jre:java程序运行的环境
jdk:除运行环境外,还有java自带的各种工具如,jps(查看java线程),jstat(监视运行时虚拟机的状态 jstat -gc pid),jmap(生成heap dump文件分析内存溢出时使用 jmap -heap pid),
jstack(查看线程状态,用来分析死锁、死循环等)。
总结:只是运行java程序安装jre即可,若要分析内存溢出,cpu使用率过高的线上问题安装jdk。
- 构造器Constructor是否可被 override?
不可被override(重写),但是可以被overload(重载)。
- 重写(override)和重载(overload)的区别?
重写:子类对父类方法重写编写实现,参数必须相同,返回值可以相同,可以不相同(返回值,异常范围都小于父类)。
重载:在同一个类中的多个同名方法,参数类型数量必须不同,返回值可以相同也可以不同。
- 面向对象三大特性?
封装:对象属性私有化。
继承:子类可以拥有父类的属性和方法(私有属性可以拥有但是不能访问)
多态:具体使用父类还是子类的方法或属性在编译时不能确定,在运行时确定
多态(父类子类相同变量,方法时):
FuClass demo=new ZiClass();
demo.变量 //调用父类的
demo.方法() //调用子类的
- String StringBuilder 和 StringBuffer区别?
String:不可变字符串,底层为final char[] value 数组。
StringBuilder:可变字符串,线程不安全。
StringBuffer:可变字符串,线程安全。
性能:StringBuilder>StringBuffer
总结:推荐使用StringBuffer;StringBuilder性能只提高了15%左右,却要冒线程不安全的风险。
- 自动装箱,拆箱
//假如需要生成一个Integer对象,值为5
//正常
Integer i = new Integer(10);
//自动装箱
Integer i = 10;
//自动拆箱
int n = i;
-
包装类型和基本类型的区别是什么?
1. 包装类型可以为null,基本类型不行。(pojo中的某个属性若设置为int型,正好数据查出这个属性值为null,由于自动装箱的存在,所以会报NullPointerException异常) 2. 包装类型可以用于泛型,基本类型不行。 3. 基本类型更高效(基本类型存在栈中,包装类型存在堆中)
-
接口和抽象类的区别?
1. 接口默认public,接口不能有已实现的方法;抽象类可以有非抽象方法。 2. 接口变量必须是static或final型。 3. 接口可以多继承 4. 抽象类是对类的抽象,相当于模板,接口是对行为的抽象;比如animal都会跑,那么子类cat必须实现run,cat可能还会爬树这种行为,再去实现接口的climb方法;
-
全局变量和局部变量的区别?
1. 全局变量是属于类的,局部变量在方法中定义。 2. 局部变量只能被final修饰。 3. 局部变量存在栈,全局存在堆。 4. 全局变量未赋值系统会赋予默认值,局部变量必须有初始值。 5. 局部变量随方法结束消失,全局变量是对象的一部分,与对象的生命周期相同。
-
==与equals的区别?
==比较的对象的地址是否相同
equals判断两个对象是否相等,若已重写如String,那么比较的是值是否相等,否则比较的还是地址
-
hashCode与equals
1. 什么是hashCode? 答:hashCode方法存在于Object.java中,所以每个java对象都有hashCode方法 2. hashCode有什么用? 答:用于确定对象在散列表中的位置,且hashCode只在散列表中起作用。 3. 散列表? 答:常见的有:HashSet, Hashtable, HashMap 4. hashCode() 和 equals() 的关系 答:1.未用到散列表,这种情况下未用到hashCode,重写equals就可以判断两个对象是否相等。 2.用到散列表,此时如果只重写equals方法,不重写hashCode方法,那么equals无效。 // 新建Person对象, Person p1 = new Person("eee", 100); Person p2 = new Person("eee", 100); // 新建HashSet对象 HashSet set = new HashSet(); set.add(p1); set.add(p2); 由于未重写hashCode方法,即使equals方法判断为true,但是他们的hashCode值是不同的,所以HashSet判断他们是两个对象,那么存进去的时候就会出现重复。
-
java参数传递方式?
java只有值传递
//值传递,基本类型
//num1和num2未发生改变
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
swap(num1, num2);
System.out.println("num1 = " + num1);
System.out.println("num2 = " + num2);
}
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a = " + a);
System.out.println("b = " + b);
}
//值传递,引用类型
//这里看起来像是引用传递,其实不是,这里传递的是引用的值,引用的值就是内存地址,arr和array指向同样的内存地址所以arr的发生了改变。
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
System.out.println(arr[0]);
change(arr);
System.out.println(arr[0]);
}
public static void change(int[] array) {
// 将数组的第一个元素变为0
array[0] = 0;
}
-
线程和进程的区别?
1. 进程:CPU加载上下文+CPU执行+CPU保存上下文 的时间 2. 线程:把进程的时间细分成3段,a,b,c那么abc就是线程,他们共享进程的上下文 3. 总结:进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同。
-
线程的状态?
1. 新建 NEW 2. 运行 RUNNABLE 3. 阻塞 BLOCKED 4. 等待 WAITING 5. 超时等待 TIME_WAITING 6. 终止态 TERMINATED
-
final关键字
用于类,方法,变量
1. 修饰基本变量表示变量不可变,修饰引用变量表示引用不可指向其他。
2. 修饰类表示类不可被继承。
3. 修饰方法表示方法不可被重写。
- 异常
分为Error和Exception
Error一般为StackOverFlowError(递归过深)和OutOfMemoryError(内存溢出),Error是代码无法处理的
Exception分为IOException和RuntimeException
IOException一般为FileNotFoundException(文件未发现)
RuntimeException一般有数组越界,空指针,未发现类等
- IO流
- 分类:
按照流的流向分,可以分为输入流和输出流。
按照操作单元划分,可以划分为字节流和字符流。
按照流的角色划分为节点流和处理流。
- 有了字节流为什么还要有字符流?
字符流是java虚拟机转换字节流得到的,这个过程是很耗时的,所以干脆直接提供字符流。
字符一般用字符流,音频视频文件一般用字节流。
- BIO,NIO,AIO有什么区别?
- BIO,同步阻塞IO,读取写入在一个线程内完成,并发量低。
- NIO,Non-blocaking同步非阻塞IO,利用Channel,Selector,Buffer等抽象达到异步IO的效果
- AIO,异步非阻塞IO
- 深拷贝和浅拷贝
- 浅拷贝:基本数据类型,值传递;引用数据类型,对其引用进行拷贝。
- 深拷贝:基本数据类型,值传递;引用数据类型,创建一个新的对象,并复制其内容。