首页 > 编程语言 > 详细

Java基础面试题

时间:2020-04-01 00:45:09      阅读:162      评论:0      收藏:0      [点我收藏+]

1. 面向对象概念

  把要研究的事物抽象成对象处理。一个对象内部含有:数据值描述其状态、操作方法即对象的行为用于改变对象的状态。面向对象具有对象唯一性、分类型、继承性、多态性。自己的理解就是将一项活动抽象成一个个角色对象,通过内部的属性和方法彼此连接,构成整个活动。

2. 面向对象三特性

  继承

  封装

  多态:指允许不同类的对象对同一消息作出响应,即同一消息可以根据发送对象的不同而采用不同的行为方式。

 

3. String、StringBuilder、StringBuffer比较

·String被final修饰,因此是线程安全类且是不可变类。

区别

  运行速度:StringBuild>StringBuffer>String。String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

  线程安全:StringBuffer和String是线程安全的,StringBuilder线程不安全。

  应用场景:String适用于少量字符串操作的情况;StringBuilder:适用于单线程下的字符缓冲区进行大量操作的情况;StringBuffer适用于在字符串缓冲区进行大量操作的情况。

  

4. 元注解

——元注解作用是负责注解其他注解

  • @Target:修饰的对象范围,说明了Annotation所修饰的对象范围。
  • @Retention:该注解被被保留的时间长短。
  • @Documented:用于描述其它类型的annotation应该被作为被标注的程序成员的公共API。
  • @Inherited:阐述了某个被标注的类型是继承的,如果一个被Inherited修饰的注解类型作用于一个class,那么这个注解将作用于class的子类

——自定义注解

//自定义注解
[@Target]
[@Retention]
[@Documented]
[@Inherited]
public @interface [名称] {
    // 元素
}

 

——Java自带的注解

@Override: 标记方法,重写父类方法

@Deprecated: 标明某个类或方法过时

@SuppressWarnings:标明要忽略的警告

 

5. 抽象类&接口

参数 抽象类 接口
默认的方法实现 它可以有默认的方法实现 接口完全是抽象的。它根本不存在方法的实现
实现 子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现
构造器 抽象类可以有构造器 接口不能有构造器
与正常Java类的区别 除了你不能实例化抽象类之外,它和普通Java类没有任何区别 接口是完全不同的类型
访问修饰符 抽象方法可以有public、protected和default这些修饰符 接口方法默认修饰符是public。你不可以使用其它修饰符。
main方法 抽象方法可以有main方法并且我们可以运行它 接口没有main方法,因此我们不能运行它。(java8以后接口可以有default和static方法,所以可以运行main方法)
多继承 抽象方法可以继承一个类和实现多个接口 接口只可以继承一个或多个其它接口
速度 它比接口速度要快 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。
添加新方法 如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。

 

6. 深拷贝&浅拷贝

  •  浅拷贝:仅仅复制内存地址引用,而不复制对象实体。原地址的对象改变了,那么复制的对象也将改变。
  • 深拷贝:复制内存地址引用和对象实体,在计算机内新开辟了一块新的内存地址用于存放复制的对象。两个对象相互独立。

  实现深拷贝方式:

  • Serializable方式:通过java对象的序列化和反序列化的操作实现对象拷贝的一种比较常见的方式。本来java对象们都待在虚拟机堆中,通过序列化,将源对象的信息以另外一种形式存放在了堆外。这时源对象的信息就存在了2份,一份在堆内,一份在堆外。然后将堆外的这份信息通过反序列化的方式再放回到堆中,就创建了一个新的对象,也就是目标对象
  • Cloneable方式:核心是Object类的native方法clone()。通过调用clone方法,可以创建出一个当前对象的克隆体,但需要注意的是,这个方法不支持深拷贝。如果对象的成员变量是基础类型,那妥妥的没问题。但是对于自定义类型的变量或者集合(集合我还没测试过)、数组,就有问题了。你会发现源对象和目标对象的自定义类型成员变量是同一个对象,也就是浅拷贝,浅拷贝就是对对象引用(地址)的拷贝。这样的话源对象和目标对象就不是彼此独立,而是纠缠不休了。为了弥补clone方法的这个不足。需要我们自己去处理非基本类型成员变量的深拷贝。

