面试
JavaSE
基本概念
面向对象特征:
- 抽象:过程抽象,数据抽象,选择主题,忽略细节。
- 继承:新类继承原始类的特性。
- 封装:通过一个受保护的接口访问其他对象
- 多态:不同类对象对同一消息做出响应。
static关键字含义,是否可以覆盖private和static的方法?
含义:
- static表示一个成员变量或者成员方法在没有锁属的类的实例变量的情况下被访问。
是否可以覆盖: - 不能覆盖,static修饰的方法是编译时静态绑定的。方法覆盖时基于运行时动态绑定的。
String不可变的?
- String不可变因为在JDK中String类被声明为一个final类,且内部的value字节数字也是final的。
- 字符串可变的情况会引起严重安全问题,防止攻击者对字符串指向的对象的值进行更改。
类的创建
构造函数,构造函数重载?
构造函数:
- 当对象被创建时,构造函数会被调用。每一个类都有构造函数,当没有提供构造函数时,Java编译器会自动为这个类创建一个默认的构造函数
构造函数重载:
- 类似方法重载,可以存在多个构造函数,但构造函数的参数列表不同。【当存在有参构造函数时,Java编译器将不会为类创建默认的构造函数。此时不存在无参构造函数】
多态
重载和重写的区别:
重载:
- 同一个类里面两个或多个方法的方法名相同但参数不同的情况。
重写:(方法覆盖)
- 子类重新定义了父类的方法,方法覆盖必须有相同的方法名,参数列表和返回类型,访问修饰发可缩小而不可增大。覆盖着不会限制被覆盖方法的访问
多态
不同类的对象对同一消息做出响应。同一个消息根据发送对象的不同而采取多种不同的行为方式。
类的拓展
抽象类和接口的区别:
抽象类:
- 抽象类可以有构造方法。【但不能new对象】
- 抽象类可以有普通成员变量(实例变量和静态变量)。
- 抽象类中可以有普通方法。【任意访问修饰符】
接口:
- 接口不能有构造方法。【不能new对象,但可以声明接口型引用】
- 接口默认定义public static final,常量。【通过”接口名.变量名“调用】
- 接口中只有方法的声明,没有方法体。【Java 8 后可以有静态方法和默认方法】【静态方法和默认方法都是public的,Java 9 后也可以是private】
静态类和成员内部类的不同
静态内部类:
- 不依赖于外部类实例被实例化。
- 只能对外部类的静态成员(静态变量和方法)进行操作。
普通内部类:
- 需要外部类实例化后才能实例化。
- 可以对静态成员操作也可以对动态成员(实例变量和方法。)操作
基本方法
Object类的方法
- Object() //默认构造方法
- clone() //创建并返回此对象的一个副本
- equals(Object obj) //obj是否与本对象相等
- finalize() //当垃圾回收器不确定该对象的更多引用时,由对象的垃圾回收调用此方法。
- getClass() //返回一个对象的运行时类。
- hashCode() //返回该对象的哈希码值
- toString() //返回该对象的字符串表示
- notify() //唤醒在此对象监视器上等待的单个线程。
- notifyAll() //唤醒在此对象监视器上等待的所有线程。
- wait() //导致当前的线程等待,直到其他线程调用此对象的notify()或notifyAll()方法,或者超过指定时间
- wait(long timeout, int nanos) //导致当前的线程等待,直到其他线程调用此对象的notify()或notifyAll()方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
hashCode()和equals()方法的联系。(原则)
- equals相等的对象必须具有相同的哈希码。
- 相同的hashCode相同,它们equals不一定相同。
Comparable和comparator接口的作用与区别
Comparable接口:
- Java提供了Comparable接口,只包含一个compareTo()方法,给两个对象排序。
Comparator接口:
- 包含compare()方法,给输出参数序列排序。小于(-1),等于(0),大于(1)。
- 包含equals()方法,用来决定输入参数是否和comparator相等。只有当前输入参数也是一个comparator并且输入参数和当前comparator的排序结果相同时,才会返回true。
StringBuffer和StringBuilder
StringBuilder:
- 线程不安全
StringBuffer - 线程安全
- 修饰符多了Sychronized。
都可以对在原有对象上进行操作。
集合
List、Set、Map区别
List
- 特定索引存取元素,可以重复
Set
- 不能重复(用对象的equals()方法区别元素是否重复)
- 实现存在哈希存储O(1)和排序树(根据元素去重和排序)
Map
- 保存键值对映射(key-value)
- 实现存在哈希存储O(1)和排序树(根据key去重和排序)
ArrayList、Vector、LinkedList存储性能和特性
ArrayList
- 数组方式存储。
- 插入慢,查询快。
LinkedList
- 双向链表实现存储
- 插入快,查询慢
- 将内存中零散内存单元通过附加的引用关联起来,形成一个可以按序号索引的线性结构(相比链式存储和数组方式连续存储,内存利用率高)
Vector
- 数组方式存储。
- 插入慢
- 方法添加synchronized修饰,线程安全。
- 性能比ArrayList差
ArrayList和LinkedListed是非线程安全的,Vector是老版本容器。涉及线程安全时,使用工具类Collections中的synchronizedList方法将其转换为线程安全的容器后再使用。
Collection和Collections的区别
Collection:
- 集合类的上级接口,继承它的接口有List和Set。
Collections:
-针对集合的帮助类,提供静态方法实现各种集合的搜索、排序、线程安全话操作。