提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、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开发岗面试被提问的问题汇总(一)
发布评论