Java后端面试题自我总结


前言

随着自己慢慢意识到要找工作,写个专项文章,总结各种Java面试题

一、Java基础篇

final和static的区别

1.final:
(1)修饰类:无法被继承

(2)修饰方法:
父类的final方法是public不可被子类重写,可被继承
父类的final方法是private,由于private不被继承,子类可以定义一个相同的方法

(3)修饰属性:
成员变量:表示常量,一般和static联合使用,被final修饰值不可变
基本数据类型:初始化后值不可变
引用数据类型:初始化后不能指向其他的对象

2.static:
(1)修饰方法:调用时用类名.方法名

(2)修饰变量:不可修饰局部变量,在对象之间共享值或者方便访问变量时使用static来修饰

(3)静态代码块:在类加载时执行

String a = “123”; String b = “123”; a==b 的结果?为什么??

String a = "123";
String b = "123";
System.out.println(a == b);
 
答案:true

友情学习链接link

二、web篇

java web 过滤器跟拦截器的区别和使用

1 、拦截器是基于java的反射机制的,而过滤器是基于函数回调

2 、拦截器不依赖与servlet容器,过滤器依赖与servlet容器。

3 、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

4 、拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。

5 、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

2.读入数据

三、Dubbo篇

四、实际经历

1.2021年5月20日面试小厂

进去问我,准备好了没有,然后给了我杯水
之后自我介绍,没有准备,随便介绍就结束了——————心真大啊

正式面试:
1、Java集合有哪些——————刚好背过

2、ArrayList和LinkedList的区别是什么。各自有什么特性,从他们里面获取最后一个元素的时间复杂度分别是多少?怎么在LinkedList里面插入一个元素!——————半凉

3、HashMap的底层是什么,怎么存放数据的,key存放在哪?——————半凉

4、linux的常用命令有哪些,查看文件用哪个指令——————半凉

5、MySQL的索引是什么,为什么这么快——————凉到太平洋,真不会

6、String工具类有哪些,哪个线程是安全的?——————没凉,稳

7、那为什么用StringBuilder不用String呢?——————答得一塌糊涂。凉裤了!

8、排序算法哪些,Conllections里面的那个sort()底层用的是哪种算法——————凉到北极了,不会

然后估计就觉得我不太合适,就面试结束了,可恶,连后续会联系你这样的例话都没有,哈哈哈



2.2021年5月21日面试小厂 上岸

受了昨天的打击,深深觉得自己的面试能力和算法能力都很糟糕,今天本来想取消面试的,后来想想,唉就当是积累面试经验吧!顶着广州35°的太阳,还是去了

稍微大点的公司就是不一样,还有笔试,哈哈,好,来吧

进去先是给我一份Java的笔试题,啊?还有试卷,算了,当期末考吧


一、不定项选择题

1.为了获取数组中的最后一个元素的值,假设你写了以下的代码,当你编译并运行它时,结果会如何?

public class MyAr {
   public static void main(String argv[]) {
       int[] i = new int[5];
       System.out.println(i[5]);
   }

package com.gdpu;

public class MyAr {
   public static void main(String argv[]) {
       int[] i = new int[5];
       System.out.println(i[5]);
   }

}
/**
* Exception in thread "main"
* java.lang.ArrayIndexOutOfBoundsException: 5
* 下标溢出
*/
/

}

a.输出值为0
b.在编译时出现一个错误
c.在运行时出现一个错误
d.输出字符串"null"

java中如何区分编译错误和运行错误


2.线程的处理必须写在哪个方法中?

a.notify()
b.join()
c.start()
d.run()


3.下列哪些是合法的变量名称?

a._ED3
b.#qz
c.mps.sz
d._34ms
e.93mz
f.iock_13
g.mw-z

小结:
1.标识符能包含的符号只有“_”和“$”

2.组成:26个英文字母(大、小写),数字,下划线,美元符号

3.标识符不能用数字开头

4.不能使用关键字和Java中的自带类名称做标识符


4.以下哪些情况能够中断一个线程的执行?

a.调用了线程的stop方法
b.程序通过调用System.exit(0)退出
c.另一个线程更高的优先级
d.调用了线程类中halt方法


5.Runnable接口中,含有下列哪个方法?

a.wait()
b.implementation()
c.execute()
d.run()


6.如果你尝试编译并运行下列代码,结果会如何?

public class As {
    int i = 10;
    int j;
    char z = 1;
    boolean b;

    public static void main(String[] args) {
        As a = new As();
        a.amethod();
    }

    public void amethod() {
        System.out.println(j);
        System.out.println(b);
    }
}
//成功运行
0
false

a.编译错误,j没有初始化
b.编译成功,运行失败且输出0
c.编译错误,z必须赋一字符值
d.编译成功,运行成功输出0
e.编译错误,b没有初始化


7.下列哪种可用于区分重载方法?