7. 异常分类及处理

 技术分享图片

 

 

  • Error:指Java运行时系统内部错误和资源耗尽错误。如果出现这样的错误,应用程序不会抛出这类对象,除了告知用户,剩下的就是让程序经理安全的终止。
  • RuntimeException:运行时异常,可能在Java虚拟机正常运行期间抛出的异常的超类。一般是程序错误。
  • CheckedException:检查异常,一般是外部错误,发生于编译阶段。Java编译器会强制程序去捕捉此异常,即会出现要求你把这段可能出现异常的程序进行try catch。

  throws & throw

  • 位置:throws作用于函数上,后面跟一个或多个异常类;throw作用于函数内,后面跟着异常对象;
  • 功能:throws用来声明异常,并不一定会发生。throw抛出具体的问题对象,一定会抛出某种异常对象。

 

8. 八种基本数据类型及所占字节数

类型 byte char short int long  float double boolean
所占字节数 1 2 2 4 8 4 8 1

 

9. 内部类

  • 静态内部类:可以访问外部类所有静态变量和方法。其他类使用静态内部类内的变量和方法需要通过“外部类.内部静态类”的方式获取。
  • 成员内部类:成员内部类不能定义静态方法和变量,final修饰的除外。这是因为类初始化的时候初始化静态成员,如果允许成员内部类定义静态变量,那么初始化顺序有歧义。
  • 局部内部类:定义在方法中的类就是局部类。
  • 匿名内部类:匿名内部类必须继承一个父类或者实现一个接口,同时也没有class关键字。
  • new 类名或接口名(){
        重写方法;
    };     //注意分号
    //以上就是匿名内部类的格式,其实这整体就相当于是new出来的一个对象

     

10. equals & ==

  “==”对比两个对象时比较的是对象的内存地址,对比两个基本数据类型时,比较的是数值的大小。

  equals()如果没有重写,那么Object类中默认的是“==”实现的,与==效果相同。但是一般会重写equals方法,用来比较两个对象内容是否相同。

 

11. equal & hashcode

  equals()如果没有重写,那么Object类中默认的是“==”实现的,与==效果相同。但是一般会重写equals方法,用来比较两个对象内容是否相同。

  hashcode()代表这个对象的哈希码,但是会出现哈希冲突,即两个不同的对象但是哈希码相同。

  有这样的一个逻辑:如果两个对象equals相等(即对象内存地址相同),那么hashcode一定相等,反之则不然。

  【扩展】哈希算法:开发定址法、再哈希法、链地址法、建立一个公共溢出区。

 

12. JDK8新特性

  ① Lambda:Lambda允许把函数作为一个方法的参数。

  ② 方法引用:可以直接引用已有的Java类或对象的方法或构造器。

  ③ Data Time API:加强对日期和事件的处理。

 

13. final关键字

  ① 当final修改类时,该类成为最终类,无法被继承。简称为“断子绝孙类”。

  ② 当final修饰方法时,这个方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。

  ③ 当final修饰引用时

  • 如果引用为基本数据类型,则该引用为常量,该值无法修改;  
  • 如果引用为引用数据类型,比如对象、数组,则该对象、数组本身可以修改,但指向该对象或数组的地址的引用不能修改。
  • 如果引用时类的成员变量,则必须当场赋值,否则编译会报错。

14. volatile关键字o

  volatile关键字用来保证有序性和可见性。我们所写的代码并不会按照我们输入的顺序来执行,编译器会做重排序,CPU也会做重排序,这样的重排序是为了减少流水线阻塞的,提高CPU的执行效率。但需要满足happens-before规则,其中有一条就是:对一个变量的写操作先行发生于读操作。有序性就是通过插入内存屏障实现的。可见性:主内存、工作内存、JMM展开叙述。

 

15. Comparable & Comparator  示例参考

Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”

  • Comparable:排序接口,该接口只有一个compareTo(T o)函数。如果一个类实现了Comparator接口,就意味着该类支持排序。
  • Comparator:比较器接口,有两个方法compare(T o1, T o2)和equals(Object o)。如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

 

Java基础面试题

原文:https://www.cnblogs.com/qmillet/p/12609407.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!