Java开发岗面试被提问的问题汇总(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

面试被提问的问题汇总


提示:以下是本篇文章正文内容,下面案例可供参考

一、Java 8的新特性是什么?

1、Lambda表达式;
2、方法引用;
3、默认方法;
4、新编译工具;
5、Stream API;
6、Date Time API;
7、Option;
8、Nashorn javascript引擎。

二、Java中如何通过代码读取文件夹下的所有文件

1.方法一

代码如下(示例):

public void listFilesForFolder(final File folder) {
    for (final File fileEntry : folder.listFiles()) {
        if (fileEntry.isDirectory()) {
            listFilesForFolder(fileEntry);
        } else {
            System.out.println(fileEntry.getName());
        }
    }
}

final File folder = new File("/home/you/Desktop");
listFilesForFolder(folder);

2.方法二(Java 8 具有 Files.walk API)

代码如下(示例):

try (Stream<Path> paths = Files.walk(Paths.get("/home/you/Desktop"))) {
    paths
        .filter(Files::isRegularFile)
        .forEach(System.out::println);
} 

三、数据库的事务是什么?ACID分别是什么?

事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
ACID是数据库事务的四大特性
1.原子性(atomicity,或称不可分割性)
2.一致性(consistency)、
3.隔离性(isolation,又称独立性)
4.持久性(durability)

四、Servlet的工作流程是什么样的?

  1. Web Client 向Servlet容器(Tomcat)发出Http请求
  2. Servlet容器接收Web Client的请求
  3. Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中。
  4. Servlet容器创建一个HttpResponse对象
  5. Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet 对象。
  6. HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息。
  7. HttpServlet调用HttpResponse对象的有关方法,生成响应数据。
  8. Servlet容器把HttpServlet的响应结果传给Web Client。

五、ioc是什么?具有哪些优点

  1. IOC:控制反转,是一种设计模式。
    第一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制。
    第二层含义是依赖注入:将相互依赖的对象分离,在Spring配置文件中描述他们的依赖关系,他们的依赖关系只在使用的时候才建立。简单来说就是不需要的NEW一个对象了。
  2. 第一,资源集中管理,实现资源的可配置和易管理。
    第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。

六、一个基本的form表单提交到数据库具体流程是怎样的?

  1. 设置form表单,发一个Ajax请求传给后端controller。
  2. 后端controller使用@requestbody成功接收,然后存到POJO实体类,然后调用service
  3. serviceimpl实现类调用dao
  4. dao使用xml的sql语句然后成功添加到数据库。

七、创建线程的几种方式?

  1. 继承Thread类创建线程类
  2. 通过Runnable接口创建线程类
  3. 通过Callable和Future创建线程

八、线程的几种状态?

  1. 新建状态(New):新创建了一个线程对象。
  2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权,即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。
  3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
  4. 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
  5. 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

九、异常有哪些?

异常主要分为:错误、一般性异常(受控异常)、运行时异常(非受控异常)

  1. 错误
    如果应用程序出现了Error,那么将无法恢复,只能重新启动应用程序,最典型的Error的异常是:OutOfMemoryError
  2. 受控异常
    这种异常属于一般性异常,出现了这种异常必须显示的处理,不显示处理java程序将无法编译通过。
    编译器强制普通异常必须try…catch处理,或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常。
  3. 非受控异常
    非受控异常也即是运行时异常(RuntimeException),这种系统异常可以处理也可以不处理,所以编译器不强制用try…catch处理或用throws声明,所以系统异常也称为unchecked异常。

十、JDBC连接数据库的步骤?

  1. 加载JDBC驱动程序:在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM
  2. 创建数据库的连接:向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。
  3. 创建一个Statement
  4. 执行SQL语句
  5. 遍历结果集
  6. 处理异常,关闭JDBC对象资源

十一、Object常用的方法有哪些?

  1. clone方法
    保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
  2. getClass方法
    final方法,获得运行时类型。
  3. toString方法
    该方法用得比较多,一般子类都有覆盖。
  4. finalize方法
    该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
  5. equals方法
    该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
  6. hashCode方法
    该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。
    一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
  7. wait方法
    wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。
    调用该方法后当前线程进入睡眠状态,直到以下事件发生。
    (1)其他线程调用了该对象的notify方法。
    (2)其他线程调用了该对象的notifyAll方法。
    (3)其他线程调用了interrupt中断该线程。
    (4)时间间隔到了。
    此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
  8. notify方法
    该方法唤醒在该对象上等待的某个线程。
  9. notifyAll方法
    该方法唤醒在该对象上等待的所有线程。

十二、创建Bean的几种方式?

  1. 用默认构造函数创建
    在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建
  2. 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
  3. 使用工厂中的静态方法创建对象时(使用某个类中的静态方法创建对象,并存入spring容器)

十三、HashTable和HashMap的区别?

  1. 继承的父类不同
  2. HashMap线程不安全,HashTable线程安全
  3. 包含的contains方法不同
  4. 是否允许null值
  5. 计算hash值方式不同
  6. 扩容方式不同(容量不够)
  7. 解决hash冲突方式不同(地址冲突)

十四、线程和进程的区别?

  1. 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
  2. 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
  3. 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
  4. 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。

十五、进程和线程的关系?

  1. 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
  2. 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
  3. 处理机分给线程,即真正在处理机上运行的是线程。
  4. 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体。

十六、线程怎么开启?

方法一:继承Thread

  1. 定义一个类继承Thread
  2. 重写run方法
  3. 创建线程对象
  4. 开启线程

方法二:实现Runnable接口

  1. 定义一个类实现Runnable接口
  2. 重写run方法
  3. 在main方法(线程)中,创建线程对象,并启动线程.
    ① 创建线程类对象:
    Thread thread = new Thread(myThread);
    ② 调用线程对象的start方法:
    thread.start();

方法三:实现Callable接口

  1. 定义一个类实现Callable接口
  2. 重写call方法
  3. 在main方法(线程)中,创建Callable对象,创建任务将Callable对象传进来,创建线程对象将任务传进来,并启动线程.
    ① 创建Callable对象:
    Callable c = new MyCallable();
    ② 创建任务将Callable对象传进来:
    FutureTask task = new FutureTask<>©;
    ③ 创建线程类对象:
    Thread thread = new Thread(task);
    ④ 调用线程对象的start方法:
    thread.start();

十七、怎么进入阻塞状态?

  1. sleep( )
    使线程在一定的时间内进入阻塞状态,不能得到cpu时间,但不会释放锁资源。指定的时间一过,线程重新进入可执行状态
  2. wait( )
    使线程进入阻塞状态,同时释放自己占有的锁资源,和notify( )搭配使用
  3. suspend( )
    使线程进入阻塞状态,并且不会自动恢复,必须其对应的resume( )被调用,才能使线程重新进入可执行状态
  4. yield( ) (特殊
    使得线程放弃当前分得的CPU时间,但是不使线程阻塞,即线程任然处于可执行状态,随时可能再次分得CPU时间。

其中sleep(),suspend(),rusume(),yield()均为Thread类的方法,wait()为Object类的方法

十八、使用sleep时为什么要抛异常?

为了让你的代码具有响应中断信号的能力
因为线程处于sleep时,对外界情况没有感知能力。
中断作用:让线程具有感知的能力。
sleep(),wait()等方法都需要你去处理中断异常,也就是需要你的代码能够响应中断。

十九、为什么要抛出异常?

编译时程序有可能会出现异常,如果出现异常,程序就会中断,但是你不想程序中断的话,就可以选择
捕获异常,做出处理,让程序可以运行下去。

二十、什么是数据库视图?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

二十一、一个字节存放最大的数字是?一个汉字是几个字节?一个字节可以存放几个十六进制数字?

  1. 一个字节有8位,有一位是符号位,所以最大二进制数为01111111,转为十进制数字是127。(最小为-128)
  2. 一个汉字是两个字节。
  3. 一个字节最多存放两个十六进制数字。

二十二、空指针异常是什么原因?

  1. 当一个对象不存在时又调用其方法会产生异常    obj.method() // obj对象不存在
  2. 当访问或修改一个对象不存在的字段时会产生异常    obj.method()  // method方法不存在

二十三、普通for循环遍历集合可以用continue跳出本次循环进入下一次循环,foreach循环如何跳出本次循环进入下一次?

普通for循环遍历集合:可以使用break跳出整个for循环,使用continue跳出本次循环。
增强for循环:可以使用break跳出整个for循环,使用continue跳出本次循环。
foreach循环:这个循环里面,break和continue都不管用了,需要使用return,这个只能跳过本次循环,还是会继续执行for循环的。

二十四、最好使用什么方法在ArrayList中删除指定一个元素?为什么?

  1. 倒序删
  2. CopyOnWriteArrayList线程安全删除()
  3. 迭代器remove方法删除(推荐)
  4. 增强for循环中删除

因为正序遍历过程中可能出现漏删。(正序遍历漏删可能性的解决办法:在if方法体中加一个i–)

二十五、SpringMVC和SpringBoot的区别?

  1. SpringMVC属于一个企业WEB开发的MVC框架,覆盖面包括前端视图开发、文件配置、后台接口逻辑开发等。XML、config等配置相对比较复杂。
  2. SpringBoot框架相对于SpringMVC框架说,更专注于微服务后台接口,不开发前端视图,同时遵循默认优于配置,简化了插件配置流程,不需要配置XML,相对于SpringMVC,大大简化了流程。

总结

以上是对多个人第一次面试被问的问题的汇总,希望能帮到认真看到这里的你。
未完待续。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两岁的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值