a.返回值的类型
b.方法的名称
c.方法的参数
d.方法的访问控制符


8.关于异常的处理,下列哪些描述是对的?

a.程序中抛出异常,要用关键字throw
b.如果程序没有异常处理,jvm会先抛出异常,再停止程序执行
c.利用try-catch-finally捕获异常时,允许使用多个catch
d.method抛出异常,要用关键字throw


9.下列哪些方法属于Vector类且作用是输入一个新的变量?

a.addElement
b.addItem
c.insert
d.append


10.如何载入JDBC驱动程序?

a.Class.Driver(String ClassName)
b.Class.setName(String ClassName)
c.Class.forName(String ClassName)
d.Class.Name(String ClassName)


二、简答题

1.Error、Exception、RuntimeException的区别,分别用在什么地方?

答:
在这里插入图片描述

a.Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形。应用程序不应该抛出这种类型的对象(一般是由虚拟机抛出)。

b.Exception是程序正常运行中可以预料的意外情况,可能并且应该被捕获,进行相应处理。

c.Exception又分为检查型异常和非检查型异常。所有RuntimeException的子类即为非检查型异常;Exception的其余子类都为检查型异常。


2.Java的哪些特性使得"一次编译,到处执行"成为可能?

Java也是一种高级语言,要让计算机执行你撰写的Java程序,也得通过编译程序的编译。但是Java编译程序并不直接将Java源代码编译为相依于计算机平台的0、1序列,而是将其编译为字节码

Java源代码的扩展名为.java,经过编译程序编译之后生成扩展名为.class的字节码。如果想要执行字节码文件,目标平台必须要安装JVM(java虚拟机),JVM会将字节码翻译为相依与平台的计算机指令,即:0、1序列。

学习链接


3.请你简述重载(Overloading)与重写(Override)的区别,并作出说明。

在这里插入图片描述
重载(Overloading)
重载发生在本类,方法名相同,参数列表不同,与返回值无关,只和方法名,参数列表,参数的类型有关.

重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不同。

(1):方法名必须相同

(2):方法的参数列表一定不一样。

(3):访问修饰符和返回值类型可以相同也可以不同。


重写(Overriding)
重写发生在父类子类之间,比如所有类都是继承与Object类的,Object类中本身就有equals,hashcode,toString方法等.在任意子类中定义了重名和同样的参数列表就构成方法重写.

重写(override):一般都是表示子类和父类之间的关系,其主要的特征是:方法名相同,参数相同,但是具体的实现不同。
重写的特征:

(1):方法名必须相同,返回值类型必须相同

(2):参数列表必须相同

(3):访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。

(4):子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。

(5):构造方法不能被重写,

4.一个类被定义为final,意味着这个类会怎么样?

表示该类不能被继承,是顶级类。


5.编一段代码,实现并在控制台输入一组数字,排序后再控制台输出。

package com.gdpu;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class InputAndSort{

    public static void main(String[] args) {
        List<Integer> l = new ArrayList<Integer>();//创建整型列表集合
        String str = null;
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//创建BufferedReader对象,该构造方法须传递一个InputStreamReader对象参数
//InputStreamReader须传递一个InputerStream对象参数,这里传递控制台作为InputStreamReader的构造参数以接收控制台输入。
//可记住这种格式,以后若要从控制台读取数据,这是一种不错的方法,可按照这个固定格式写。
        try {
            System.out.println("请输入一组数,一行一个!");
            while (!(str = br.readLine()).equals(""))//单独的回车键可结束输入
            {
                l.add(Integer.parseInt(str));
            }

        }
        //IO异常处理
        catch (IOException ioe) {
            ioe.printStackTrace();
        }

//        int len = l.size();
//        Object[] num = new Object[len];
//        num = l.toArray();
//        Arrays.sort(num);//对数组按升序排序
//        System.out.print("排序后的数组是:");
//        for (int i = 0; i < len; i++)
//            System.out.print(num[i] + " ");
//        System.out.print('\n');
            Collections.sort(l);
        for (int i : l){
                System.out.print(i+" ");
        }
    }
}

6.请列出你日常使用编程所用到的基本数据类型及常用的包,各五种。
在这里插入图片描述
 java.lang.*
  提供利用 Java 编程语言进行程序设计的基础类。最重要的类是 Object(它是类层次结构的根)和 Class(它的实例表示正在运行的应用程序中的类)。
  java.util.*
  包含集合框架、遗留的 collection 类、事件模型、日期和时间设施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组、日期Date类、堆栈Stack类、向量Vector类等)。集合类、时间处理模式、日期时间工具等各类常用工具包
  java.io.*
  Java的核心库java.io提供了全面的IO接口。包括:文件读写、标准设备输出等。Java中IO是以流为基础进行输入输出的,所有数据被串行化写入输出流,或者从输入流读入。
  java.net.*
  并非所有系统都支持 IPv6 协议,而当 Java 网络连接堆栈尝试检测它并在可用时透明地使用它时,还可以利用系统属性禁用它。在 IPv6 不可用或被显式禁用的情况下,Inet6Address 对大多数网络连接操作都不再是有效参数。虽然可以保证在查找主机名时 java.net.InetAddress.getByName 之类的方法不返回 Inet6Address,但仍然可能通过传递字面值来创建此类对象。在此情况下,大多数方法在使用 Inet6Address 调用时都将抛出异常。
  java.sql.*
  提供使用 JavaTM 编程语言访问并处理存储在数据源(通常是一个关系数据库)中的数据的 API。此 API 包括一个框架,凭借此框架可以动态地安装不同驱动程序来访问不同数据源。


