admin管理员组

文章数量:1794759

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

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

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

文章目录
  • 前言
  • 一、Java 8的新特性是什么?
  • 二、Java中如何通过代码读取文件夹下的所有文件
    • 1.方法一
    • 2.方法二(Java 8 具有 Files.walk API)
  • 三、数据库的事务是什么?ACID分别是什么?
  • 四、Servlet的工作流程是什么样的?
  • 五、ioc是什么?具有哪些优点
  • 六、一个基本的form表单提交到数据库具体流程是怎样的?
  • 七、创建线程的几种方式?
  • 八、线程的几种状态?
  • 九、异常有哪些?
  • 十、JDBC连接数据库的步骤?
  • 十一、Object常用的方法有哪些?
  • 十二、创建Bean的几种方式?
  • 十三、HashTable和HashMap的区别?
  • 十四、线程和进程的区别?
  • 十五、进程和线程的关系?
  • 十六、线程怎么开启?
    • 方法一:继承Thread
    • 方法二:实现Runnable接口
    • 方法三:实现Callable接口
  • 十七、怎么进入阻塞状态?
  • 十八、使用sleep时为什么要抛异常?
  • 十九、为什么要抛出异常?
  • 二十、什么是数据库视图?
  • 二十一、一个字节存放最大的数字是?一个汉字是几个字节?一个字节可以存放几个十六进制数字?
  • 二十二、空指针异常是什么原因?
  • 二十三、普通for循环遍历集合可以用continue跳出本次循环进入下一次循环,foreach循环如何跳出本次循环进入下一次?
  • 二十四、最好使用什么方法在ArrayList中删除指定一个元素?为什么?
  • 二十五、SpringMVC和SpringBoot的区别?
  • 总结


前言

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

面试被提问的问题汇总


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

