Java 面试知识点4

说说你最常见到的runtime exception(运行时异常)
ArithmeticException
ArrayStoreException
BufferOverflowException
BufferUnderflowException
CannotRedoException
CannotUndoException
ClassCastException
CMMException
ConcurrentModificationException
DOMException
EmptyStackException
IllegalArgumentException
IllegalMonitorStateException
IllegalPathStateException
IllegalStateException
ImagingOpException
IndexOutOfBoundsException
MissingResourceException
NegativeArraySizeException
NoSuchElementException
NullPointerException
ProfileDataException
ProviderException
RasterFORMatException
SecurityException
SystemException
UndeclaredThrowableException
UnmodifiableSetException
UnsupportedOperationException
不会的英文单词可以说中文,意思可以自己百度下

Error和Exception有什么区别?
答:Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。

List, Set, Map是否继承自Collection接口?
List和Set是继承自Collection接口;Map不是。

abstract class和interface有什么区别?

java中用abstract表示抽象,可以修饰类、方法;
java中没有方法体(即没有{})的方法就是抽象方法, 就用abstract修饰;
有抽象方法的类为抽象类,用abstract修饰;
抽象类不一定有抽象方法;
抽象类不能实例化,但是有构造方法构造方法在这里仅仅初始化数据
如何才能访问抽象类的成员?通过多态的特征让子类进行实例化
抽象类的子类要么也是抽象类,要么重写抽象类中的所有抽象方法
抽象类只能单继承但可以多实现接口;
抽象类中可以有静态代码块,而接口中没有;
抽象类的成员特点:
    1.成员变量可以是变量也可以是常量
    2.成员方法可以是抽象也可以非抽象
    3.有构造方法, 但是不能实例化    

初步理解,接口是一个特殊的抽象类,当抽象类中全部是抽象方法时,可以通过接口的形式来体现。 java中class 用于定义类;interface 用于定义接口。

接口中成员(成员变量和成员方法)的格式:

1.public static final String NAME=”小李”; //全局常量
2.public abstract void show(); //抽象方法 类与接口的关系是实现关系, 格式 class 类名 implements 接口名{ }

接口中成员特点:
    1.成员变量只能是静态常量 用public static final修饰
    2.成员方法必须是抽象方法, 用public abstract修饰
    3.java中类之间只能单继承,接口与接口可以多继承
    4.类可以多实现接口
    5.接口中只能出现public 访问修饰符
    6.接口中没有构造方法。
    7.也不能被实例化(即接口不可以直接创建对象)因为里面有抽象方法,需要被子类实现,子类对接口中的所有抽象方法实现后,子类才能够实例化,否则子类就是一个抽象类。     

abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
都不能
abstract需要重载,static为类方法,没有重载一说
abstract 是没有实现的方法,native是本机实现的方法,自相矛盾
abstract方法没有实现,也不可能实际调用抽象方法,没有必要用synchronized(同步的)修饰, 当然子类可以根据需要同步该方法.

接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)?
接口可以继承接口。
抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数。
启动一个线程是用run()还是start()?
启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。
线程同步,并发操作的怎么控制?
并发:CUP在同一时间或同一时段内只能执行一件事情,而不同时件执行时,切换得十分快速,因为CUP的频率非常高,切换的速度人根本感受不出来。 同步:同步是多个任务进行时,按照一定的规律进行着。 线程并发:同一时间间隔中,有多个线程在同时执行,就是线程的并发。线程可能互相有逻辑影响,所以要进行控制,进行控制和协调就是线程的同步。 系统采用多线程并发来提高性能和吞吐量,所以就会引入线程同步问题。 控制并发可以使用sleep方法实现同步,需要顺序的话按照join来实现同步,还有wait,notify方法实现线程的同步。
Java中当多线程访问共享资源的时候,可以在方法名前面加入synchronized来处理。 synchronized 像一把锁一样,有申请着申请时,若该资源没有被占用,则给申请者,若被占用了,则只可以申请不可以使用,该资源被使用完之后会被释放,这个时候才可以给其他申请的使用。 并发控制:为了多线程操作带来资源读写问题,若不控制可能会出现:死锁,读脏数据,不可重复读,丢失更新等异常,主要通过加锁来控制。 版权声明:本文为博主(萨达哈鲁的博客)原创文章,转载请贴一个出处即可!

JVM垃圾回收实现原理。垃圾回收的线程优先级。
VM的堆空间中主要分为年轻代、年老代和永久代。年轻代和年老代是存储动态产生的对象。永久代主要是存储java类信息,包括解析得到的方法属性、字段等等。永久代基本不参与垃圾回收。年轻代分为一个eden区和两个相同的survior区。刚开始创建的对象都放置在eden区。这样主要是为了将生命周期短的对象尽量留在年轻代中。当eden区申请不到空间时,进行minorGC,把存活的对象拷贝到survior。年老代主要存放生命周期比较长的对象,如缓存对象。

具体JVM垃圾回收过程如下:
1、对象在Eden区完成内存分配。
2、当Eden区满了,在创建对象就会申请不到空间,则触发minorGC,进行young(eden区和1survivor区的垃圾回收)。
3、在minorGC时,Eden不能被回收的对象呗放入到空的survior(即Eden肯定被清空),另一个survivor里不能被GC回收的地想也会被放入到这个survivor,始终保证一个survivor是空的。
4、当完成第三步的时候、如果发现survivor满了,则这些对象呗copy到old区,或者survivor并没有满,但有些对象已经足够old了,也被放入到old区。当old区北放满之后,进行fullGC。

jvm 最大内存设置。设置的原理。结合垃圾回收讲讲。
JVM内存可以分为堆内存和非堆内存;
堆内存给开发人员用的,非堆内存给JVM本身用的,用来存放类型信息,即使GC时也不会释放空间。
堆内存设置: -Xms 初始堆内存,默认物理内存1/64,也是最小分配堆内存,当空余堆内存小于40%时,会增加到-Xms的最大限制。 -Xmx 最大堆内存分配,默认物理内存1/4,当空余堆内存大于70%时,会减小打-Xms的最小限制。
非堆内存设置: -XX:PermSize 非堆内存的初始值,默认物理内存的1/64,也是最小非堆内存。 -XX:MaxPermSize 非堆内存最大值,默认物理内存的1/4。
查看堆大小命令为Runtime.getRuntime().maxMemory()。

猜你喜欢

转载自blog.csdn.net/yuki5233/article/details/70147017
今日推荐