Java面试题复习

Java面试题

Java基础

JRE与JDK

什么是面向对象

面向对象的特点

封装:封装就是隐藏对象的属性和实现细节,仅对外公开接口。例如将类属性私有化,然后提供特定方法调用。
继承:继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
多态:多态同一个行为具有多个不同表现形式或形态的能力。如方法重载和重写

方法重载和重写

重载overload和重写override都是java多态的体现,重载用于一个类中同名方法拥有不同的参数列表。重写发生在子类与父类之间,重写方法可以改变返回值的类型,不能比父类被重写方法声明更多的异常。

== 和 equals

==如果比较的是基本数据变量:比较两个变量保存的数据是否相等(不一定要类型相同)
如果比较的是引用数据变量:比较两个对象的地址值是否相等。

equals:如果没有重写比较的是地址是否相等,重写后比较内容是否相等

&和&&

&:位运算与,不管成功与否都会吧判断条件全部执行
&&:逻辑与也是短路与及如果第一个条件不成立则不用执行第二个条件

String和StringBuild/StringBuffer的区别

STRING的长度是不可变的,STRINGBUFFER的长度是可变的。如果你对字符串中的内容
经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer
的toString()方法

Object类的常用方法

equals() // 比较对象的地址值是否相等,如果子类重写,则比较对象的内容是否相等;
hashCode() // 获取哈希码 
toString() // 把数据转变成字符串 
clone() // 创建并返回此对象的副本。 
wait() // 多线程中等待功能 
notify() // 多线程中唤醒功能 
notifyAll() // 多线程中唤醒所有等待线程的功能 

权限修饰符

在这里插入图片描述

抽象类和接口的区别

类型Abstract classinterface
继承抽象类可以继承一个类实现多个接口(单继承,多实现);子类只可以继承一个抽象类接口只可以继承接口;子类可以实现多个接口
构造方法可以定义构造方法;可以有抽象方法和具体方法,也可以没有抽象方法接口是抽象的,没有构造方法,且方法都是默认时抽象方法,但是jdk1.8,接口中的方法可以具体实现,用default关键字
实现方法子类使用extend关键字来继承抽象类;如果子类不是抽象类的话,它需要提供抽象类中所有声明方法的实现子类使用implements来实现接口,子类需要提供接口中所有声明的方法的实现
作用把相同的东西提取出来,即代码复用对类的行为进行约束,降低耦合

1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中可以包含静态方法,接口中不能包含静态方法
5. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
6. 一个类可以实现多个接口,但只能继承一个抽象类。

Java创建对象的方式

  1. 通过new语句实例化话对象
  2. 通过反射机制创建对象:(三种获取class类)
    Class.forName(类的路径);类名.Class;实例.getClass()
  3. 通过clone()方法创建一个对象
  4. 通过反序列化的方式创建对象

如何实现对象克隆

  1. 实现cloneable接口并重写Object类中的clone()方法
  2. 实现serializable接口通过对象的序列化和反序列化实现克隆

Java中有几种类型的流

字节流和字符流。字节流继承于InputStream、OutputStream,字符流继承于Reader、Writer。

冒泡排序

public static int[] mysort(int[] list) {
    int temp = 0;
    for (int i = 0;i<list.length - 1;i++) {
        for (int j = 0;j<list.length - i - 1; j++) {
            if (list[j] > list[j+1]) {
                temp = list[j];
                list[j] = list[j+1];
                list[j+1] = temp;
            }
        }
    }
    return list;
}

二分查找

public static int binarySearch(int target, int[] a) {
    int low = 0;
    int high = a.length - 1;
    while(low <= high) {
        int mid = (low + high) / 2;
        if (a[mid] > target) {
            high = mid - 1;
        } else if (a[mid] < target) {
            low = mid + 1;
        } else {
            return mid;
        }
    }
        return -1;
}

打印质数