一、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的工作流程是什么样的?
  • Web Client 向Servlet容器(Tomcat)发出Http请求
  • Servlet容器接收Web Client的请求
  • Servlet容器创建一个HttpRequest对象,将Web Client请求的信封装到这个对象中。
  • Servlet容器创建一个HttpResponse对象
  • Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet 对象。
  • HttpServlet调用HttpRequest对象的有关方法,获取Http请求信。
  • HttpServlet调用HttpResponse对象的有关方法,生成响应数据。
  • Servlet容器把HttpServlet的响应结果传给Web Client。
  • 五、ioc是什么?具有哪些优点
  • IOC:控制反转,是一种设计模式。 第一层含义是控制权的转移:由传统的在程序中控制依赖转移到由容器来控制。 第二层含义是依赖注入:将相互依赖的对象分离,在Spring配置文件中描述他们的依赖关系,他们的依赖关系只在使用的时候才建立。简单来说就是不需要的NEW一个对象了。
  • 第一,资源集中管理,实现资源的可配置和易管理。 第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。
  • 六、一个基本的form表单提交到数据库具体流程是怎样的?
  • 设置form表单,发一个Ajax请求传给后端controller。
  • 后端controller使用@requestbody成功接收,然后存到POJO实体类,然后调用service
  • serviceimpl实现类调用dao
  • dao使用xml的sql语句然后成功添加到数据库。
  • 七、创建线程的几种方式?
  • 继承Thread类创建线程类
  • 通过Runnable接口创建线程类
  • 通过Callable和Future创建线程
  • 八、线程的几种状态?
  • 新建状态(New):新创建了一个线程对象。
  • 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行线程池”中,变得可运行,只等待获取CPU的使用权,即在就绪状态的进程除CPU之外,其它的运行所需资源都已全部获得。
  • 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
  • 阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
  • 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
  • 九、异常有哪些?

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

  • 错误 如果应用程序出现了Error,那么将无法恢复,只能重新启动应用程序,最典型的Error的异常是:OutOfMemoryError
  • 受控异常 这种异常属于一般性异常,出现了这种异常必须显示的处理,不显示处理java程序将无法编译通过。 编译器强制普通异常必须try…catch处理,或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常。
  • 非受控异常 非受控异常也即是运行时异常(RuntimeException),这种系统异常可以处理也可以不处理,所以编译器不强制用try…catch处理或用throws声明,所以系统异常也称为unchecked异常。
  • 十、JDBC连接数据库的步骤?
  • 加载JDBC驱动程序:在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM
  • 创建数据库的连接:向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。
  • 创建一个Statement
  • 执行SQL语句
  • 遍历结果集
  • 处理异常,关闭JDBC对象资源
  • 十一、Object常用的方法有哪些?
  • clone方法 保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
  • getClass方法 final方法,获得运行时类型。
  • toString方法 该方法用得比较多,一般子类都有覆盖。
  • finalize方法 该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。
  • equals方法 该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。
  • hashCode方法 该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。 一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。
  • wait方法 wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。 调用该方法后当前线程进入睡眠状态,直到以下事件发生。 (1)其他线程调用了该对象的notify方法。 (2)其他线程调用了该对象的notifyAll方法。 (3)其他线程调用了interrupt中断该线程。 (4)时间间隔到了。 此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。
  • notify方法 该方法唤醒在该对象上等待的某个线程。
  • notifyAll方法 该方法唤醒在该对象上等待的所有线程。
  • 十二、创建Bean的几种方式?
  • 用默认构造函数创建 在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时采用的就是默认构造函数创建bean对象,此时如果类中没有默认构造函数,则对象无法创建
  • 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
  • 使用工厂中的静态方法创建对象时(使用某个类中的静态方法创建对象,并存入spring容器)
  • 十三、HashTable和HashMap的区别?
  • 继承的父类不同
  • HashMap线程不安全,HashTable线程安全
  • 包含的contains方法不同
  • 是否允许null值
  • 计算hash值方式不同
  • 扩容方式不同(容量不够)
  • 解决hash冲突方式不同(地址冲突)
  • 十四、线程和进程的区别?
  • 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位
  • 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行
  • 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源.
  • 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
  • 十五、进程和线程的关系?
  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
  • 处理机分给线程,即真正在处理机上运行的是线程。
  • 线程在执行过程中,需要协作同步。不同进程的线程间要利用消通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体。
  • 十六、线程怎么开启? 方法一:继承Thread
  • 定义一个类继承Thread
  • 重写run方法
  • 创建线程对象
  • 开启线程
  • 方法二:实现Runnable接口
  • 定义一个类实现Runnable接口
  • 重写run方法
  • 在main方法(线程)中,创建线程对象,并启动线程. ① 创建线程类对象: Thread thread = new Thread(myThread); ② 调用线程对象的start方法: thread.start();
  • 方法三:实现Callable接口
  • 定义一个类实现Callable接口
  • 重写call方法
  • 在main方法(线程)中,创建Callable对象,创建任务将Callable对象传进来,创建线程对象将任务传进来,并启动线程. ① 创建Callable对象: Callable c = new MyCallable(); ② 创建任务将Callable对象传进来: FutureTask task = new FutureTask<>©; ③ 创建线程类对象: Thread thread = new Thread(task); ④ 调用线程对象的start方法: thread.start();
  • 十七、怎么进入阻塞状态?
  • sleep( ) 使线程在一定的时间内进入阻塞状态,不能得到cpu时间,但不会释放锁资源。指定的时间一过,线程重新进入可执行状态
  • wait( ) 使线程进入阻塞状态,同时释放自己占有的锁资源,和notify( )搭配使用
  • suspend( ) 使线程进入阻塞状态,并且不会自动恢复,必须其对应的resume( )被调用,才能使线程重新进入可执行状态
  • yield( ) (特殊) 使得线程放弃当前分得的CPU时间,但是不使线程阻塞,即线程任然处于可执行状态,随时可能再次分得CPU时间。
  • 其中sleep(),suspend(),rusume(),yield()均为Thread类的方法,wait()为Object类的方法

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

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

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

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

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

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

    二十一、一个字节存放最大的数字是?一个汉字是几个字节?一个字节可以存放几个十六进制数字?
  • 一个字节有8位,有一位是符号位,所以最大二进制数为01111111,转为十进制数字是127。(最小为-128)
  • 一个汉字是两个字节。
  • 一个字节最多存放两个十六进制数字。
  • 二十二、空指针异常是什么原因?
  • 当一个对象不存在时又调用其方法会产生异常    obj.method() // obj对象不存在
  • 当访问或修改一个对象不存在的字段时会产生异常    obj.method()  // method方法不存在
  • 二十三、普通for循环遍历集合可以用continue跳出本次循环进入下一次循环,foreach循环如何跳出本次循环进入下一次?

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

    二十四、最好使用什么方法在ArrayList中删除指定一个元素?为什么?
  • 倒序删
  • CopyOnWriteArrayList线程安全删除()
  • 迭代器remove方法删除(推荐)
  • 增强for循环中删除
  • 因为正序遍历过程中可能出现漏删。(正序遍历漏删可能性的解决办法:在if方法体中加一个i–)

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

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

    本文标签: java