Java基础
继承(extends,implements)、封装(类)、多态(重写重载)
1、面向对象与面向过程
2、重写和重载的区别
- 重写:用于父类与子类之间,子类重写父类的方法,但权限不能大于父类权限;返回值和形参都不能改变。即外壳不变,核心重写!
- 重载:是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载。
3、JVM内存区域
程序计数器(Program Counter Register)、Java 虚拟机栈(Java Vitual Machine Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)
- 程序计数器:保存的是程序当前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址)
- 虚拟机栈:存放局部变量表、操作数、指向当前方法所属的类的运行时常量池的引用、方法返回地址和一些额外的附加信息。为java方法服务
- 本地方法栈:地方法栈则是为执行本地方法服务的
- 堆:程序员可以通过malloc函数和free函数在堆上申请和释放空间(C);Java中的堆是用来存储对象本身的以及数组
- Integer是int的包装类,int则是java的一种基本数据类型
- Integer变量必须实例化后才能使用,而int变量不需要
- Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
- Integer的默认值是null,int的默认值是0
5、String,StringBuffer与StringBuilder的区别
6、HashMap和Hashtable的区别
7、抽象类和接口的区别
8、怎么实现多线程
- 继承thread类,通过start启动线程
- 实现Runnable接口
- 实现Callable接口并通过FutureTask包装
9、什么是线程安全?怎么实现线程安全
10、什么是死锁,发生原因是什么,如何解决和避免产生死锁
java垃圾回收机制
1)确定哪些对象应该进行回收
1、引用计数法:为对象创建一个引用计数器,当有引用对他进行引用时,计数器的值加一,当引用失效,计数器的值减一,当计数器值为0时可以进行回收。
缺点:不能解决对象之间的循环引用(A,B之间互相引用则无法释放)
2、可达性分析法:把对象之间的引用关系看做一张表,GCRoot为起点,对象之间的引用关系称为引用链,从起点开始向下搜索。若一个对象与GCRoot之间没有引用链,则可以进行回收。
2)回收的时间
1、在cpu空闲时自动进行回收
2、在堆内存存储满了之后
3、主动调用system.gc()后进行回收
3)回收的方法
1、标记-清除算法
标记需要回收的内存;进行回收。
缺点:效率低,标记清除后会产生大量不连续的内存碎片。
2、复制算法
将可用内存分为两块,每次只使用一块,当一块内存满了,就将存活着的对象复制到另一块上,然后清除。
缺点:内存缩小为原来的一半
3、标记-整理算法
标记需要回收的对象;整理存活对象,清除回收对象。
4、分代收集算法
根据具体场景进行算法选择
分为:新生代(生命周期短)复制算法
老年代:标记-清除,标记-整理算法
永久代:存放静态内存