目录
Math.cos为计算弧度的余弦值,Math.toRadians函数将角度转换为弧度
类之间的关系
Use-A依赖关系;Has-A 组合关系,合成关系;Is-A 继承关系
1. Use-A 依赖关系:“是类与类(通常为函数的参数)之间的连接,依赖总是单向的”
2. Has-A合成关系:“是关联关系的一种,是整体和部分(通常为一个私有的变量)之间的关系,并且代表的整体对象负责构建和销毁代表部分对象,代表部分的对象不能共享”
3. Is-A继承关系:“表示类与类之间的继承关系、接口与接口之间的继承的关系以及类对接口实现的关系”
初始化局部变量和全局变量
局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。
定义全局变量时,系统会自动对其初始化,如下所示:
注意:数组无论是定义为实例变量还是局部变量,若没有初始化,都会被自动初始化。
new URL()时必须捕获检查异常
这个异常是由于字符串格式和URL不符导致的,与网址是否存在无关。URL的toString方法返回字符串,无论网址是否存在。
@Test
public void testUrl() throws MalformedURLException {
URL url = new URL("http://www.baidu.com");
System.out.println(url);
}
Application、Applet和Servlet
1. Application
Java应用程序,是可以独立运行的Java程序,由Java解释器控制执行。
2. Applet
Java小程序,不能独立运行(嵌入到Web页中),由Java兼容浏览器控制执行。
3. Servlet
Java技术对CGI 编程的解决方案。
是运行于Web server上的、作为来自于Web browser 或其他HTTP client端的请求和在server上的数据库及其他应用程序之间的中间层程序。
ConcurrentHashMap
使用segment来分段和管理锁,segment继承自ReentrantLock,因此ConcurrentHashMap使用ReentrantLock来保证线程安全。(JDK 1.7)
JDK 1.8 数组+链表+红黑树
Arrays.asList()
返回 java.util.Arrays.ArrayList 对象,这里的 ArrayList 是 Arrays 私有的内部类。不能调用List的add(),remove()等方法,会报错:UnsupportedOperationException
如:
List list = Arrays.asList(1,2,3,4,5);
list.add(6);
Math.cos为计算弧度的余弦值,Math.toRadians函数将角度转换为弧度
request.getParameter获取内容的编码格式
1. 浏览器根据jsp页面开头声明的编码方式对request中参数编码;
2. tomcat默认解码是ISO-8859-1, 但是我们可以显示指定解码格式,通过调用 request.setCharacterEncoding("UTF-8"),或者修改tomcat的配置文件server.xml中的编码,添加uriEncoding属性。
JVM 垃圾回收
1. 垃圾回收在jvm中优先级相当相当低。
2. 垃圾收集器(GC)程序开发者只能推荐JVM进行回收,但何时回收,回收哪些,程序员不能控制。
3. 垃圾回收机制只是回收不再使用的JVM内存,如果程序有严重BUG,照样内存溢出。
4. 进入DEAD的线程,它还可以恢复,GC不会回收。真正宣布一个对象死亡,至少需要经历2次标记过程。当第一次标记时会同时进行一次筛选(判断此对象是否有必要执行finalize方法)。如果对象没有覆盖该方法,就面临死亡,所以说这个方法是对象逃脱死亡命运的最后一次机会。
volatile关键字的作用
volatile是java中的一个类型修饰符。
用来修饰被不同线程访问和修改的变量。如果不加入volatile,基本上会导致这样的结果:要么无法编写多线程程序,要么编译器失去大量优化的机会。
1. 可见性
可见性指的是在一个线程中对该变量的修改会马上由工作内存(Work Memory)写回主内存(Main Memory),所以会马上反应在其它线程的读取操作中。顺便一提,工作内存和主内存可以近似理解为实际电脑中的高速缓存和主存,工作内存是线程独享的,主存是线程共享的。
2. 禁止指令重排序优化
大家知道我们写的代码(尤其是多线程代码),由于编译器优化,在实际执行的时候可能与我们编写的顺序不同。编译器只保证程序执行结果与源代码相同,却不保证实际指令的顺序与源代码相同。这在单线程看起来没什么问题,然而一旦引入多线程,这种乱序就可能导致严重问题。volatile关键字就可以从语义上解决这个问题。
注意,禁止指令重排优化这条语义直到jdk1.5以后才能正确工作。此前的JDK中即使将变量声明为volatile也无法完全避免重排序所导致的问题。所以,在jdk1.5版本前,双重检查锁形式的单例模式是无法保证线程安全的。
JSP九大内置对象
1. request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。
2. response对象
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。
3. session对象
session对象指的是客户端与服务器的一次会话,从客户连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例。
4. application对象
application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
5. config对象
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)
6. out对象
out对象是JspWriter类的实例,是向客户端输出内容常用的对象。
7. page对象
page对象就是指向当前JSP页面本身,有点像类中的this指针,它是java.lang.Object类的实例
8. exception对象
exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
9. pageContext对象
pageContext对象提供了对JSP页面内所有的对象及名字空间的访问,也就是说他可以访问到本页所在的SESSION,也可以取本页面所在的application的某一属性值,他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。
自动数据类型转换
自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:
低 --------------------------------------> 高
byte,short,char-> int -> long -> float -> double
抽象类和接口的修饰符
1. 关于抽象类
JDK 1.8以前,抽象类的方法默认访问权限为protected
JDK 1.8时,抽象类的方法默认访问权限变为default
2. 关于接口
JDK 1.8以前,接口中的方法必须是public的
JDK 1.8时,接口中的方法可以是public的,也可以是default的
JDK 1.9时,接口中的方法可以是private的
原因:
为了避免冗余代码并提高可重用性,Oracle 计划在 Java SE 9 的接口中引入私有方法。从 Java SE 9 开始可以在接口中使用 ‘private’ 关键字写私有方法和私有静态方法了。
ThreadLocal类用于创建一个线程本地变量
在Thread中有一个成员变量ThreadLocal,该变量的类型是ThreadLocalMap,也就是一个Map,它的键是threadLocal,值为就是变量的副本。通过ThreadLocal的get()方法可以获取该线程变量的本地副本,在get方法之前要先set,否则就要重写initialValue()方法。
myBatis面试题 如何构建一个线程安全的SqlSession
在java中一个unicode占2个字节(byte)
一个字节等于8比特位(bit)。
所以每个Unicode码占用16个比特位。