"金三银四" 跳槽季, 网上出现了各种面试真题, 一时会让人眼花缭乱, 分不清最该看哪个, 小编耗时一星期为大家做了一些 java 面试的真题. 请准备好你的小本本
面向对象和面向过程的区别
. 面向过程
优点: 性能比面向对象高, 因为类调用时需要实例化, 开销比较大, 比较消耗资源; 比如单片机, 嵌入式开发, Linux/Unix 等一般采用面向过程开发, 性能是最重要的因素
缺点: 没有面向对象易维护, 易复用, 易扩展.
. 面向对象
优点: 易维护, 易复用, 易扩展, 由于面向对象有封装, 继承, 多态性的特性, 可以设计出低耦合的系统, 使系统更加灵活, 更加易于维护.
缺点: 性能比面向过程低.
java 的四个基本特性
抽象: 就是把现实生活中的某一类东西提取出来, 用程序代码表示, 我们通常叫做类或者接口. 抽象包括两个方面: 一个是数据抽象, 一个是过程抽象. 数据抽象也就是对象的属性. 过程抽象是对象的行为特征.
封装: 把客观事物封装成抽象的类, 并且类可以把自己的数据和方法只让可信的类或者对象操作, 对不可信的进行封装隐藏. 封装分为属性的封装和方法的封装.
继承: 是对有着共同特性的多类事物, 进行再抽象成一个类. 这个类就是多类事物的父类. 父类的意义在于抽取多类事物的共性.
多态: 允许不同类的对象对同一消息做出响应. 方法的重载, 类的覆盖正体现了多态.
重载和重写的区别
重载: 发生在同一个类中, 方法名必须相同, 参数类型不同, 个数不同, 顺序不同, 方法返回值和访问修饰符可以不同, 发生在编译时.
重写: 发生在父子类中, 方法名, 参数列表必须相同, 返回值小于等于父类, 抛出的异常小于等于父类, 访问修饰符大于等于父类; 如果父类方法访问修饰符为 private 则子类中就不是重写.
采用字节码的好处
Java 语言通过字节码的方式, 在一定程度上解决了传统解释型语言执行效率低的问题, 同时又保留了解释型语言可移植的特点.
所以 Java 程序运行时比较高效, 而且, 由于字节码并不专对一种特定的机器, 因此, Java 程序无须重新编译便可在多种不同的计算机上运行.
构造器 Constructor 是否可被 override
构造器不能被重写, 不能用 static 修饰构造器, 只能用 public,private,protected 这三个权限修饰符, 且不能有返回语句.
** 访问控制符 public,protected,private, 以及默认的区别 **
private 只有在本类中才能访问;
public 在任何地方都能访问;
protected 在同包内的类及包外的子类能访问;
默认不写在同包内能访问.
是否可以继承 String 类
String 类是 final 类故不可以继承, 一切由 final 修饰过的都不能继承.
String 和 StringBuffer,StringBuilder 的区别
. 可变性
String 类中使用字符数组保存字符串, private final char value[], 所以 string 对象是不可变的. StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类, 在 AbstractStringBuilder 中也是使用字符数组保存字符串, char[] value, 这两种对象都是可变的.
. 线程安全性
String 中的对象是不可变的, 也就可以理解为常量, 线程安全. AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类, 定义了一些字符串的基本操作, 如 expandCapacity,append,insert,indexOf 等公共方法. StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁, 所以是线程安全的. StringBuilder 并没有对方法进行加同步锁, 所以是非线程安全的.
. 性能
每次对 String 类型进行改变的时候, 都会生成一个新的 String 对象, 然后将指针指向新的 String 对象. StringBuffer 每次都会对 StringBuffer 对象本身进行操作, 而不是生成新的对象并改变对象引用. 相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升, 但却要冒多线程不安全的风险.
hashCode 和 equals 方法的关系
equals 相等, hashcode 必相等; hashcode 相等, equals 可能不相等.
Java 语言采用的编码方案
Java 语言采用 Unicode 编码标准, Unicode(标准码), 它为每个字符制订了一个唯一的数值, 因此在任何的语言, 平台, 程序都可以放心的使用.
抽象类和接口的区别
. 语法层次
抽象类和接口分别给出了不同的语法定义.
. 设计层次
抽象层次不同, 抽象类是对类抽象, 而接口是对行为的抽象. 抽象类是对整个类整体进行抽象, 包括属性, 行为, 但是接口却是对类局部 (行为) 进行抽象. 抽象类是自底向上抽象而来的, 接口是自顶向下设计出来的.
. 跨域不同
抽象类所体现的是一种继承关系, 要想使得继承关系合理, 父类和派生类之间必须存在 "is-a" 关系, 即父类和派生类在概念本质上应该是相同的. 对于接口则不然, 并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅是实现了接口定义的契约而已,"like-a" 的关系.
自动装箱与拆箱
. 装箱
将基本类型用它们对应的引用类型包装起来;
. 拆箱
将包装类型转换为基本数据类型;
Java 使用自动装箱和拆箱机制, 节省了常用数值的内存开销和创建对象的开销, 提高了效率, 由编译器来完成, 编译器会在编译期根据语法决定是否进行装箱和拆箱动作.
什么是泛型, 为什么要使用以及泛型擦除
泛型, 即 "参数化类型".
创建集合时就指定集合元素的类型, 该集合只能保存其指定类型的元素, 避免使用强制类型转换.
Java 编译器生成的字节码是不包涵泛型信息的, 泛型类型信息将在编译处理是被擦除, 这个过程即类型擦除. 泛型擦除可以简单的理解为将泛型 java 代码转换为普通 java 代码, 只不过编译器更直接点, 将泛型 java 代码直接转换成普通 java 字节码.
类型擦除的主要过程如下:
1)将所有的泛型参数用其最左边界 (最顶级的父类型) 类型替换.
2)移除所有的类型参数.
Java 中的集合类及关系图
List 和 Set 继承自 Collection 接口.
Set 无序不允许元素重复. HashSet 和 TreeSet 是两个主要的实现类. List 有序且允许元素重复. ArrayList,LinkedList 和 Vector 是三个主要的实现类.
Map 也属于集合系统, 但和 Collection 接口没关系. Map 是 key 对 value 的映射集合, 其中 key 列就是一个集合. key 不能重复, 但是 value 可以重复. HashMap,TreeMap 和 Hashtable 是三个主要的实现类.
SortedSet 和 SortedMap 接口对元素按指定规则排序, SortedMap 是对 key 列进行排序.
HashMap 实现原理
HashMap 基于 hashing 原理, 通过 put()和 get()方法储存和获取对象. 当将键值对传递给 put()方法时, 它调用键对象的 hashCode()方法来计算 hashcode, 让后找到 bucket 位置来储存值对象. 当获取对象时, 通过键对象的 equals()方法找到正确的键值对, 然后返回值对象. HashMap 使用 LinkedList 来解决碰撞问题, 当发生碰撞了, 对象将会储存在 LinkedList 的下一个节点中. HashMap 在每个 LinkedList 节点中储存键值对对象.
当两个不同的键对象的 hashcode 相同时会发生什么? 它们会储存在同一个 bucket 位置的 LinkedList 中. 键对象的 equals()方法用来找到键值对.
HashTable 实现原理
和 HashMap 一样, Hashtable 也是一个散列表, 它存储的内容是键值对 (key-value) 映射.
Hashtable 继承于 Dictionary, 实现了 Map,Cloneable,java.io.Serializable 接口.
Hashtable 的函数都是同步的, 这意味着它是线程安全的. 它的 key,value 都不可以为 null. 此外, Hashtable 中的映射不是有序的.
HashMap 和 HashTable 区别
1).HashTable 的方法前面都有 synchronized 来同步, 是线程安全的; HashMap 未经同步, 是非线程安全的.
2).HashTable 不允许 null 值(key 和 value 都不可以) ;HashMap 允许 null 值(key 和 value 都可以).
3).HashTable 有一个 contains(Objectvalue)功能和 containsValue(Objectvalue)功能一样.
4).HashTable 使用 Enumeration 进行遍历; HashMap 使用 Iterator 进行遍历.
5).HashTable 中 hash 数组默认大小是 11, 增加的方式是 old*2+1;HashMap 中 hash 数组的默认大小是 16, 而且一定是 2 的指数.
6). 哈希值的使用不同, HashTable 直接使用对象的 hashCode; HashMap 重新计算 hash 值, 而且用与代替求模.
ArrayList 和 vector 区别
ArrayList 和 Vector 都实现了 List 接口, 都是通过数组实现的. Vector 是线程安全的, 而 ArrayList 是非线程安全的.
List 第一次创建的时候, 会有一个初始大小, 随着不断向 List 中增加元素, 当 List 认为容量不够的时候就会进行扩容. Vector 缺省情况下自动增长原来一倍的数组长度, ArrayList 增长原来的 50%.
由于真题比较多, 小编就不一一写到文中, 除此之外, 还有 23 篇 Word 真题.
部分资源截图
QQ 截图 20190222172937.jpg
小编会将文中之外的真题全部打包, 发给你!
资源获取
转发后关注我
加群: 714526711 领取获取往期 Java 高级架构资料, 源码, 笔记, 视频. Dubbo,Redis, 设计模式, Netty,zookeeper,Spring cloud, 分布式, 高并发等架构技术
来源: http://www.jianshu.com/p/9c9ad53db31f