Java 面经
1. Java语言有哪些特点?
- 简单易学、有丰富类库
- 面向对象(低耦合、高类聚)
- 与平台性无关。
- 安全可靠、支持多线程
2. 有哪些数据类型
- 基本数据类型:常见的8种。byte、short、int、double、long、char、bool、float。
- 引用数据类型:数组、接口、类
3. equals与==的区别?
- ==在比较两个基本数据类型时,比较的是两个变量的值。比较引用数据类型时,比较的是存在堆中的地址值。
- equals在比较两个引用数据类型时,比较的时两个对象的内容是否相等。前提是要重写equals(),Object类使用equals()来比较时,默认是用等等来比较
4.String类常用的方法?
length()、charAt()、equals()、toString()、contains()、comparaTo()、indexOf()、subString()
5.Object类常用的方法?
toString()、equals()、hashCode()、wait()、clone()、getClass()、notify()
6.接口与抽象类的区别?
相同点:
- 接口和抽象类都不能实例化,都为与继承树的顶端。
- 接口和抽象类都有抽象方法,实现接口或者继承抽象方法的普通子类必须实现这些方法。
不同点:
- 抽象类定义的关键字是abstract class,接口定义的关键字是interface
- 属性上,抽象类可以有静态变量、常量和成员变量。接口只有常量。
- 抽象方法可以有普通方法,接口在jdk1.8之前只有抽象方法,jdk1.8之后增加了静态方法和默认方法。
- 抽象方法可以有构造方法,接口不可以有构造方法
- 抽象方法是单继承的,接口是多实现的
- 抽象方法在业务编程上更像一个模板,有自己的功能,而接口更像一种规范。
7.重写和重载的区别?
重写:
- 发生在父类与子类之间。
- 方法名、返回类型、参数列表必须相同
- 访问修饰符要大与等于父类方法。pubilc>protected>default>private
- 不能跑出范围比父类大的异常
- 若父类的访问修饰符是private,则子类不能重写该方法。
重载:
- 构造器不能重写,只能进行重载。
- 同名方法,参数列表不同(参数类型,参数个数,参数顺序)都不同,不能通过返回类型来判断是否是重载。
8.String、StringBuffer、StringBuilder的区别?
- String是不可变的,一个String对象从创建到销毁他的字符串序列都不会改变。
- StringBuffer和StringBuilder是可变的,可以通过append()、insert()、revers()来改变字符串序列,一旦的得到想要的字符串序列就可以通过toString()转变为String类型。
- StringBuffer和StringBuilder的区别在于线程是否安全,StringBuffer是线程安全的,StringBuilder是线程不安全,所以效率比较高一些。
9. 线程的创建方式有几种?
线程的创建方式有4种。
- 继承Thread类。
- 实现runnable接口
- 实现callable接口
- 线程池。
方式一:
- 创建继承Thread类的子类。
- 重写run方法。
- 创建Thread子类的实例对象,及创建线程对象
- 调用start()方法
10.说说对线程池的理解?
核心参数、处理流程、拒绝策略
核心参数:
- 核心线程数(corePoolSize)、等待队列(workQueue)、最大线程数(maxNumPoolSize)、拒绝策略(handler)、空闲线程存活时间(keepAliveTime)。
- 第一步:判断线程数是否达到核心线程数,如果没有达到则继续创建线程,否则进入下一步。
- 第二步:判断等待队列是否已满,如果没满继续让线程进入等待队列,否则进入下一步。
- 第三步:判断是否达到最大线程数,没有达到的话继续创建线程执行任务,否则进入下一步。
- 采用初始化线程池时指定的拒绝策略,拒绝执行该任务。
- 新建的线程处理完当前任务后,不会立刻关闭,而是继续处理等待队列中的任务。如果线程达到空闲存活时间,则将销毁一部分线程,将线程数收缩到核心线程数。
拒绝策略有四个:
- 让调用者自己执行任务
- 直接抛出异常
- 丢弃任务不做仍何处理
- 删除队列中最老的任务并把当前任务加到队列。
11.Java中常见的集合有哪些?
List、set、map。
============后面在更新