7.在table数据表中增加"No_id"字段,数据类型char(12),不可空,并将其设定为UNIQUE约束,请写出命令请求。

alter table table1 add No_id char(12) not null UNIQUE
sql习题


三、正式面试

不得不说,这个老大哥面试官真的好人,我做得那么烂,还说我笔试答题还可以,然后问了我一些简单的问题。

1.你现在大三,为什么这么早就想实习?

2.你现在大三的话,对Java到了什么程度的了解?

3.你的ssm项目,你为什么会做,背景是什么?

4.那你一开始是怎么入手的呢?比如说怎么搭建起来的?

5.OK,你说你正在学SpringBoot,那它怎么创建的呢?

6.SpringBoot的启动类的三大注解,是怎么实现把ssm这么复杂的配置创建好的呢?

7.OK我看了下,你答题这边,写的也还都不错的,想问下你大三嘛,课程还多不多啊?

8.你的这个蓝桥杯省二等奖这个是什么比赛?

9.你在你上一段实习经历学到了什么?

然后,他说,可以给我一个实习的机会!!!!!

10.你有什么想问我的吗?然后给我介绍了目前公司的技术体系,嘻嘻,开心!


3. 2021年5月25日面试小厂

今天又顶着32°的太阳去珠江新城面试,自身实力不足,笔试没过,总结下笔试题。这份笔试题主要考了Java基础的多线程,JDBC,单例模式,全忘了,当经历了!!!

一、单选题

1.下面属于合法的java标识符的是( )

A. _dog

B. 5books

C. +static

D. -3.1459


2.Linux系统中如果你想列出当前目录以及子目录下所有扩展名为".txt"的文件,那么你可以使用的命令是( )

A. find . -name “*.txt”

B. ls *.txt

C. find . “.txt”

D. ls -d.txt


3.下面有关内核线程和用户线程说法错误的是?( )

A. 用户线程因I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行的机会

B. 内核线程只运行在内核态,不受用户态上下文的影响

C. 用户线程和内核线程的调度都只需要经过内核态

D. 内核线程有利于发挥多处理器的并发优势,但却占用了更多的系统开发


4.Java中用正则表达式截取字符串中的第一个出现的英文左括号之前的字符串,比如,广州市(天河区)(越秀区)(黄浦区),截取结果为:广州市。正则表达式为( )

A. “.*?(?=()”

B. “.*?(?=()”

C. “.*(?=()”

D. “.*(?=()”


5.关于SpringMVC的核心控制器DispatcherServlet的作用,以下说法错误的是( )

A. 它负责处理HTTP的请求

B. 加载配置文件

C. 实现业务操作

D. 初始化上下文应用对象ApplicationContext


6. 0.63432的数据类型是( )

A. flaot

B. double

C. Float

D. Double


7.下面程序的运行结果是( )

public class test7 {
    public static void main(String[] args) {
        Thread t = new Thread(){
            @Override
            public void run(){
                pong();
            }
        };
        t.run();

        System.out.print("ping");
    }

    static void pong() {
        System.out.print("pong");
    }
}

A. pingpong

B. pongping

C. pingpong 和 pongping 都有可能

D. ping


二、简答题

8.以下代码的执行结果是什么?

class HelloA {
    public HelloA(){
        System.out.println("HelloA");
    }
    {
        System.out.println("I'm A class");
    }
    static {
        System.out.println("static A");
    }

}

public class HelloB extends HelloA {
    public HelloB(){
        System.out.println("HelloB");
    }
    {
        System.out.println("I'm B class");
    }
    static {
        System.out.println("static B");
    }

    public static void main(String[] args) {
        new HelloB();
    }

答:
在这里插入图片描述


9.简述你所了解的设计模式

答:


10.简述一下你debug的方式
答:


三、代码题(三选二)

1、Java中编写多线程程序有几种实现方式,试着写出一个死锁案例代码或编写两个线程交替打印0-100的奇偶数


2、JDBC操作数据的步骤


3、用Java写一个单例式(懒汉式、饿汉式)

笔试没过,正式的面试连技术官都见不到,凉

总结

希望早日暴富!加油!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值