【JAVA面试题整理】_JavaSE_上

  1. 面向对象的特征有哪些方面?

封装:最常见的是把属性私有化封装在一个类里面,只能通过方法去访问。
继承:从已有类得到继承信息创建新类的过程。
抽象:将一类对象的共同特征总结出来构造类的过程。
多态: 父类引用指向子类对象。

  1. 面向对象的“六原则一法则”

单一职责原则:一个类只做它该做的事情。
开闭原则:软件实体应当对扩展开放,对修改关闭。
依赖倒转原则:面向接口编程。
里氏替换原则:任何时候都可以用子类型替换掉父类型。
接口隔离原则:接口要小而专,绝不能大而全。
合成复用原则:在代码复用上优先考虑合成、聚合(has a)关系,而不是继承(is a)。
迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。

  1. String是最基本的数据类型吗?

String是引用类型(类类型),不是基本类型。
基本类型 有八种:整型 (4种),浮点型 ,(2种),布尔型(1种),字符型 (1种)
这八种基本类型分别是:byte, short, int, long, float, double, boolean, char

正数默认是int类型,小数默认是double类型,
long n = 1L;	float n = 1f;	
// double是双精度类型,精度是17位有效数字
// float是单精度类型,精度是8位有效数字
  1. int 和 Integer 有什么区别?

int 是基本类型32位长度的整数
Integer 是类类型,是int的封装类
int和Integer之间可以通过自动装箱、自动拆箱 来互相转换(详情:自动拆箱和装箱及包装类)

  1. String 和StringBuffer / StringBuilder的区别?

String是immutable的,其内容一旦创建好之后,就不可以发生改变。
    原因是:String底层是用char[] 数组实现的,并且使用final修饰了String和char[]。
StringBuffer、StringBuilder 是可以变长的,内容也可以发生改变。
    其中:StringBuffer是线程安全的(内部方法用了synchronize修饰),所以速度较慢;而StringBuilder是非线程安全的,所以速度较快。
(详情:String、StringBuffer和StringBuilder的区别)

  1. 运行时异常与一般异常有何异同?

运行时异常:又叫做非可查异常,在编译过程中,不要求必须进行显示捕捉
一般异常(编译异常):又叫做可查异常,在编译过程中,必须进行处理,要么捕捉,要么通过throws 抛出去.
详情:异常的概念

  1. 说出ArrayList,Vector, LinkedList的存储性能和特性。

先说ArrayList和Vector
两者都继承了抽象类AbstractList,但是Vector是线程安全的,而ArrayList是非线程安全的
再说ArrayList和LinkedList的区别(一般来说)
ArrayList 是数组结构,所以定位很快,但是插入和删除很慢
LinkedList 是双向链表结构,所以插入和删除很快,但是定位很慢

  1. Collection 和 Collections的区别。

Collection是接口,是List和Set的父接口
Collections是工具类,提供了排序,混淆等等很多实用方法

  1. &和&&的区别

& 有两个作用,分别是 位与 和 逻辑与
&& 就是逻辑与
作为逻辑与, & 和 && 分别表示长路与、短路与
长路与:两侧,都会被运算
短路与:只要第一个是false,第二个就不进行运算了

  1. HashMap和Hashtable的区别

初始大小和扩容方式不同:Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
线程安全性不同
    Hashtable是线程安全的,它的每个方法中都加入了Synchronize方法。在多线程并发的环境下,可以直接使用Hashtable,不需要自己为它的方法实现同步
    HashMap不是线程安全的,在多线程并发的环境下,可能会产生死锁等问题。使用HashMap时就必须要自己增加同步处理,
继承的父类不同:HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary类。不过它们都同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口
详情:HashMap和HashTable的区别

  1. final, finally, finalize的区别

