1、==和equals的区别是什么?
== : 如果比较的是基本数据类型,那么比较的是变量的值
== :如果比较的是引用数据类型,那么比较的是地址值(两个对象是否指向同一块内存)
equals:如果没有重写equals方法比较的是两个对象的地址值。 如果重写了equals方法后我们往往比较的是对象中的属性的内容。
一 、 java. lang. Object 中的 equals()方法:
public boolean equals ( Object obj) {
return ( this == obj) ;
}
二、 像String,Date等系统类中已经重写了equals方法用来比较对象中的属性的内容。
三 一般我们自定义类中都会重写equals方法用来对属性的内容进行比较。
如果没有重写equals方法那么调用的就是
Object中的equals方法用来比较两个对象的地址值。
我们比较无非就是这两种 1 、基本数据类型比较 2 、引用对象比较
1 、基本数据类型比较
== 和Equals都比较两个值是否相等。相等为true 否则为false ;
2 、引用对象比较
== 和Equals都是比较栈内存中的地址是否相等 。相等为true 否则为false ;
1 、string是一个特殊的引用类型。对于两个字符串的比较,不管是 == 和 Equals 这两者比较的都是字符串是否相同;
2 、当你创建两个string对象时,内存中的地址是不相同的,你可以赋相同的值。
所以字符串的内容相同。引用地址不一定相同,(相同内容的对象地址不一定相同),但反过来却是肯定的;
3 、基本数据类型比较( string 除外) == 和 Equals 两者都是比较值;
2、两个对象的hashCode()相同,则equals()也一定为true,对吗?
首先,答案肯定是不一定。同时反过来equals为true,hashCode也不一定相同。
类的hashCode方法和equals方法都可以重写,返回的值完全在于自己定义。
hashCode()返回该对象的哈希码值;equals()返回两个对象是否相等。
关于hashCode和equal是方法是有一些 常规协定 :
1、两个对象用equals()比较返回true,那么两个对象的hashCode()方法必须返回相同的结果。
2、两个对象用equals()比较返回false,不要求hashCode()方法也一定返回不同的值,但是最好返回不同值,易提高哈希表性能。
3、重写equals()方法,必须重写hashCode()方法,以保证equals方法相等时两个对象hashcode返回相同的值。
3、接口和抽象类有什么区别?
抽象类可以有构造方法;接口中不能有构造方法。
抽象类中可以有普通成员变量;接口中没有普通成员变量。
抽象类中可以包含非抽象普通方法;接口中的所有方法必须都是抽象的。
抽象类中的抽象方法的访问权限可以是 public、protected 和 default;接口中的抽象方法只能是 public 类型的,并且默认即为 public abstract 类型。
抽象类中可以包含静态方法;JDK1.8 前接口中不能包含静态方法,JDK1.8 及以后可以包含已实现的静态方法。
抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量可以是任意访问权限;接口中变量默认且只能是 public static final 类型。
一个类可以实现多个接口,用逗号隔开,但只能继承一个抽象类。
接口不可以实现接口,但可以继承接口,并且可以继承多个接口,用逗号隔开。
4、java中io流分为几种?
按数据流向:输入流和输出流
输入和输出都是从程序的角度来说的。输入流:数据流向程序;输出流:数据从程序流出。
按处理单位:字节流和字符流
字节流:一次读入或读出是8位二进制;字符流:一次读入或读出是16位二进制。
JDK中后缀是Stream是字节流;后缀是Reader,Writer是字符流。
按功能功能:节点流和处理流
节点流:直接与数据源相连,读入或写出;处理流:与节点流一块使用,在节点流的基础上,再套接一层。
最根本的四大类:InputStream(字节输入流),OutputStream(字节输出流),Reader(字符输入流),Writer(字符输出流)
5、Collection和Collections有什么区别?
【Collection是集合接口;Collections是集合工具类】
Collections是一个包装类。它包含有各种有关集合操作的静态多态方法,不能实例化,像一个Collection集合框架中的工具类。
Collection是JDK中集合层次结构中的最根本的接口。定义了集合类的基本方法。
6、HashMap和HashTable有什么区别?
1、线程安全性不同。HashMap线程不安全;Hashtable 中的方法是Synchronize的。
2、key、value是否允许null。HashMap的key和value都是可以是null,key只允许一个null;Hashtable的key和value都不可为null。
3、迭代器不同。HashMap的Iterator是fail-fast迭代器;Hashtable还使用了enumerator迭代器。
4、hash的计算方式不同。HashMap计算了hash值;Hashtable使用了key的hashCode方法。
5、默认初始大小和扩容方式不同。HashMap默认初始大小16,容量必须是2的整数次幂,扩容时将容量变为原来的2倍;Hashtable默认初始大小11,扩容时将容量变为原来的2倍加1。
6、是否有contains方法。HashMap没有contains方法;Hashtable包含contains方法,类似于containsValue。
7、父类不同。HashMap继承自AbstractMap;Hashtable继承自Dictionary。
7、说一下HashMap的实现原理?
JDK 1.8 的HashMap链表的长度超过了 8 ,链表将转化为红黑树
发生 hash 碰撞时,JDK 1.7 会在链表头部插入,而 JDK 1.8 会在链表尾部插入
JDK 1.8 中,Entry 被 Node 代替
8、线程和进程的区别?
进程是系统进行资源分配和调度的一个独立单位;线程是进程的一个实体,是CPU调度和分派的基本单位。
一个程序下至少有一个进程,一个进程下至少有一个线程,一个进程下也可以有多个线程来增加程序的执行速度。
9、创建线程有哪几种方式?
继承Thread类,重新 run 方法
实现Runnable接口
实现Callable接口,配合FutureTask
线程池
10、线程的run()方法和start()方法有什么区别?
start() 方法用于启动线程,run() 方法用于执行线程的运行时代码。run() 可以重复调用,而 start() 只能调用一次。
11、线程池都有哪些状态?
线程池的5种状态:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED。
线程池的5种状态:Running、ShutDown、Stop、Tidying、Terminated。
• RUNNING:这是最正常的状态,接受新的任务,处理等待队列中的任务。
• SHUTDOWN:不接受新的任务提交,但是会继续处理等待队列中的任务。
• STOP:不接受新的任务提交,不再处理等待队列中的任务,中断正在执行任务的线程。
• TIDYING:所有的任务都销毁了,workCount 为 0,线程池的状态在转换为 TIDYING 状态时,会执行构造方法 terminated()。
• TERMINATED:terminated()方法结束后,线程池的状态就会变成这个。
12、什么是java序列化?什么情况下需要序列化?
什么是 java 序列化?什么情况下需要序列化?
序列化:将 Java 对象转换成字节流的过程。
反序列化:将字节流转换成 Java 对象的过程。
当 Java 对象需要在网络上传输 或者 持久化存储到文件中时,就需要对 Java 对象进行序列化处理。
序列化的实现:类实现 Serializable 接口,这个接口没有需要实现的方法。实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被序列化。
注意事项:
某个类可以被序列化,则其子类也可以被序列化
声明为 static 和 transient 的成员变量,不能被序列化。static 成员变量是描述类级别的属性,transient 表示临时数据
反序列化读取序列化对象的顺序要保持一致。
13、JSP和Servlet有什么区别?
JSP 是 servlet 技术的扩展,本质上就是 servlet 的简易方式。
servlet 和 JSP 最主要的不同点在于,servlet 的应用逻辑是在 Java 文件中,并且完全从表示层中的 html 里分离开来,而 JSP 的情况是 Java 和 html 可以组合成一个扩展名为 JSP 的文件。
JSP 侧重于视图,servlet 主要用于控制逻辑。
内置对象不同,获取内置对象的方式不同。
14、Session和Cookie有什么区别?
• 存储位置不同:session 存储在服务器端;cookie 存储在浏览器端。
• 安全性不同:cookie 安全性一般,在浏览器存储,可以被伪造和修改,session 由于存在服务器端,安全性高。
• 容量和个数限制:cookie 有容量限制,每个站点下的 cookie 也有个数限制。
• 存储的多样性:session 可以存储在 Redis 中、数据库中、应用程序中;而 cookie 只能存储在浏览器中。
session 可以被服务器的程序处理为 key - value 类型的任何对象;cookie 则是存在浏览器里的一段文本。
15、如何避免SQL注入?
• 使用预处理 PreparedStatement。
• 使用正则表达式过滤掉字符中的特殊字符。
16、final、finally、finalize有什么区别?
• final:是修饰符,如果修饰类,此类不能被继承;如果修饰方法和变量,则表示此方法和此变量不能在被改变,只能使用。
• 异常处理的一部分,它只能用在try/catch语句中,表示希望finally语句块中的代码最后一定被执行(但是不一定会被执行)
• finalize:是 Object 类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。
finalize()是在java.lang.Object里定义的,Object的finalize方法什么都不做,对象被回收时finalized方法会被调用。
特殊情况下,可重写finalize方法,当对象被回收的时候释放一些资源。但注意,要调用super.finalize()。
17、常见的异常类有哪些?
• NullPointerException 空指针异常
• ClassNotFoundException 指定类不存在
• NumberFormatException 字符串转换为数字异常
• IndexOutOfBoundsException 数组下标越界异常
• ClassCastException 数据类型转换异常
• FileNotFoundException 文件未找到异常
• NoSuchMethodException 方法不存在异常
• IOException IO 异常
• SocketException Socket 异常
18、Forword和Redirect的区别?
forward 是转发 和 redirect 是重定向:
• 地址栏 url 显示:foward url 不会发生改变,redirect url 会发生改变;
• 数据共享:forward 可以共享 request 里的数据,redirect 不能共享;
• 效率:forward 比 redirect 效率高。
• http请求次数不同 forward 1次;redirect 2次。
前后台两者页面跳转的处理方式不同
forward 跳转页面,是服务端进行页面跳转加载(include)新页面,直接返回到浏览器;redirect 跳转页面,是服务端返回新的 url 地址,浏览器二次发出 url 请求
参数携带情况不一样
forward 跳转页面,会携带请求的参数到新的页面;redirect 跳转页面,属于一次全新的 http 请求,无法携带上一次请求的参数
19、Get和Post请求有哪些区别?
最直接的区别,GET请求的参数是放在URL里的,POST请求参数是放在请求body里的;
GET请求的URL传参有长度限制,而POST请求没有长度限制;
GET请求的参数只能是ASCII码,所以中文需要URL编码,而POST请求传参没有这个限制;
• get 请求会被浏览器主动缓存,而 post 不会。
• get 传递参数有大小限制,而 post 没有。
• post 参数传输更安全,get 的参数会明文限制在 url 上,post 不会。
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中。
https://baijiahao.baidu.com/s?id=1620934682611653374&wfr=spider&for=pc
https://www.cnblogs.com/logsharing/p/8448446.html
20、解释一下什么是AOP?
aop 是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
简单来说就是统一处理某一“切面”(类)的问题的编程思想,比如统一处理日志、异常等。
21、解释一下什么是IOC?
ioc:Inversionof Control(中文:控制反转)是 spring 的核心,对于 spring 框架来说,就是由 spring 来负责控制对象的生命周期和对象间的关系。
简单来说,控制指的是当前对象对内部成员的控制权;控制反转指的是,这种控制权不由当前对象管理了,由其他(类,第三方容器)来管理。
22、Spring常用的注入方式有哪些?
• setter 属性注入
• 构造方法注入
• 注解方式注入
23、Mybatis中 #{} 和 ${} 的区别是什么?
\#{}是预编译处理,${}是字符替换。
在使用 #{}时,MyBatis 会将 SQL 中的 #{}替换成“?”,配合 PreparedStatement 的 set 方法赋值,这样可以有效的防止 SQL 注入,保证程序的运行安全。
24、说一下Mybatis的一级缓存和二级缓存?
• 一级缓存:基于 PerpetualCache 的 HashMap 本地缓存,它的声明周期是和 SQLSession 一致的,有多个 SQLSession 或者分布式的环境中数据库操作,可能会出现脏数据。当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认一级缓存是开启的。
• 二级缓存:也是基于 PerpetualCache 的 HashMap 本地缓存,不同在于其存储作用域为 Mapper 级别的,如果多个SQLSession之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现 Serializable 序列化接口(可用来保存对象的状态)。
开启二级缓存数据查询流程:二级缓存 -> 一级缓存 -> 数据库。
缓存更新机制:当某一个作用域(一级缓存 Session/二级缓存 Mapper)进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。