java三年面试题(基础知识篇)

1. java面向对象的三大特性?

封装:

将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
代表实现:javaBean
优点:隐藏内部细节,只通过规定的方法访问数据,保证安全性; 低耦合。
缺点:不便与深度调试
实现方法:访问修饰符(private,无修饰符,protected,public)

访问修饰符

本类

同包

子类

其他

private

v


v

v

protected

v

v

v

public

v

v

v

v

继承:

将相同特征的数据和方法抽象到父类中,子类通过继承便有了父类的特征。
代表实现:extends,implements
优点:代码复用,维护性增强,类与类之间的关系是多态的前提。
缺点:耦合度增强
实现方法:通过extends,implements继承父类信息和方法,可重写父类方法。
方法重写:相对继承而言,子类中对父类已经存在的方法进行区别化的修改。但是(返回值类型、方法名、参数类型及个数)不允许变化。

多态:

多态性是对象多种表现形式的体现。
代表实现:1,重写和重载 2,接口 3,抽象类和抽象方法
优点:提高代码拓展性
缺点:无法直接访问子类特有的成员
实现方法:1,重写和重载 2,接口 3,抽象类和抽象方法

2. JRE和JDK

JRE: Java Runtime Environment
是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。

JDK:Java Development Kit
是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。

3. java 重载和重写

重载(overload):

对于类的方法(包括从父类中继承的方法),方法名相同,参数列表不同的方法之间就构成了重载关系。
注意:

1.参数的类型,参数的个数,参数的顺序。这三者只要有一个不同就叫做参数列表不同。
2.重载关系不一定发生在同一类中。子类中的某个方法和父类中继承下来的方法也可以发生重载的关系。

覆盖 (override):也叫重写,就是在当父类中的某些方法不能满足要求时,子类中改写父类的方法。使用super调用父类实现。

注意:
1、子类和父类的方法名称,参数列表,返回类型必须完全相同,而且子类方法的访问修饰符的权限不能比父类低(三同一不低)。

2、子类方法不能抛出比父类方法更多的异常。即子类方法所抛出的异常必须和父类方法所抛出的异常一致,或者什么也不抛出;

3、static,private,final修饰的方法是无法覆盖的。

相同点:
  1. 都是java多态性质的体现
  2. 方法名都相同
  3. 都可以用于抽象方法和非抽象方法之间
不同点:

1.定义区别:

①重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。

②重写是指在派生类中重新对基类中的函数重新实现。即函数名和参数都一样,只是函数的实现体不一样。

2.类的关系区别

覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。

3.产生方法区别

覆盖只能由一个方法或只能由一对方法产生关系(父类的一个方法只能被子类重写一次);重载是多个方法之间的关系(一个方法可以在所有的类中可以被重载多次)。

4.参数列表要求区别

覆盖要求参数列表相同;重载要求参数列表不同。

5.调用方法区别

重写关系中,调用方法体是根据对象的类型来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。

6.返回值的区别
重写返回值必须一致;重载则无此要求(但不能出现只是返回值不同的重载)。

7.权限区别
方法重写对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。

4. Object类

java.lang.Object 是java类中顶级类。

  • equals()
public boolean equals(Object obj) {
        return (this == obj);
    }
  • hashCode()
  • toString()
public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
  • getClass()
  • notify()
  • notifyAll()
  • wait()
  • clone()
  • finalize()

5. 基本类型及封装类

八种基本数据类型:int、short、float、double、long、boolean、byte、char。

封装类分别是:Integer、Short、Float、Double、Long、Boolean、Byte、Character。

6. equals与==的区别

“equals”
基本数据类型:没有equal方法;
引用数据类型:八种基本数据类型的包装类都覆写了equals方法,因此equals比较的是内容;其他引用数据类型如果没有覆写equals方法,则判断是否指向同一个引用。

“==”
基本数据类型:判断值是否相等;
引用数据类型:判断是否指向同一个引用。

拓展:
        String str1 = "123";
        String str2 = new String("123");
        String str3 = new String("123");
        System.out.println(str1 == str2);  //false
        System.out.println(str1.equals(str2));  //true
        System.out.println(str2==str3);  //false
        System.out.println(str2.equals(str3));  //true

7. hashCode()的作用

