第一模块Java 基础

JDK 和 JRE 有什么区别?

  • JDK : Java Development Kit的简称,Java开发工具包,包含了Java开发环境和Java运行环境。
  • JRE : Java Runtime Environment的简称,只包含了Java的运行环境。

具体来说JDK包含了JRE,还包含了编译Java源码的编译器Javac,还包含了许多Java程序调试和分析的工具。简单来说,如果你需要运行Java程序,只需安装JRE就可以了,如果你需要编写Java程序,需要安装JDK。

== 和 equals 的区别是什么?

==对于基本类型来说是值比较,对于引用类型来说是比较的引用;而equals默认情况下是引用比较,只是很多类重写了equals方法,比如String、Integer等把它变成了值比较,所以一般情况下equals比较的是值是否相等。

两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

Java hashCode() 方法

hashCode() 方法用于返回字符串的哈希码。

字符串对象的哈希码根据以下公式计算:

1
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

所以两个对象的hashCode()相同,equals不一定true。因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。

final 在 java 中有什么作用?

  • final修饰的类叫最终类,该类不能被继承。
  • final修饰的方法不能重写。
  • final修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。

java 中的 Math.round(-1.5) 等于多少?

JAVA中Math.round负数的取值

在数轴上取值最接近的整数,中间值(0.5)向右取。Java中Math.round()函数看作原数加0.5再向下取整。

负数验证如下:

1
2
3
4
5
Math.round(-8.49999) :-8
Math.round(-8.5) :-8
Math.round(-8.50001) :-9
Math.round(-8.59999) :-9
Math.round(-8.6) :-9

所以等于-1,因为在数轴上取值时,中间值0.5是向右取整,所以正0.5是向上取整,负0.5是直接舍弃。

java 中操作字符串都有哪些类?它们之间有什么区别?

操作字符串的类有三个:String、StringBuffer、StringBuilder。

String和StringBuffer、StringBuilder的区别在于String声明的是不可变的对象,每次操作都会生成新的String对象,然后将指针指向新的String对象,而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以经常改变字符串的内容的情况下最好不要使用String。

StringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,而StringBuilder是非线程安全的,但StringBuilder的性能却高于StringBuffer,所以在单线程环境下推荐使用StringBuilder,多线程环境下推荐使用StringBuffer。

String str="i"与 String str=new String(“i”)一样吗?

不一样。因为内存分配的方式不一样。

1
String str = "i";

用上面方式Java虚拟机会将其分配到常量池中;

1
String str = new String	("i");

上面方式则会被分配到堆内存中。

如何将字符串反转?

使用StringBuffer或StringBuilder的reverse()方法。

String 类的常用方法都有那些?

  • indexOf() : 返回指定字符的索引。
  • charAt() : 返回指定索引处的字符。
  • replace() : 字符串替换。
  • trim() : 去除字符串两端空白。
  • split() : 分割字符串,返回一个分割后的字符串数组。
  • getBytes() : 返回字符串的byte类型数组。
  • length() : 返回字符串的长度。
  • toLowerCase() : 将字符串转成小写字母。
  • toUpperCase() : 将字符串转成大写字符。
  • subString() : 截取字符串。
  • equals() : 字符串比较。

抽象类必须要有抽象方法吗?

不需要,抽象类不一定非要有抽象方法。

普通类和抽象类有哪些区别?

  • 普通类不能包含抽象方法,抽象类可以包含抽象方法。
  • 抽象类不能直接实例化,普通类可以直接实例化。

抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为final该类就不能被继承,这样彼此就会产生矛盾,所以final不能修饰抽象类,如下图所示,编辑器也会提示错误信息:

image-20220612090648951

接口和抽象类有什么区别?

  • 实现:抽象类的子类使用extends来继承;接口必须使用implements来实现接口。
  • 构造函数:抽象类可以有构造函数;接口不能有。
  • main方法:抽象类可以有main方法,并且我们能运行它;接口不能有main方法。
  • 实现数量:类可以实现很多接口;但是只能继承一个抽象类。
  • 访问修饰符:接口中的方法默认使用public修饰;抽象类中的方法可以是任意访问修饰符。

java接口中的default修饰符(jdk1.8)

接口中被default修饰的方法有默认实现。
实现该接口的类可以不重写接口中被default修饰的方法。

1
2
3
4
5
6
7
public interface IDefault {
int testA();
//使用default修饰
default int testB(){
return 123;
};
}

java 中 IO 流分为几种?

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

字节流和字符流的区别是:字节流按8位传输以字节为单位输入输出数据,字符流按16位传输以字符为单位输入输出数据。

BIO、NIO、AIO 有什么区别?

  • BIO:Block IO 同步阻塞式IO。
  • NIO:New IO 同步非阻塞IO。
  • AIO:Asynchronous IO 异步非阻塞IO。