public static int primeNum(int range) {
    int count = 0;
    for(int i = 2;i <= range; i++) {
        for(int j = 2; j <= i;j++) {
            if(j<i && i%j==0) {
                break;
            } else if (j==i){
                System.out.println(i);
                count++;
            }
        }
    }
    return count;
}

异常

Java中的异常处理机制的简单原理和应用

当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都java.lang.Thowable的子类。

error和exception的区别

Error:程序无法处理的系统错误,编译器不做检查;是jvm需要担负的责任。
Exception:程序可以处理的异常,捕获后可能恢复;
RuntimeException(非受检异常)是程序应该负担的责任;
Checked Exception (受检异常)可检查异常时Java编译器应该负担的责任。

throw 和 throws 的区别

throw:

  1. 出现在方法体,后面跟异常类对象名。
  2. 只能抛出一个异常对象名。
  3. 表示抛出异常you该方法类的语句来处理
  4. 执行throw一定出现了某种异常。
    throw常用于自定义异常

throws:

  1. 出现在方法名,后面跟异常类名。
  2. 可以跟多个异常类名用逗号隔开
  3. 表示抛出异常由该方法的调用者处理
  4. throws表示有出现异常的可能性,并不一定出现这些异常

常见的异常类有哪些?

  • ArithmeticException(算术异常)
  • ClassCastException (类转换异常)
  • IllegalArgumentException (非法参数异常)
  • IndexOutOfBoundsException (下标越界异常)
  • NullPointerException (空指针异常)
  • SecurityException (安全异常)

final、finally、finalize的区别

final 的用途
final 修饰的类叫最终类,该类不能被继承。例如String
final 修饰的方法不能被重写,但能够重载
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

finally
finally在异常处理时提供 finally块来执行任何清除操作。如果有finally的话,则不管是否发生异常,finally语句都会
被执行。一般情况下,都把关闭物理连接(IO流、数据库连接、Socket连接)等相关操作,放入到此代码块中。

finalize
finalize方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要清理工作。
finalize() 方法是在垃圾收集器删除对象之前被调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。 一般情况下,此方法由JVM调用,程序员不要去调用!

容器

Collection和Collections的区别

Collection是一个接口,它是Set、List等容器的父接口;Collections是个一个工具类,提供了一系列的静态方法来辅助容器操作,这些方法包括对容器的搜索、排序、线程安全化等等。

List、Set、Map是否继承自Collection接口

List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

List、Map、Set三个接口存取元素时,各有什么特点

List以特定索引来存取元素,可以有重复元素。Set不能存放重复元素(用对象的equals()方法来区分元素是否重复)。Map保存键值对(key-value pair)映射,映射关系可以是一对一或多对一。

ArrayList和Vector的区别

  1. 同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。
  2. 数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半。

HashMap和Hashtable的区别

  1. Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的。
  2. 只有HashMap可以让你将空值作为一个表的条目的key或value
  3. Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Mapinterface的一个实现。

