java面试题[未完成]
java基础
线程声明周期及使用方法
创建、就绪、运行、阻塞、终止。
新建:就是刚使用new方法,new出来的线程; Thread t1 = new Thread();
就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状态,这个时候需要其他机制将处于阻塞状态的线程唤醒,比如调用notify或者notifyAll()方法。唤醒的线程不会立刻执行run方法,它们要再次等待CPU分配资源进入运行状态;
销毁:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;
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方法
该方法唤醒在该对象上等待的所有线程。
Thread和Runable的区别
Runnable的实现方式是实现其接口即可
Thread的实现方式是继承其类
Thread实现了Runnable接口,提供了更多的可用方法和成员而已。
Thread和Runnable的实质是继承关系,没有可比性。
无论使用Runnable还是Thread,都会new Thread,然后执行run方法。用法上,如果有复杂的线程操作需求,那就选择继承Thread,如果只是简单的执行一个任务,那就实现runnable。
final,finally,finalize的区别
final可以用来修饰类,方法和变量
修饰类时:表明该类不能被其他类所继承。
修饰方法时:方法不能被重写。
修饰成员变量:表示常量,只能被赋值一次,赋值后其值不再改变
finally作为异常处理的一部分,它只能用在try/catch语句中表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。
但2中情况不用进入finally,
1、在进入try语句块之前返回或抛出异常
2、线程被中断interrupt()
finalize 方法在gc启动,该对象被回收的时候被调用。其实gc可以回收大部分的对象(凡是new出来的对象,gc都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。
[参考博客](https://www.cnblogs.com/ktao/p/8586966.html
什么时反射
是指在程序运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用对象方法的功能称之为反射
用途:
编译时类型和运行时类型,Person p=new Student();
编译时类型无法获取具体方法
好处:反射技术提高了应用程序的可扩展性。
反射 API 用来生成 JVM 中的类、接口或则对象的信息。
1、Class 类:反射的核心类,可以获取类的属性,方法等信息。
2、Field 类表示类的成员变量,可以用来获取和设置类之中的属性
值。
3、Method 类: 表示类的方法,它可以用来获取类中的方法信息或
者执行方法。
4、Constructor 类: 表示类的构造方法。
lambda表达式
Lambda 表达式是 JDK8 的一个新特性,本质上是一段匿名内部类,可以取代大部分的匿名内部类,使用它可以使代码更加简洁并且提供可读性,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。
函数式接口
jdk 8 新特性
- Java 8 新增了接口的默认方法。
简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。
我们只需在方法名前面加个default关键字即可实现默认方法。
- 新日期时间 API
1:java.util.Date 是非线程安全的,所有的日期类都是可变的,这是Java日期类最大的问题之一
2:java.util和java.sql的包中都有日期类,格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间, 日期类并不提供国际化,没有时区支持
新:Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:
Local(本地) − 简化了日期时间的处理,没有时区的问题。
Zoned(时区) − 通过制定的时区处理日期时间。
- 更换了 js引擎 为Nashorn。
作用:将JavaScript编译成Java字节码。
2到10倍的性能提升。
javascript是运行在web浏览器,提供对html各种dom操作,但是Nashorn不支持浏览器DOM的对象。这个需要注意的一个点。
但在Java 11中被移除
- Java 8 Stream
可以让你以一种声明的方式处理数据。
使用的是Fork/Join 框架
stream() − 为集合创建串行流。
parallelStream() − 为集合创建并行流。就是把一个内容分成多个数据块,并用不同的线程分 别处理每个数据块的流。
处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作,Stream API 提供了一种高效且易于使用的处理数据的方式。
- 方法引用
方法引用通过方法的名字来指向一个方法。
方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
方法引用使用一对冒号 :: 。
cars.forEach( Car::collide );
GC
Serial 垃圾收集器 单线程 复制算法 暂停所有其他的工作线程,
ParNew 垃圾收集器(Serial+多线程) 多线程 暂停所有其他的工作线程,
IO/NIO
阻塞、非阻塞、多路复用
内部类
Java 类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类,分为静态内部类,成员内部类,局部内部类,匿名内部类四种。
定义在类内部的静态类,就是静态内部类。
1. 静态内部类可以访问外部类所有的静态变量和方法,即使是 private 的也一样。
2. 静态内部类和一般类一致,可以定义静态变量、方法,构造方法等。
3. 其它类使用静态内部类需要使用“外部类.静态内部类”方式,如下所示:Out.Inner inner =new Out.Inner();inner.print();
4. 像这种和外部类关系密切的,且不依赖外部类实例的,都可以使用静态内部类。
定义在类内部的非静态类,就是成员内部类。
成员内部类不能定义静态方法和变量(final 修饰的除外)。这是因为成员内部类是非静态的,
局部内部类(定义在方法中的类)
定义在方法中的类,就是局部类。如果一个类只在某个方法中使用,则可以考虑使用局部类。
匿名内部类(匿名内部类必须继承一个父类或者实现一个父接口、直接使用new 来生成一个对象的引用)
一个继承了类的子类的匿名对象 或者一个实现了接口的实现类的匿名对象。
interface HelloWorld {
public void greet();
public void greetSomeone(String someone);
}
// 2、匿名类实现HelloWorld接口
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
abstract class 和 interface 有什么区别?
abstract 修饰符的类为抽象类,抽象类不能创建的实例对象。
抽象方法必须写在抽象类中,但抽象类中可以包含普通方法。
abstract类中定义的抽象方法必须在子类中实现,除非子类也是抽象类。
接口可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口
中的方法定义默认为 public abstract 类型,接口中的成员变量类型默认为 public static final。
区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2 抽象类只有抽象方法需要被重写,接口中需重写全部方法(默认方法除外)
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中可以包含静态方法,接口中不能包含静态方法
5. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是 public static final 类型,并且默认即为 public static final 类型。
6. 一个类可以实现多个接口,但只能继承一个抽象类。
封装类
| int | Integer |
| char | Character |
| byte | Byte |
| float | Float |
| double | Double |
| short | Short |
| long | Long |
| boolean | Boolean |
工厂模式
-
工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
我们想创建一个对象,只要知道其名称就可以了,通过工厂类 -
优点: 1、一个调用者想创建一个对象,只要知道其名称就可以了。 2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。 3、屏蔽产品的具体实现,调用者只关心产品的接口。
-
缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。
-
用途: 1、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。 2、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。 3、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
单例模式
保证整个系统中一个类只有一个对象的实例,实现这种功能的方式就叫单例模式。
Resource("")
默认按名称装配,当找不到名称匹配的bean再按类型装配.
@Autowired
默认按类型匹配,自动装配(Srping提供的),可以写在成员属性上,或写在setter方法上
请写出Object的所有方法
1.getClass
举例:public final Class<?> getClass()
作用:返回一个对象的运行时类。
2.hashCode
举例:public int hashCode()
作用:返回该对象的哈希码值。
3.equals
举例:public boolean equals(Object obj)
作用:指示某个其他对象是否与此对象“相等”。
4.toString
举例:public String toString()
作用:返回该对象的字符串表示。
5.wait
举例:public final void wait(long timeout) throws InterruptedException
作用:导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
6.notify
举例:public final void notify()
作用:唤醒在此对象监视器上等待的单个线程。
7.notifyAll
举例:public final void notifyAll()
作用:唤醒在此对象监视器上等待的所有线程。
8.clone
举例:protected Object clone( ) throws CloneNotSupportedException
作用:创建并返回此对bai象的一个副du本。
9.finalize
举例:protected void finalize() throws Throwable
作用:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
什么是序列化和反序列化
序列化:把对象转换为字节序列的过程称为对象的序列化。
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
什么情况下需要序列化
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
当你想用套接字在网络上传送对象的时候;
当你想通过RMI传输对象的时候
抽象类、与接口的区别
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
多态
IOC和AOP
mybatis 底层原理
restful风格
mybatis 缓存
mybatis 动态sql
spring boot 入口
spring mvc 拦截器
spring boot 优点
1、springMVC入口是什么
2、什么是springAOP
3、springIOC和DI有什么区别
4、抽象类个接口的区别,接口1.8后是否有改变
5、StringBUffer,StringV,String,区别
6、什么是java面向对象
1、请描述下spring中的增强模式,你都使用过那些增强
2、spring中为什么使用单例模式?
3、mybatis中如何使用Dao接口操作数据库,是怎么实现的
4、springMVC中MVC指的是什么?MVC对应的那些框架
m model 模型,存放数据的对象
v view 视图,界面
c controller 控制器
指:在controller中控制用户访问,
从数据库中取出数据,存入model
放在页面上(视图)上进行显示处理
M mybatis+spring
V jsp
c springMVC
5、请简述你做过的一个功能,怎么实现该功能的,你感觉这个功能哪个部分做的好,好在哪里
登录功能,
2020.9.23
1、什么是JDK,什么是JRE,什么是JVM,三者之间的关系
JDK:开发工具包,包含JRE
JRE:运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库,包含JVM
JVM:java虚拟机

浙公网安备 33010602011771号