final
final修饰类,方法,基本类型变量,引用的时候分别有不同的意思
修饰类 表示该类不能被继承
修饰方法 表示该方法不能被重写
修饰基本类型变量 表示该变量只能被赋值一次
修饰引用 表示该引用只有一次指向对象的机会
finally
finally 是用于异常处理的场面,无论是否有异常抛出,都会执行
finalize
finalize是Object的方法,所有类都继承了该方法。 当一个对象满足垃圾回收的条件,并且被回收的时候,其finalize()方法就会被调用

  1. Overload和Override的区别,即重载和重写的区别。

Override:方法重写的意思,指的是子类继承了父类的某个方法后,重新又写了一遍(只允许改变方法体
Overload:方法重载的意思,指的是在同一个类里面,方法名一样,但是参数或方法体或返回值类型不一样(只要保留方法名称相同即可

  1. Error和Exception有什么区别?

Error和Exception都实现了Throwable接口
Error指的是JVM层面的错误,比如内存不足OutOfMemoryError
Exception 指的是代码逻辑的异常,比如下标越界OutOfIndexException

  1. 抽象类和接口的区别

使用方式
    抽象类只能够通过继承被使用,而接口必须通过实现被使用
实现方法
    抽象类不仅可以提供抽象方法,也可以提供实现方法
    接口只能提供抽象方法,不能提供实现方法。 但是在JAVA8版本开始,接口可以提供实现方法了,前提是要在方法前加一个default修饰符

  1. heap和stack有什么区别

存放的内容不一样
    heap: 是存放对象的
    stack: 是存放基本类型(int, float, boolean 等等)、引用(对象地址)、方法调用
存取方式不一样
    heap: 是自动增加大小的,所以不需要指定大小,但是存取相对较慢
    stack: 是固定大小的,并且是FILO 先入后出的顺序,并且存取速度比较

  1. GC是什么? 为什么要有GC?

GC是Garbage Collection的缩写,即垃圾回收
这里所谓的垃圾,指的是那些不再被使用的对象,JVM的垃圾回收机制使得开发人员从无聊、容易犯错的手动释放内存资源的过程中解放出来。

两种常见的回收机制:
1. 定时回收:
每隔30分钟进行一次回收,这种机制的弊端是如果垃圾产生的比较快,有可能30分钟之内垃圾已经把内存占用光了,导致性能变慢
2. 当垃圾占到某个百分比的时候,进行回收:
比如,当垃圾占到70%的时候,进行回收。 这种机制的弊端是,如果垃圾产生的频率很快,那么JVM就必须高频率的进行垃圾回收。 而在垃圾回收的过程中, JVM会停顿下来,只做垃圾回收,而影响业务功能的正常运行。

一般说来 JVM会采用两种机制结合的方式进行垃圾回收。
  1. short s1 = 1; s1 = s1 + 1;有什么错?

short s1 = 1; 这一句没有错误,编译器会自动把1这个整数处理为short.
s1 = s1 + 1; 右侧的表达式会返回一个Int类型的整数,再把这个int类型的整数赋给short类型的s1的时候,就会出现强制转换错误

  1. String s = new String(“a”+“b”);创建了几个String Object?

首先构造方法 new String(“a”+“b”); 中JVM会将其优化为(new String(“ab”))并产生一个字符串对象:“ab”
然后 new 关键字一定会创建一个对象,所以总共创建了两个String对象
注意:“a”+“b”时,会还会产生一个临时的对象StringBuilder来连接字符。
详情:Java中关于String的地址问题

  1. Math.round(11.5)等于多少? Math.round(-11.5)等於多少?

Math.round 的意思是+0.5 后,向下取整。
所以 Math.round(11.5) 即 11.5+0.5 = 12; Math.round(-11.5) 即 -11.5+0.5 = -11

  1. Java有没有goto?

有,goto是关键字,但是是保留字,并不具备功能性

  1. 接口是否可继承接口? 抽象类是否可实现接口? 抽象类是否可继承实体类?

接口可以继承接口,比如List 就继承了接口Collection
抽象类可以实现接口,比如 MouseAdapter鼠标监听适配器 是一个抽象类,并且实现了MouseListener接口
抽象类可以继承实体类,所有抽象类,都继承了Object

  1. List, Set, Map是否继承自Collection接口?

List 和 Set 继承了Collection接口
但是Map和Collection之间没有继承关系,因为一个是键值对容器,一个是单值容器,无法兼容

  1. abstract的method是否可同时是static,是否可同时是synchronized?

都不可以,因为抽象方法没有方法体,无法实例化,无法直接访问。

  1. 数组有没有length()这个方法? String有没有length()这个方法?

数组获取长度的手段是 .length 属性
String获取长度的手段是 length()方法
集合获取长度的手段是 size()方法
文件获取长度的手段是 length()方法

  1. 构造器Constructor是否可被override?

子类不能继承父类的构造方法,所以就不存在重写父类的构造方法。
: super() 表示子类调用父类的构造方法,这不能被叫做继承父类的构造方法

  1. switch 是否能作用在byte上,是否能作用在long上,是否能作用在String上?

switch 可以作用在 byte,short,int String,Enum(枚举) 上,但是不能作用在long上面
:switch 作用在String上从JDK1.7开始支持,实质是编译时将字符串替换为了其对应的hash值

  1. char型变量中能不能存贮一个中文汉字?为什么?

char是16位的,占两个字节
汉字通常使用GBK或者UNICODE编码,也是使用两个字节
所以可以存放汉字

  1. 解析XML文档有哪几种方式?

主要是两种,SAX和DOM
SAX 就是逐行读取,直到找到目标数据为止
DOM 是先全文档加载,然后读取

  1. 关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?

throws 用在方法声明上面,表示该方法有可能抛出某个异常
throw 抛出一个指定的异常
try catch 在try中有可能会抛出某个异常,一旦某个异常抛出后,就会在catch中进行捕捉,他俩一般说来都是成对出现的。
finally: 表示无论是否捕捉住异常,都会执行

  1. java中有几种类型的流?

Java中所有的流都是基于字节流,所以最基本的流是
输入输出字节流: InputStream、OutputStream
在字节流的基础上,封装了字符流: Reader、Writer
进一步,又封装了缓存流: BufferedReader、PrintWriter
以及数据流: DataInputStream、DataOutputStream
对象流: ObjectInputStream、ObjectOutputStream

  1. java中会存在内存泄漏吗,请简单描述。

如果长生命周期的对象持有短生命周期的引用,就很可能会出现内存泄露。例子如下:

public class Simple {

    Object object;
 
    public void method1(){
        object = new Object();	//这里的new Object()其实我们只期望它在方法中起作用而已。
        //...其他代码
       object = null;	//为了使前面的 new Object()能被回收;若没有这条语句就造成了内存泄漏
    }
}

详情:JAVA 内存泄露详解(原因、例子及解决)

  1. 什么是java序列化,如何实现java序列化?

概念
序列化:把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。
用途
(1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
(2) 在网络上传送对象的字节序列。
实现
序列化:java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。只有实现了Serializable和Externalizable接口的类的对象才能被序列化。
反序列化:java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

  1. 是否可以在static方法内部调用非static方法?

不行,因为非static方法需要一个具体的实例才可以调用,而调用 static方法的时候,不一定存在一个实例,(static修饰的变量或方法在类加载时就被初始化了)

  1. 在JAVA中,如何跳出当前的多重嵌套循环?

在外部循环的前一行,加上标签,在break的时候使用该标签,即能达到结束多重嵌套循环的效果

public class HelloWorld {
   public static void main(String[] args) {
       //打印单数    
       outloop:	  //outloop这个标示是可以自定义的
       for (int i = 0; i < 5; i++) {
           for (int j = 0; j < 5; j++) {
               System.out.println(i+" : "+j);
               if(0 == j%2) 
                   break outloop; //如果是双数,结束外部循环(continue也是一样的用法)
           }   
		}  
	}
}
  1. List、Map、Set三个接口,存取元素时,各有什么特点?

List 是有顺序的,并且可以重复
Set 是无序的,不可以重复
Map 保存数据的方式是键值对

  1. 多线程有几种实现方法,都是什么?

(1) 继承一个Thread类
(2) 实现Runnable接口
(3) 实现Callable接口(有返回值,利用Callable+FutureTask 实现)
(4) 通过线程池启动多线程
详情:Java创建线程的四种方式

  1. Java线程状态

新建、就绪、运行、阻塞、死亡

阻塞的情况分三种:
等待阻塞:
	运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池中”。
	进入这个状态后是不能自动唤醒的,必须依靠其他线程调用notify()或者>notifyAll()方法才能被唤醒。
同步阻塞:
	运行的线程在获取对象的(synchronized)同步锁时,若该同步锁被其他线程占用,则JVM会吧该线程放入“锁池”中。
其他阻塞:
	通过调用线程的sleep()或者join()或发出了I/O请求时,线程会进入到阻塞状态。
	当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新回到就绪状态
  1. sleep()、wait()、yield() 的区别

总的来说
Thread类的方法:sleep(),yield()
Object的方法:wait()和notify()、notifyAll()
sheep()、yield() 的区别:
(1) sleep()方法给其他线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会
(2) yield()方法只会给相同优先级或更高优先级的线程以运行的机会
(3) 线程执行sleep()方法后转入阻塞(blocked)状态,而执行yield()方法后转入就绪(ready)状态
sheep()、wait()的区别
(1) sleep必须捕获异常,而wait不用。(Object中的都不用)
(2) sleep睡眠时会保持对象锁,而wait会释放对象锁。
详情:Java线程状态以及 sheep()、wait()、yield() 的区别

  1. 说出数据连接池的工作机制是什么?

调用:客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为 忙。如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量由配置的最大连接数决定。
释放:当使用的池连接调用完成后,池驱动程序将此连接表记为空闲, 其他调用就可以使用这个连接。

  1. 简述synchronized和java.util.concurrent.locks.Lock的异同 ?
    (Lock一般使用ReentrantLock实现类)

(1) 都是独占锁。 但synchronize加锁和解锁的过程自动进行,易于操作,但不够灵活;而ReentrantLock需要手动进行,不易操作,但非常灵活
(2) 都可重入。但synchronize加锁和解锁自动进行,不必担心最后是否释放锁;而ReentrantLock需要手动进行,且次数需一样,否则其他线程无法获得锁。
(3) synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock可以相应中断
(4) ReentrantLock还可以实现公平锁机制。(公平锁:锁上等待时间最长的线程将获得锁的使用权)
详情:一文彻底理解ReentrantLock可重入锁的使用

  1. Class.forName的作用?为什么要用?

Class.forName常见的场景是在数据库驱动初始化的时候调用。
Class.forName本身的意义是加载类到JVM中。 一旦一个类被加载到JVM中,它的静态属性就会被初始化,在初始化的过程中就会执行相关代码(比如静态代码块),从而达到"加载驱动的效果"
详情:深入浅出Java类加载过程

  1. 当一个线程进入某对象被synchronized修饰的方法后,其它线程是否可进入此对象的其它方法

这要看情况而定(看锁是加在类上还是对象上),如果该对象的其他方法也是有synchronized修饰的,那么其他线程就会被挡在外面。否则其他线程就可以进入其他方法。
详情:Java中Synchronized的用法(简单介绍)

  1. 介绍5个你最常见到的runtime exception。

NullPointerException 空指针异常
ArithmeticException 算术异常,比如除数为零
ClassCastException 类型转换异常
ConcurrentModificationException 同步修改异常,遍历一个集合的时候,删除集合的元素,就会抛出该异常
IndexOutOfBoundsException 数组下标越界异常



下一篇:【JAVA面试题整理】_JavaSE_下

你可能感兴趣的:(笔记,java,面试,多线程,jvm,编程语言)