什么是java序列化,如何实现java序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的
对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时
所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,
implementsSerializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)
来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的
writeObject(Objectobj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

多线程

多线程程序有几种实现方式?

两种实现方法:一种是继承Thread类;另一种是实现Runnable接口。两种方式都要通过重写run()方法来定义线程的行为,推荐使用后者,因为Java中的继承是单继承,一个类有一个父类,如果继承了Thread类就无法再继承其他类了,显然使用Runnable接口更为灵活。
Java 5以后创建线程还有第三种方式:实现Callable接口

sleep()和wait()有什么区别

sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监
控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定
池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行
状态。

启动一个线程是用run()还是start()?

启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM
调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。

同步有几种实现方法,都是什么

synchronized,wait与notify

线程池都有哪些状态?

1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3.阻塞(BLOCKED):表示线程阻塞于锁。
4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5.超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
6.终止(TERMINATED):表示该线程已经执行完毕。

设计模式

单例设计模式

数据库

事务的四大特性ACID

  1. 原子性(Atomicity):数据库中原子性强调事务是一个不可分割的整体,事务开始后所有操作要么全部成功,要么全部失败,不可能停滞在中间某个环节。如果事务执行过程中出错就会回滚到事务开始前的状态,所有的操作就像没有发生一样不会对数据库有任何影响。
  2. 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态,即一个事务执行之前和执行之后都必须处于一致性状态。拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还是5000,这就是事务的一致性。
  3. 隔离性(Isolation):当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离,比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转入钱。
  4. 持久性(Durability):一个事务一旦被提交,则对数据库的所有更新将被保存到数据库中,不能回滚。

事务的隔离级别

计算机网络

OSI七层模型

前端

JSP

Java Web

Servlet的生命周期

加载和实例化、初始化、处理请求以及服务结束。
生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。
Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX
方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。

forward()与redirect()的区别

前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳
转,浏览器将会得到跳转的地址,并重新发送请求链接。

什么情况下调用doGet()和doPost()?

Jsp页面中的form标签里的method属性为get时调用doGet(),为post时调用doPost()。

框架

Spring

控制翻转ioc

面向切面aop

SpringMVC

Mybatis

Spring Boot/Spring Cloud

什么是 spring boot?

通过Spring Boot,可以轻松地创建独立的,基于生产级别的Spring的应用程序,您可以“运行”它们。大多数Spring Boot应用程序需要最少的Spring配置。

为什么要用 spring boot?

spring boot 核心配置文件是什么?

application.properties
application.yml

spring boot 配置文件有哪几种类型?它们有什么区别?

spring boot 有哪些方式可以实现热部署?

spring-boot-devtools
Spring Loaded
Jrebel
模版热部署

spring boot集成mybatis

mybatis-spring-boot-starter

spring boot集成mysql

mysql-connector-java

JVM

jvm的内存布局

Java 8 虚拟机规范规定,Java 虚拟机所管理的内存将会包括以下几个区域:

程序计数器(Program Counter Register)
Java 虚拟机栈(Java Virtual Machine Stacks)
本地方法栈(Native Method Stack)
Java 堆(Java Heap)
方法区(Methed Area)

GC是什么?为什么要有GC

GC是垃圾收集的意思(GabageCollection),内存处理是编程人员容易出现问题的地方,忘记或者错
误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用
域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我可以帮你复习Java基础面试题。以下是一些常见的Java基础面试题及其答案: 1. Java中的基本数据类型有哪些? 答:Java中的基本数据类型包括byte、short、int、long、float、double、boolean和char。 2. Java中的包装类是什么? 答:包装类是一种将基本数据类型封装成对象的方式。Java提供了对应于每个基本数据类型的包装类,如Integer、Double、Boolean等。 3. Java中的String类是可变的吗? 答:String类是不可变的,即一旦创建就不能被修改。如果需要对字符串进行修改操作,可以使用StringBuilder或StringBuffer类。 4. Java中的final关键字有什么作用? 答:final关键字可以用来修饰类、方法和变量。当修饰类时,表示该类不能被继承;当修饰方法时,表示该方法不能被重;当修饰变量时,表示该变量的值不能被修改。 5. Java中的抽象类和接口有什么区别? 答:抽象类是一种不能被实例化的类,它可以包含抽象方法和非抽象方法。接口是一种完全抽象的类,它只能包含抽象方法和常量。一个类可以实现多个接口,但只能继承一个抽象类。 6. Java中的异常处理机制是什么? 答:Java中的异常处理机制通过try-catch-finally语句块来实现。当可能发生异常的代码放在try块中,如果发生异常,则会被catch块捕获并进行处理,最后无论是否发生异常,都会执行finally块中的代码。 7. Java中的多线程是如何实现的? 答:Java中实现多线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。通过重Thread类的run()方法或实现Runnable接口的run()方法来定义线程的执行逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值