Java基础面试题

简介

Java特点

Java面向对象的三大特征

封装、继承、多态

Java中实现多态的机制是什么?

父类持有子类的实例化对象。有一个前提,子类必须覆写父类的相关方法。

new 一个对象的过程和 clone 一个对象的过程区别

接口与类区别

类是对象的抽象,接口是功能的抽象。
类可以直接实例化,接口可以持有实现该接口的实例化对象。

抽象类和接口的区别?

  • 实例化。抽象类只能继承不能实例化;接口可以通过匿名类来实例化,或持有子类对象。
  • 实现。抽象类通过继承实现;实现接口实现。
  • 构造器。抽象类有;接口没有构造器。
  • 修饰符。抽象类可以是除private外的其他;接口只能是public。
  • 继承。抽象列只能继承一个;可以实现多个接口。
  • 成员变量。抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的。
  • 静态资源。接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  • 实现方法。抽象类中可以实现部分方法,接口不行。

基本数据类型

基本数据类型都有哪些各占几个字节

byte 1
char 2
short 2
int 4
float 4
double 8
long 8
boolean 1

String

String是引用类型。他是final的。

面向对象

接口与抽象类区别

  1. 抽象类是用来封装子类的通用特性的 ;接口是抽象方法的集合。
  2. 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
  3. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
  4. 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  5. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。

异常

Throwable
Java中所有异常的根类是:java.lang.Throwable。

异常分类

大类上分Error和Exception。

Exception又分:运行时异常(Runtime Exception),又称系统异常和受检查的异常(Checked Exception ),又称普通异常。

catch里面又return

Java异常有一个原则,如果catch里面遇到return或异常或其他任何能使方法终止的情况。都会先去执行finally里面的内容,然后再回来进行return或退出方法的操作;如果finally里面也有return,那么久不会再回到catch里面了。

List

一个是存储单列数据的集合,List 中存储的数据是有顺序,并且允许重复。

ArrayList实现原理

ArrayList 内部是用Object[]实现的。如果构造方法为空,则以系统默认的数值确定数组大小(为0);如果传入int值,就以传入int值确定;如果传入集合,就调用集合toArray()方法,将该数组结合直接复制给内部数组。
自动扩容,如果小于等于常量值的一半,就扩一半,如果超过,就扩需要扩容的一半。
删除机制:删除一个,将其后的通过System.arraycopy();将后面的整体向前移一位,将最后一个置为null。

List的三个子类的特点(2017-2-23)

  • ArrayList 底层结构是数组,底层查询快,增删慢。
  • LinkedList 底层结构是链表型的,增删快,查询慢
  • Vector 底层结构是数组 线程安全的,增删慢,查询慢

Map

保存相关联的键值对,是存储键值对式的双列数据的集合。数据是没有顺序的,其键是不能重复的,值是可以有重复的。

如何遍历Map

1 for Entry

for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
}

使用Iterator

Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
 
while (entries.hasNext()) {
    Map.Entry<Integer, Integer> entry = entries.next();
    System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); 
}

HashMap 、HashTable区别?

  • HashMap是线程不安全的,效率高。不允许键值重复,允许空键和空值;
  • HashTable 是线程安全的集合,不允许null值作为一个 key值或者 Value值;

HashMap内部实现

HashMap,是数组链表。一个数组,每一项是一个链表。

Set

Set不保存重复元素。

常用数据操作

Comparator

Comparator.compare()
返回负是升序排序,O1 - O2,把大的放后面;返回正是倒序排序,O2 - O1,会把大的放前面。

集合的安全性问题

在集合中线程安全的只有:Vector 和 HashTable是。
Collections.synchronizedXXX()可以让对应的List,Map,Set成为安全的。
成为线程安全的都是在其核心方法上加上了synchronized。

并发集合和普通集合如何区别?

java 中有普通集合、同步(线程安全)的集合、并发集合。
普通集合通常性能最高,但是不保证多线程的安全性和并发的可靠性。
线程安全集合仅仅是给集合添加了 synchronized 同步锁,严重牺牲了性能,而且对并发的效率
就更低了。
并发集合则通过复杂的策略不仅保证了多线程的安全又提高的并发时的效率。
并发集合常见的有 ConcurrentHashMap、ConcurrentLinkedQueue等。并发集合位 于 java.util.concurrent 包 下 。

IO

Java中有几种类型的流

字节流和字符流。字节流继承于 InputStream 和 OutputStream,字符流继承于InputStreamReader 和OutputStreamWriter。

如何将一个java对象序列化到文件里

必须实现Serializable 接口,然后再需要的地方使用ObjectOutputStream和ObjectInputStream进行序列化和反序列化。

字节流和字符流的区别

在底层设备是只支持字节流的。由于字符流操作太常用,字符流是字节流的包装类。字符字节转化时,需要注意编码问题。本质上就是将字符转为该编码的字节形式。

依赖倒置

Robert Martin大师提出了面向对象设计原则----依赖倒置原则:

A. 上层模块不应该依赖于下层模块,它们共同依赖于一个抽象。  
B. 抽象不能依赖于具象,具象依赖于抽象。

例如:车和发动机。车不应该依赖具体的发动机,当需求变更换时是可以更换的。
实现抽象的具体肯定是要依赖抽象的,抽象不应该去依赖别的具体,应该依赖抽象。

控制反转

控制反转(IOC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。是一个思想概念,一般具体实现用:依赖注入。

在配置文件中进行配置,通过反射创建对象。将对象的控制权转移出去,交给IOC容器。原先车依赖具体发动机,转为车依赖IOC容器,动态生成。

依赖注入(DI),

依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。

Spring主要有三种:构造方法注入,setter注入,基于注解的注入。
注解的注入:主要通过两个概念来实现IoC,首先通过注解或配置文件,将对象和依赖对象都配置到某个XML文件中或注解来,然后通过架构中的BeanFactroy类,来自动实现上文所述注入过程。

参考

  • 一位求职者总结的面试小攻略 郭霖推荐

你可能感兴趣的:(面试及非技术技能)