public int hashCode() {
     int h= hash;
     if (h== 0 && value.length > 0) {
        char val[] = value;
        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
     return h;
 }

hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的。
如Set在add一个对象时,首先比对hashcode,如果hashcode相同则表明set中已包含相同的对象,如果hashcode不同则调用equals方法比较。
注意:重写对象equals方法时,同时要重写hashcode();由于默认的hashcode方法是根据对象的内存地址经哈希算法得来的,显然此时s1!=s2,故两者的hashcode不一定相等。

8. java常用包

包名

内容

Java.applet

提供创建applet小程序所需要的类

Java.awt

包含用于创建用户界面和绘制图形图像的所有类

Java.io

提供与输入输出相关的类

Java.beans

包含与开发javaBeans相关的类

Java.lang

提供java语言程序设计的基础类

Java.net

提供实现网络操作相关的类

Java.nio

为输入输出提供缓冲区的类

Java.text

提供处理文本、日期、数字和消息的类和接口

Java.util

提供处理日期、时间、随机数生成等各种使用工具的类

Javax.net

提供用于网络应用程序的类、网络应用扩展类

Java.swing

提供一组与AWT功能相同的纯java的组件类

java.math

包括基本的浮点库、复杂运算以及任意精度的数据运算

java.rmi

远程方法调用

java.security

Java加密体系

java.sql

数据库支持

java.time

jdk8新的时间处理类(更高效,更安全)

9. 抽象类和接口

参数

抽象类

接口

默认实现

可以有默认方法实现

完全抽象,不能有实现

实现

entends继承,如果子类非抽象,需要实现抽象类所有声明的方法实现

implements来实现接口,它需要提供接口中所有声明的方法的实现

构造器



与类区别

不能实例化

完全不同的类型

访问修饰符

public,protected,default

默认public,不可以使用其他

main方法

可以有,并且可运行

没有

多继承

不可

可以

速度


稍慢

添加新方法

方便,可以指定默认实现

不便,需要修改所有实现类

10. 成员内部类,局部内部类,匿名内部类,静态内部类

成员内部类是最普通的内部类,它的定义为位于另一个类的内部,成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。

部内部类是定义在一个方法或者一个作用域里面的类,它和成员内部类的区别在于局部内部类的访问仅限于方法内或者该作用域内。局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。

匿名内部类能够在实现父类或者接口中的方法情况下同时产生一个相应的对象。匿名内部类是唯一一种没有构造器的类。应用举例:监听事件

静态内部类也是定义在另一个类里面的类,只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,并且它不能使用外部类的非static成员变量或者方法。

11. final、finally、finalize的区别

final: java中的关键字。修饰类不能被继承;修饰方法不能被重载/重写;修饰变量不能修改值。

finally: java异常处理机制的一部分,保证finally块中的内容在结束时一定能被运行。

finalize:类似与C/C++中的析构函数,只是形式上模仿。保证在GC该对象之前,首先调用finalize题内的内容。

拓展:
finalize流程:
当对象变成(GC Roots)不可达时,GC会判断该对象是否覆盖了finalize方法,若未覆盖,则直接将其回收。
否则,若对象未执行过finalize方法,将其放入F-Queue队列,由一低优先级线程执行该队列中对象的finalize方法。
执行finalize方法完毕后,GC会再次判断该对象是否可达,若不可达,则进行回收,否则,对象“复活”。

12. java集合

java三年北京面试 java面试题三年_java三年

13. ArrayList和LinkedList的区别

ArrayList底层使用数组进行存储,插入时首先检查length是否够用,不够用扩容,然后复制数组到新的数组。因此ArrayList频繁插入时的性能较低。但是数组的底层是顺序表存储,这一点的好处就是查询速度快。

LinkedList底层使用链接表进行存储,对于插入,删除等操作性能较优越,但是查询效率不高。

14. HashSet和TreeSet的区别

HashSet底层使用Hash表实现,插入数据时需要借助hashcode()和equals();允许放入null值;集合无序。

TreeSet底层使用二叉树实现;不允许null值;集合有序。

15. Deque,PriorityQueue和ConcurrentLinkedQueue区别

Deque:双端队列,允许两端进行入队出队操作。

PriorityQueue:优先级队列,底层使用堆实现,借助优先级比较决定出队顺序。

ConcurrentLinkedQueue:线程安全队列。

15. HashMap,HashTable和ConcurrentHashMap的区别

两点区别:线程安全,null,底层原理
HashMap是非线程安全的。
HashTable是线程安全的。
ConcurrentHashMap是HashTable的优化版,线程安全。

HashMap支持key,value存入null值 。
HashTable不支持。
ConcurrentHashMap不支持。

HashMap jdk1.8以前使用数组+链接表,jdk1.8之后使用数组+红黑树。
HashTable 使用数组+链接表。
ConcurrentHashMap jdk1.8之前Segment+HashEntry,sychronized做线程安全;jdk1.8之后Node 数组+链表+红黑树,使用 synchronized 和 CAS 来操作。

16. WeakHashMap和IdentityHashMap

WeakHashMap: 弱键映射,允许释放映射所指向的对象;特殊用途使用;如果键没有被指向,则键可以被GC释放。

IdentityHashMap:使用==替换equals()比较对象。

17. java IO 分类

◎ 基于字节操作的I/O接口:InputStream和OutputStream。

◎ 基于字符操作的I/O接口:Writer和Reader。

◎ 基于磁盘操作的I/O接口:File。

◎ 基于网络操作的I/O接口:Socket。

18. 字节流和字符流的区别

  1. 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
  2. 字节流默认不使用缓冲区;字符流使用缓冲区。
  3. 字节流通常用于处理二进制数据,实际上它可以处理任意类型的数据,但它不支持直接写入或读取Unicode码元;字符流通常处理文本数据,它支持写入及读取Unicode码元。
  4. 底层设备永远只接受字节数据。

19. 反射

定义:动态加载对象,并对对象进行剖析。在Java中的反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。

作用:通过配置文件来动态配置和加载类,以实现软件工程理论里所提及的类与类,模块与模块之间的解耦。

所属包: Java.lang.reflect

功能:
1.动态检查/构建一个对象。
2.动态检查/调用一个类的方法或属性。
3.动态代理。