1、什么是 GC?为什么要有 GC?
GC(Garbage Collection)是垃圾收集的意思,负责清除对象并释放内存。Java 提供的 GC 功能可以自动检测对象是否超过作用域从而达到自动回收内存的目的,从而防止内存泄漏。
2、final, finally 和 finalize 的区别?
final 用于声明属性,方法和类,表示属性不可变,方法不可被重写,类不可被继承。
finally 是异常处理语句结构的一部分,表示总是执行。
finalize 是 object 类的一个方法,在垃圾收集器执行的时候会调用这个对象回收的方法,工垃圾收集时其他资源的回收,比如关闭文件。
3、什么是单例模式?实现步骤?
单例模式保证了对象唯一。分为懒汉式(在类加载时不初始化)和饿汉式(在类加载时就完成了初始化,所以类加载比较慢,但获取对象的速度快)。
实现步骤:私有化构造函数、创建一个静态的私有对象、提供公共的访问方法。
第一种:饱汉模式
public class SingleTon { private SingleTon() { } // 实例化放在静态代码块里可提高程序的执行效率,但也可能更占用空间 private final static SingleTon instance = new SingleTon(); public static SingleTon getInstance() { return instance; } }
第二种:饥汉模式
public class SingleTon { private SingleTon() { } private static SingleTon instance = null;//new SingleTon(); public static synchronized SingleTon getInstance(){ if(instance == null) instance = new SingleTon(); return instance; } }
事务的 ACID 是什么?事务并发会产生哪些问题?
ACID 表示事务的特性:原子性、一致性、隔离性和持久性。
原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
一致性(Consistent):事务结束后系统状态是一致的;
隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。
事务并发产生的问题:脏读、幻读、不可重复读。
脏读(Dirty Read):A 事务读取 B 事务尚未提交的数据并在此基础上操作,而 B 事务执行回滚,那么 A 读取到的数据就是脏数据。
幻读(Phantom Read):事务 A 重新执行一个查询,返回一系列符合查询条件的行,发现其中插入了被事务 B 提交的行。
不可重复读(Unrepeatable Read):事务 A 重新读取前面读取过的数据,发现该数据已经被另一个已提交的事务 B 修改过了。
SpringMVC 执行流程
1、用户发送请求至 DispatcherServlet(前端控制器);
2、DispatcherServlet 收到请求调用 HandlerMapping(处理器映射器);
3、HandlerMapping 找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet;
4、DispatcherServlet 调用 HandlerAdapter(处理器适配器);
5、HandlerAdapter 经过适配调用具体的 Controller (处理器,也叫后端控制器);
6、Controller 执行完成返回 ModelAndView 对象;
7、HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet;
8、DispatcherServlet 将 ModelAndView 传给 ViewReslover(视图解析器);
9、ViewReslover 解析后返回具体 View;
10、DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中);
11、DispatcherServlet 响应用户
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译
float f=3.4,错误。双精度转单精度,下转型,需强转。float f =(float)3.4; 或者写成float f =3.4F
Math.round(11.5)的返回值是12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加0.5然后
进行下取整。
用最有效率的方法算出2乘以8等於几?
2 << 3,
因为将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,而位运算cpu直接支持的,效率最高,所以,2乘以8等於几的最效率的方法是2 << 3
是否可以继承String类?
String类是final类故不可以继承。
日期和时间:
1.获得年月日、小时分钟秒
Calendar cal = Calendar.getInstance();
System.out.println(cal.get(Calendar.YEAR));
System.out.println(cal.get(Calendar.MONTH)); // 0 - 11
System.out.println(cal.get(Calendar.DATE));
System.out.println(cal.get(Calendar.HOUR_OF_DAY));
System.out.println(cal.get(Calendar.MINUTE));
System.out.println(cal.get(Calendar.SECOND));
2.获得该毫秒数
一下三种方式均可获得毫秒数 :
Calendar.getInstance().getTimeInMillis();
System.currentTimeMillis();
Clock.systemDefaultZone().millis();
3.打印昨天的当前时刻
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DATE, -1);
System.out.println(cal.getTime());
怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?
String s1 =
"你好"
;
String s2 =
new
String(s1.getBytes(
"GB2312"
),
"ISO-8859-1"
);
Java内存模型是怎样的?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
1 . 方法区: a. 方法区是各线程共享内存的区域。 b. 它存放类的信息、 static 变量、常量(常量池包含于方法区)、即时编译器编译后的代码数据。 c. 它属于非堆部分。 2 . 堆(先进先出): a. 堆是内存最大的一块区域,堆是各线程共享内存的区域。 b. 堆中存放被创建的实例对象、数组。 c. 堆是GC管理的主要区域。 3 . 栈(先进后出): a. 栈是线程私有的,它的生命周期与线程相同。线程生命周期(创建,就绪,运行,阻塞,死亡) b. 栈是java方法执行的内存模型: 每个方法执行时会在栈中创建一个栈帧(stack frame),用于存放 局部变量表、操作栈、动态链接、方法出口等信息。方法从执行开始就完成了 压栈 到 弹栈 的过程。 局部变量表中存放了基本数据类型( int , short , long , char , byte , float , double , boolean ,其中 long 、 double 两个 64 位长度的类型会占用两个局部变量空间、其他的只占一个)、对象引用(并非本身,引用指向堆中的对象地址)、方法返回类型。 局部变量表所需控件在编译时就已经确定了,因此方法运行期间不会改变其内存大小。 4 . 本地方法栈: a. 与java虚拟机栈功能类似,区别在于服务对象不同,该栈服务于jvm使用的 native 方法。 5 . 程序计数器: a. 每条线程执行时都有自己的程序计数器,互不影响。 b. 程序计数器指向该计数器的拥有者(线程)下一步执行的位置。 |