No.1
运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器
- 虚拟机栈区 :也就是我们常说的栈区,线程私有,存放基本类型,对象的引用和 returnAddress ,在编译期间完成分配。
- 堆区 , JAVA 堆,也称 GC 堆,所有线程共享,存放对象的实例和数组, JAVA 堆是垃圾收集器管理的主要区域。
- 方法区 :所有线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的对象的回收和对类型的卸载。
- 程序计数器 :线程私有,每个线程都有自己独立的程序计数器,用来指示下一条指令的地址。
No.2
SpringMVC的原理:
SpringMVC是Spring中的模块,它实现了mvc设计模式的web框架,首先用户发出请求,请求到达SpringMVC的前端控制器(DispatcherServlet),前端控制器根据用户的url请求处理器映射器查找匹配该url的handler,并返回一个执行链,前端控制器再请求处理器适配器调用相应的handler进行处理并返回给前端控制器一个modelAndView,前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染并把数据装入到request域,返回给用户。
DispatcherServlet作为springMVC的前端控制器,负责接收用户的请求并根据用户的请求返回相应的视图给用户。
实现业务操作时在service层。
No.3
以下来自牛客网“阿森先生 ”:
main()函数即主函数,是一个前台线程,前台进程是程序中必须执行完成的,而后台线程则是java中所有前台结束后结束,不管有没有完成,后台线程主要用与内存分配等方面。
前台线程和后台线程的区别和联系:
-
后台线程不会阻止进程的终止。属于某个进程的所有前台线程都终止后,该进程就会被终止。所有剩余的后台线程都会停止且不会完成。
-
可以在任何时候将前台线程修改为后台线程,方式是设置Thread.IsBackground 属性。
-
不管是前台线程还是后台线程,如果线程内出现了异常,都会导致进程的终止。
-
托管线程池中的线程都是后台线程,使用new Thread方式创建的线程默认都是前台线程。
应用程序的主线程以及使用Thread构造的线程都默认为前台线程
使用Thread建立的线程默认情况下是前台线程,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序
jre 判断程序是否执行结束的标准是所有的前台线程执行完毕。
No.4
以下来自牛客网“MyGoodHelper ”:
会话跟踪是一种灵活、轻便的机制,它使Web上的状态编程变为可能。
HTTP是一种无状态协议,每当用户发出请求时,服务器就会做出响应,客户端与服务器之间的联系是离散的、非连续的。当用户在同一网站的多个页面之间转换时,根本无法确定是否是同一个客户,会话跟踪技术就可以解决这个问题。当一个客户在多个页面间切换时,服务器会保存该用户的信息。
有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。
- 隐藏表单域:,非常适合步需要大量数据存储的会话应用。
- URL 重写:URL 可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。
- Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至在客户端计算机重启后它仍可以保留其值
- Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话
No.5
Java语言中,如果"xyz"没有被创建过,String s =new String(“xyz”);创建了几个string object?
- 两个。第一个在堆中,第二个在字符串常量池中。如果在Java字符串常量池中已经存在,就只会创建一个。
No.6
public class Solution {
static String x="1";
static int y=1;
public static void main(String args[]) {
int z=2;
System.out.println(z+y+x+y+z);
}
}
运行结果:3112
No.7
以下答案来自:
public static Integer valueOf(int i) {
assert IntegerCache.high>= 127;
if (i >= IntegerCache.low&& i <= IntegerCache.high)
return IntegerCache.cache[i+ (-IntegerCache.low)];
return new Integer(i); }
Integer i01=59 的时候,会调用 Integer 的 valueOf 方法, 这个方法就是返回一个 Integer 对象,只是在返回之前,看作了一个判断,判断当前 i 的值是否在 [-128,127] 区别,且 IntegerCache 中是否存在此对象,如果存在,则直接返回引用,否则,创建一个新的对象。 在这里的话,因为程序初次运行,没有 59 ,所以,直接创建了一个新的对象。
int i02=59 ,这是一个基本类型,存储在栈中。
Integer i03 =Integer.valueOf(59); 因为 IntegerCache 中已经存在此对象,所以,直接返回引用。
Integer i04 = new Integer(59) ;直接创建一个新的对象。
-
System. out .println(i01== i02); i01 是 Integer 对象, i02 是 int ,这里比较的不是地址,而是值。 Integer 会自动拆箱成 int ,然后进行值的比较。所以,为真。
-
System. out .println(i01== i03); 因为 i03 返回的是 i01 的引用,所以,为真。
-
System. out .println(i03==i04); 因为 i04 是重新创建的对象,所以 i03,i04 是指向不同的对象,因此比较结果为假。
-
System. out .println(i02== i04); 因为 i02 是基本类型,所以此时 i04 会自动拆箱,进行值比较,所以,结果为真。
No.8
- 一个文件中,可以有多个public class.外部类为public,还可以有public的内部类。
public class Main { public class Inner{
}
}
- 类中,可以有main方法,也可以没有main方法,而有一个main()方法的时候,也可以是任意访问权限。因为这个类不一定要执行,可以只是辅助类。
- 一个类中,可以有多个main方法,这是重载,但是public static void main(String[] args)的方法只能有一个。
No.9
- 当字符型与整型运算时会自动转换成整型。
- byte和short型在计算时会自动转换为int型计算,结果也是int 型。所以a1*a2的结果是int 型的。
No.10
Java的异常分为两种,一种是运行时异常(RuntimeException),一种是非运行异常也叫检查式异常(CheckedException)。
- 运行时异常不需要程序员去处理,当异常出现时,JVM会帮助处理。常见的运行时异常有:
ClassCastException(类转换异常)
ClassNotFoundException
IndexOutOfBoundsException(数组越界异常)
NullPointerException(空指针异常)
ArrayStoreException(数组存储异常,即数组存储类型不一致)
还有IO操作的BufferOverflowException异常 - 非运行异常需要程序员手动去捕获或者抛出异常进行显示的处理,因为Java认为Checked异常都是可以被修复的异常。常见的异常有:
IOException
SqlException
分母为0属于运行时异常。
No.11
count = count++ 原理是 temp = count; count = count+1 ; count = temp; 因此count始终是0
No.12
DBMS中事务有四个特性,持久性,一致性,原子性,隔离性。
- 持久性实现恢复管理子系统,
- 一致性实现并发控制子系统,
- 原子性实现完整性管理子系统,
- 隔离性实现安全控制管理子系统。