目录
4.三个字符串String StringBuffer StringBuilder的区别 :
14.HashSet和LinkedHashSet和 TreeSet 三者的对比:
17.当有哈希冲突时,HashMap是如何查找并确认元素的?
25.volatile有什么用?能否用一句话说明下volatile的应用场景?
26. synchronized和 volatile的区别是什么?
33.Java反射API(反射 API 用来生成 JVM 中的类、接口或则对象的信息)
38. final、finally、finalize有什么区别?
39.是否可以从一个static方法内部发出对非static方法的调用?
41.abstract的方法是否可同时是static、native和synchronized?
42. Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
44. Java 中堆(heap)和栈(stack)有什么区别?
47.Java线程池中submit()方法和execute()方法有什么区别?
57.通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
58.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
随时学,随时加
1.throws和throw的区别:
throws:在方法后边声明异常,其实就是自己不想对异常做出任何的处理,告诉别人自己可能出现的异常,交给别人处理,然别人处理
package com.xinkaipu.Exception;
class Math{
public int div(int i,int j) throws Exception{
int t=i/j;
return t;
}
}
public class ThrowsDemo {
public static void main(String args[]) throws Exception{
Math m=new Math();
}
}
throw: 就是自己处理一个异常,有两种方式要么是自己捕获异常try...catch代码块,要么是抛出一个异常(throws 异常)
package com.xinkaipu.Exception;
public class TestThrow
{
public static void main(String[] args)
{
try
{
//调用带throws声明的方法,必须显式捕获该异常
//否则,必须在main方法中再次声明抛出
throwChecked(-3);
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
//调用抛出Runtime异常的方法既可以显式捕获该异常,
//也可不理会该异常
throwRuntime(3);
}
public static void throwChecked(int a)throws Exception
{
if (a > 0)
{
//自行抛出Exception异常
//该代码必须处于try块里,或处于带throws声明的方法中
throw new Exception("a的值大于0,不符合要求");
}
}
public static void throwRuntime(int a)
{
if (a > 0)
{
//自行抛出RuntimeException异常,既可以显式捕获该异常
//也可完全不理会该异常,把该异常交给该方法调用者处理
throw new RuntimeException("a的值大于0,不符合要求");
}
}
}
2.代码块执行顺序:
代码块执行顺序:静态代码块——> 构造代码块 ——> 构造函数——> 普通代码块
继承中代码块执行顺序:父类静态块——>子类静态块——>父类代码块——>父类构造器——>子类代码块——>子类构造器
3.try ... catch、finally执行顺序:
finally永远是在最后执行的
如果在try ... catch语句中有return,
catch可以写多个异常(可以捕获多个异常)
顺序问题:先写小的,再写大的
4.三个字符串String StringBuffer StringBuilder的区别 :
5.抽象类与接口的区别:
- 抽象类是半抽象的,接口时完全抽象的
- 抽象类中有构造方法,接口没有构造方法
- 接口与接口之间支持多继承,类与类之间只支持单继承
- 一个类可以实现多个接口,但一个抽象类只能继承一个类
- 接口中只允许有常量和抽象方法(java7之前)
6.this和super的区别:
1.属性的区别:
this访问本类中的属性,如果本类没有此属性则从父类中继续查找。super访问父类中的属性。
2.方法的区别:
this访问本类中的方法,如果本类没有此方法则从父类中继续查找。super访问父类中的方法。
3.构造的区别:
this调用本类构造,必须放在构造方法的首行。super调用父类构造,必须放在子类构造方法首行。
4.其他区别:
this表示当前对象。super不能表示当前对象
A、this. 变量和super.变量
this.变量 调用的当前对象的变量;
super.变量 直接调用的是父类中的变量。
B、this(参数)和super(参数)方法
this(参数) 调用(转发)的是当前类中的构造器;
super(参数) 用于确认要使用父类中的哪一个构造器。
7.方法重载和方法重写的区别:
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
范围 | 在一个类中 | 发生在继承类中 |
8.Thread和Runnable的区别:
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类
9.sleep和wait的区别:
二者都会让线程进入阻塞状态,有以下区别:
- wait是Object的方法 sleep是Thread的方法
- wait会立即释放锁 sleep不会释放锁
- wait后线程的状态是Watting sleep后线程的状态为 Time_Waiting
- sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常(终端异常
5.
- Thread.sleep只会让出CPU,不会导致锁行为的改变
- Object.wait不仅让出CPU,还会释放已经占有的同步资源锁
10. Collection和Map接口的区别:
Map没有继承Collection接口
Collection接口,包含list和set子接口
Collection和Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字键值对。
在Map对象中,每一个关键字最多有一个关联的值。
11.ArraysList和LinkedList的区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)
2.对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
12.ArrayList和Vector的区别:
1. ArrayList 是线程不安全的,Vector 是线程安全的
2.ArrayList 使用默认构造器创建对象时是在调用 add()
方法时对 ArrayList 的默认容量进行初始化的,Vector 在调用构造器时就对容量进行了初始化
3. ArrayList 存储数据的 Object 数组使用了 transient
关键字,Vector 的 Object 数组没有
4. ArrayList 和 Vector 的扩容机制不同
13.List和Set的区别:
(1)重复对象
list方法可以允许重复的对象,而set方法不允许重复对象
(2)null元素
list可以插入多个null元素,而set只允许插入一个null元素
(3)容器是否有序
list是一个有序的容器,保持了每个元素的插入顺序。即输出顺序就是输入顺序,而set方法是无序容器,无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序
14.HashSet和LinkedHashSet和 TreeSet 三者的对比:
1、HashSet、LinkedHashSet 和 TreeSet 都是 Set 接口的实现类,都能保证元素唯一,并且都不是线程安全的。
2、HashSet、LinkedHashSet 和 TreeSet 的主要区别在于底层数据结构不同。
HashSet 的底层数据结构是哈希表(基于 HashMap 实现)。
LinkedHashSet 的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO。
TreeSet 底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序。
3、底层数据结构不同又导致这三者的应用场景不同。
HashSet 用于不需要保证元素插入和取出顺序的场景,
LinkedHashSet 用于保证元素的插入和取出顺序满足 FIFO 的场景,
TreeSet 用于支持对元素自定义排序规则的场景。
15.Hashtable和HashMap的区别:
1.HashMap是线程异步,线程不安全的,Hashtable是线程同步,线程安全
2.HashMap的key是可以为null的,Hashtable是不可以为null
16.Comparator和Comparable的区别:
参数 | Comparable | Comparator |
排序逻辑 | 排序逻辑必须在待排序对象的类中,故称之为自然排序 | 排序逻辑在另一个实现 |
实现 | 实现Comparable接口 | 实现Comparator接口 |
排序方法 | int compareTo(object o1) | int compare(Object o1,Object o2) |
触发排序 | Collection.sort(List) | Collections.sort(List,Comparator) |
接口所在包 | java.lang.Comparable | java.util.Comparator |
Comparable和Comparator怎么选择?
当比较规则不会发生改变的时候,建议选择实现Comparable接口。
如果比较规则有多个,并且需要多个比较规则频繁切换,建议选择使用Comparator
17.当有哈希冲突时,HashMap是如何查找并确认元素的?
当哈希冲突时需要通过判断key值是否相等,才能确认此元素是不是我们想要的元素
解决哈希冲突的方法:开放定址法,链地址法
18.加载因子是来判断什么时候进行扩容
当加载因子设置比较大时,扩容发生的频率比较低且占用的空间会比较小,但这样的话发生hash冲突的几率就会增大,因此需要更复杂的数据结构去存储数据,这样对元素的操作时间 增加,运行效率会降低;
当加载因子设置较小的时候,会发生频繁的扩容且占用空间增大,此时hash冲突的可能性 就比较小,操作性能会提高。,但占用空间会比较大。
19.异常分类:
20.IO流:
21.创建线程的几种方式:
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
4.基于线程池
22.线程的生命周期:
1.NEW: 新建状态
2.RUNNABLE: 就绪状态
3.RUN:运行状态
4.BLOCKED: 阻塞状态
4.1WAITING: 等待状态
4.2TIMED_WAITING: 计时等待状态
5.TERMINATED:终止状态(死亡状态)
23.什么是守护线程
为用户提供公共服务,也叫后台进程
24.什么是Threadlocal变量?
ThreadLocal是一个本地线程副本变量工具类,可以理解为线程的本地变量。
主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,实现了线程的数据隔离,是线程独有的所以本身就是线程安全,特别适用于各个线程依赖多个不同的变量值完成操作的场景
25.volatile有什么用?能否用一句话说明下volatile的应用场景?
volatile保证内存可见性和禁止指令重排。
volatile用于多线程环境下的一写多读.
26. synchronized和 volatile的区别是什么?
1.volatile是变量修饰符:synchronized是修饰类、方法、代码段
2.volatile仅能实现变量的修改可见性,不能保证原子性: 而 synchronized则可以保证变量的修改可见性和原子性)
3.volatile不会线程的阻塞:synchronized可能会造成线程的阻塞
27.什么是阻塞队列?
阻塞队列是一个支持两个附加操作的队列:
1.在队列为空时,获取元素的线程会等待队列变为非空。
2.当队列满时,存储元素的线程会等待队列可用。
28.TCP三次握手:
1. 第一次握手,客户端向服务器端发出连接请求,等待服务器确认。
2. 第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求。
3. 第三次握手,客户端再次向服务器端发送确认信息,确认连接
29.TCP四次挥手:
(双方需要确认两次) 发送端和接收端断开逻辑连接
1.TCP客户端发送数据,用来关闭客户到服务器的数据传送。
2.服务器收到这个数据,它发回一个数据,确认序号为收到的序号加1
3.服务器关闭客户端的连接,发送一个数据给客户端。
4.客户端发回数据确认,并将确认序号设置为收到序号加1。
30.TCP和UDP的区别:
1.TCP面向连接,UDP面向非连接即发送数据前不需要建立链接
2.TCP数据传输慢,UDP数据传输快
3.TCP数据传输安全,UDP数据传输不安全
31.垃圾回收(守护线程)的三种算法:
1.标记-清除算法
2.标记-复制算法
3.标记-整理算法
32.什么是反射机制:
在 Java 中的反射机制是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方 法; 并且对于任意一个对象,都能够调用它的任意一个方法;这种动态获取信息以及动态调用 对象方法的功能成为Java 语言的反射机制。
33.Java反射API(反射 API 用来生成 JVM 中的类、接口或则对象的信息)
1. Class 类:反射的核心类,可以获取类的属性,方法等信息。
2. Field 类:Java.lang.reflec 包中的类,表示类的成员变量,可以用来获取和设置类之中的属性值。
3. Method 类: Java.lang.reflec 包中的类,表示类的方法,它可以用来获取类中的方法信息或者执行方法。
4. Constructor 类: Java.lang.reflec 包中的类,表示类的构造方法。
34.获取Class对象的3种方法:
1.调用Object的 getClass()方法
Person p=new Person(); Class clazz=p.getClass();
2.调用某个类的 class 属性来获取该类对应的 Class 对象
Class clazz=Person.class;
3.使用 Class 类中的 forName()静态方法(最安全/性能最好)
Class clazz=Class.forName("类的全路径"); (最常用)
35.什么是单例模式:
单例模式是指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。
36.单例模式的两种模式:
- 懒汉式:在真正需要使用对象时才去创建该单例类对象
- 饿汉式:在类加载时已经创建好该单例对象,等待被程序使用
37.如何编译和运行Java文件?
使用javac命令来编译.java文件(比如Test.Java),
运行之后会生产对应的Test.class文件
使用Java命令来运行java文件
38. final、finally、finalize有什么区别?
1.final可以修饰类、变量、方法,修饰类时表示该类不能被继承、修饰方法时表示该方法不能被重写、修饰变量时表示该变量是一个常量不能被重新赋值。
2.finally一般作用在try-catch代码块中,在处理异常的时候,通常将一定要执行的代码放在finally代码块中。表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
3.finalize是Object类的一个方法,它是用来实现垃圾回收的。在垃圾回收器执行时会调用被回收对象的finalize()方法,可以覆盖此方法来实现对其他资源的回收。
39.是否可以从一个static方法内部发出对非static方法的调用?
在static方法内部不可以直接调用非static方法,因为static方法被调用时无需创建对象,而非static方法需要创建对象后才能被调用。要想在static方法内部调用非static方法,可以在static方法内部先创建一个对象,然后通过对象来调用非static方法。
40. Integer与int的区别?
- Integer是int的包装类,int则是java基本数据类型中的一种,Integer变量必须实例化后才能使用,而int变量不需要。
- Integer是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象,而int是直接存储数据值。
- Integer的默认值是null,int的默认值是0
41.abstract的方法是否可同时是static、native和synchronized?
都不可以。
- abstract是指抽象方法,只有方法声明没有方法实现,不能被直接调用。
- static是类方法, 它可以不生成类的实例直接被类调用,而abstract方法不能被调用,所以static与abstract不能同时使用。
- native用来声明本地方法,一般用于java与外环境的交互。它与抽象方法类似,只有方法声明没有方法实现,native与abstract本身就是相冲突的,所以不能同时使用。
- synchronized是同步方法,然而同步是需要有具体操作才能实现的,但abstract只有方法声明,无法实现同步,所以static和synchronized不能同时使用
42. Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
Math.round方法表示“四舍五入”,即将原来的数字加上0.5后再向下取整,所以Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11。
43. Error和Exception有什么区别?
Exception和Error都是继承于Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出或者捕获,它是异常处理机制的基本组成类型。
Exception是Java程序运行中可预料的异常,可以获取到这种异常和进行业务外的处理。
Error是Java程序运行中不可预料的异常,这种异常发生以后,会直接导致JVM出现不可处理或者不可恢复的情况,所以这种异常不可能抓取到。
44. Java 中堆(heap)和栈(stack)有什么区别?
- 栈内存用来存储局部变量和方法调用,堆内存用来存储Java中的对象,无论是成员变量、局部变量还是类变量,它们指向的对象都存储在堆内存中,栈内存要远远小于堆内存。
- 栈内存属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,栈内存可以理解成线程的私有内存。
- 堆内存中的对象对所有线程可见,可以被所有线程访问。
45. io流怎样读取文件的?
io流使用File对象获取文件路径,通过字符流Reader加入文件,使用字符缓冲流BufferedReader处理Reader,最后定义一个字符串循环遍历输出文件。
46.Java自动装箱与拆箱?
自动装箱就是自动将基本数据类型转换为包装器类型,比如调用Integer的valueOf() 方法将int类型转换为Integer类型
自动拆箱就是自动将包装器类型转换为基本数据类型,比如调用Integer的intValue()方法将Integer类型转换为int类型
47.Java线程池中submit()方法和execute()方法有什么区别?
- submit()方法和execute()方法都可以向线程池提交任务。
- execute()方法的返回类型是void,它定义在Executor接口中,。
- submit()方法可以返回持有计算结果的Future对象,它定义在ExecutorService接口中,扩展了Executor接口
48. HTTP的长连接和短连接?
HTTP的长连接和短连接本质上是TCP长连接和短连接。
短连接:浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。
长连接:当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。长连接不会永久保持连接,它有一个保持时间,可以在不同的服务器软件中设定这个时间。
49.请求转发和重定向的区别:
1.重定向是两次请求,请求转发是一个请求
2.重定向是客户端行为,请求转发是服务器行为
3.重定向浏览器地址会发生改变,转发不会
4.重定向可以定向到任意地址,转发只能项目内转发
50.GET请求和POST请求的区别:
GET:请求的参数会在浏览器的地址栏中显示,不安全;请求的长度限制在1K之内。
没有请求体,无法通过request去设置一些参数。
POST:请求的参数不会在浏览器的地址栏中显示,相对安全。
把请求的参数封装成几个数据报文(请求体)。请求参数的长度没有限制。
51.数据库的隔离级别:
(1)读未提交
(2)读已提交
(3)可重复读
(4)串行化
52.MVC三层架构:
三层架构之间的关系:
53.Spring是什么?
Spring是一个轻量级的IoC和AOP容器框架。
54.Spring的优点?
(1)spring属于低侵入式设计,代码的污染极低;
(2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
(3)Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。
(4)spring对于主流的应用框架提供了集成支持。
55.什么是Mybatis
(1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,加载驱动、创建连接、创建statement等繁杂的过程,开发者开发时只需要关注如何编写SQL语句,可以严格控制sql执行性能,灵活度高。
(2)作为一个半ORM框架,MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
(3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和 statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。
56.#{}和${}的区别是什么?
${}是字符串替换,#{}是预处理;使用#{}可以有效的防止SQL注入,提高系统安全性。
Mybatis在处理${}时,就是把${}直接替换成变量的值。而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
57.通常一个mapper.xml文件,都会对应一个Dao接口,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
Mapper 接口的工作原理是JDK动态代理,Mybatis运行时会使用JDK动态代理为Mapper接口生成代理对象 MappedProxy,代理对象会拦截接口方法,根据类的全限定名+方法名,唯一定位到一个MapperStatement并调用执行器执行所代表的sql,然后将sql执行结果返回。
58.Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
第一种是使用标签,逐一定义数据库列名和对象属性名之间的映射关系。
第二种是使用sql列的别名功能,将列的别名书写为对象属性名。
有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。