Files的常用方法都有哪些?

  • Files.exists() : 检测文件路径是否存在。
  • Files.createFile() : 创建文件。
  • Files.createDirectory() : 创建文件夹。
  • Files.delete() : 删除一个文件或目录。
  • Files.copy() : 复制文件。
  • Files.move() : 移动文件。
  • Files.size() : 查看文件个数。
  • Files.read() : 读取文件。
  • Files.write() : 写入文件。

第二模块容器

java 容器都有哪些?

常用容器的图录:

图片

Collection 和 Collections 有什么区别?

  • java.util.Collection是一个集合接口,Collection接口在Java类库中有很多具体的实现。
  • Collections则是集合类的一个工具类,其中提供了一系列静态方法。

List、Set、Map 之间的区别是什么?

  • List和Set是存储单列数据的集合,Map是存储键值对这样的双列数据的集合。
  • List中存储的数据是有顺序的,并且值允许重复;Map中存储的数据是无序的,他的键不允许重复,但是值是允许重复的;Set中存储的元素是无序的,并且不允许重复。

HashMap 和 Hashtable 有什么区别?

HashTable是线程安全的,HashMap的效率相比之下更高

如何决定使用 HashMap 还是 TreeMap?

如果你需要得到一个有序的结果时就应该使用TreeMap,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。

说一下 HashMap 的实现原理?

HashMap是基于哈希表的Map接口的非同步实现。

说一下 HashSet 的实现原理?

HashSet的底层由HashMap实现。

ArrayList 和 LinkedList 的区别是什么?

最明显的区别是ArrayList底层的数据结构是数组,而LinkedList的底层数据结构是双向循环链表。

如何实现数组和 List 之间的转换?

List转换为数组:调用ArrayList的toArray方法。

数组转换成为List:调用Arrays的asList方法。

ArrayList 和 Vector 的区别是什么?

ArrayList和Vector的区别就是ArrayList是线程不安全的,Vector是线程安全的。

Array 和 ArrayList 有何区别?

数组(Array)与列表(ArrayList)

Array可以容纳基本类型和对象,而ArrayList只能容纳对象。

在 Queue 中 poll()和 remove()有什么区别?

poll()和remove()都是从队列中取出一个元素,但是poll()在获取元素失败的时候会返回空,但是remove()失败的时候会抛出异常。

哪些集合类是线程安全的?

vector:就比arrayList多了个同步化机制,因为效率较低,现在已经不太建议使用。在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的。

HashTable:就比HashMap多了个线程安全。

迭代器 Iterator 是什么?

迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象。

Iterator 怎么使用?有什么特点?

Java中的Iterator功能比较简单,并且只能单向移动。

  1. iterator要求容器返回一个Iterator。
  2. 使用next()获取序列中的下一个元素。
  3. 使用hasNext()检查序列中是否还有元素。
  4. 使用remove()将迭代器新返回的元素删除。

Iterator 和 ListIterator 有什么区别?

  • Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。
  • ListIterator实现了Iterator接口,并包含其他的功能。

第三模块多线程

并行和并发有什么区别?

并发,指的是多个事情,在同一时间段内发生了。

并行,指的是多个事情,在同一时间点上发生了。

线程和进程的区别?

进程是一个在内存中运行的应用程序,线程是进程中的一个执行任务,负责当前进程中程序的执行。

守护线程是什么?

守护线程(daemon thread),是个服务线程,准确的来说就是服务其它的线程。

创建线程有哪几种方式?

  1. 继承Thread类创建线程类。
  2. 通过Runnable接口创建线程类。

线程有哪些状态?

  1. 创建
  2. 就绪
  3. 运行
  4. 阻塞
  5. 死亡

sleep() 和 wait() 有什么区别?

  • sleep()方法是线程类Thread的静态方法。
  • wait()是Object类的方法。

线程的 run()和 start()有什么区别?

start()方法用于启动线程,run()方法用于执行线程的运行时代码。

创建线程池有哪几种方式?

  • newFixedThreadPool()
  • newCachedThreadPool()

线程池都有哪些状态?

线程池有五种状态:

  • Running
  • ShutDown
  • Stop
  • Tidying
  • Terminated

线程池中 submit()和 execute()方法有什么区别?

  • 接收的参数不一样

在 java 程序中怎么保证多线程的运行安全?

线程安全在三个方面体现:

  1. 原子性
  2. 可见性
  3. 有序性

什么是死锁?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

ThreadLocal 是什么?

ThreadLocal是线程局部变量。

说一下 synchronized 底层实现原理?

synchronized的底层实现原理是跟monitor有关。

synchronized 和 volatile 的区别是什么?

volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。

synchronized 和 Lock 有什么区别?

synchronized是java内置关键字,Lock是个java类。

synchronized 和 ReentrantLock 区别是什么?

synchronized是java内置关键字,ReentrantLock是个java类。

说一下 atomic 的原理?

Automic通过乐观锁机制保证原子性。

第四模块反射

什么是反射?

反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。

什么是 java 序列化?什么情况下需要序列化?

当Java对象需要在网络上传输或者持久化存储到文件中时,就需要对Java对象进行序列化处理。

动态代理是什么?有哪些应用?

动态代理:

当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,顾名思义就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理。这个代理类并不是定义好的,而是动态生成的。具有解耦意义,灵活,扩展性强。

动态代理的应用:

  • Spring的AOP
  • 加事务
  • 加权限
  • 加日志

怎么实现动态代理?

首先必须定义一个接口,还要有一个InvocationHandler(将实现接口的类的对象传递给它)处理类。再有一个工具类Proxy(习惯性将其称为代理类,因为调用他的newInstance()可以产生代理对象,其实他只是一个产生代理对象的工具类)。利用到InvocationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用加载器加载,并将其实例化产生代理对象,最后返回。

第五模块对象拷贝

为什么要使用克隆?

想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了。

如何实现对象克隆?

  • 重写clone()方法。
  • 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

深拷贝和浅拷贝区别是什么?

  • 浅拷贝只是复制了对象的引用地址。
  • 深拷贝是将对象和值复制过来。

第六模块Java Web

jsp 和 servlet 有什么区别?

jsp的本质就是servlet,jsp经编译后就变成了servlet。

jsp 有哪些内置对象?作用分别是什么?

  1. request:封装客户端的请求,其中包含来自Get和Post请求的参数。
  2. response:封装服务器对客户端的请求。
  3. session:封装用户会话的对象。
  4. application:封装服务器运行环境的对象。
  5. page:jsp页面本身。
  6. exception:封装页面抛出的异常

说一下 jsp 的 4 种作用域?

  • page代表与一个页面相关的对象和属性。
  • request代表与Web客户机发出的一个请求相关的对象和属性。
  • session代表与某个用户与服务器建立的一次会话相关的对象和属性。
  • application代表与整个Web应用程序相关的对象和属性。

浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie,用来保存Session对象的Id,然后将该Cookie发送到浏览器端。

说一下 session 的工作原理?

类似于一个大号的map。

可以通过手动URL进行传值。

spring mvc 和 struts 的区别是什么?

拦截机制不同,struts是类级别的拦截,springMVC是方法级别的拦截。

如何避免 sql 注入?

使用PreparedStatement

什么是 XSS 攻击?

XCC又称CSS,全称Cross Site Script(跨站脚本攻击),其原理是攻击者向有XSS漏洞的网站中输入恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。

什么是 CSRF 攻击,如何避免?

CSRF(Cross-site request forgery)也被称为one-click attack或者session riding,中文全称是叫跨站请求伪造。一般来说,攻击者通过伪造用户的浏览器的请求,向访问一个用户曾经认证访问过的网站发送出去,使目标网站接收并误以为是用户的真实操作而去执行命令。

如何避免:

  • 使用验证码

第七模块异常

throw 和 throws 的区别?

throws用于方法头,表示的只是异常的申明,而throw用于方法内部,抛出的是异常对象。

final、finally、finalize 有什么区别?

  • final可以修饰类、变量、方法。
  • finally一般作用在try-catch代码块中。
  • finalize是垃圾回收方法。

try-catch-finally 中哪个部分可以省略?

catch可以省略。

try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

会执行,会在return前执行。

常见的异常类有哪些?

  • NullPoninterException
  • SQLException
  • IndexOutOfBoundsException
  • FileNotFoundException
  • IOException
  • RuntimeException

第八模块网络

http 响应码 301 和 302 代表的是什么?

301、302都是HTTP状态的编码,都代表着某个URL发生了转移。

forward 和 redirect 的区别?

  1. 从地址栏来说:

    forward地址栏不会改变。

  2. 从数据共享来说:

    forward可以共享数据。

  3. 从效率来说:

    forward效率高

    redirect效率低

简述 tcp 和 udp的区别?

TCP面向连接,而UDP是无连接的。

get 和 post 请求有哪些区别?

GET在浏览器回退时是无害的,而POST会再次提交请求。

说一下 JSONP 实现原理?

jsonp即Json+padding,动态创建script标签。

说一下你熟悉的设计模式?

  • 单例模式

    这种类型的模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

  • 代理模式

    它的核心思想,是将对目标访问转移到代理对象上。

Spring / Spring MVC

为什么要使用 spring?

Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。