您的位置:首页 > 编程语言 > Java开发

个人java基础知识点踩过的坑

2018-01-29 11:31 134 查看
1:一般方法传递时候,只有基本数据类型和String才会传递副本(值传递),其他的类型是按引用的传递的(引用传递)。

2:①无论如何,Integer与new
Integer不会相等。不会经历拆箱过程, 

  ②两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false 
  java在编译Integer i2 = 128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存 
  ③两个都是new出来的,都为false 
  ④int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比

3:构造函数不能被继承,构造方法只能被显式或隐式的调用。

4:abstract 不能与private、static、final或native并列修饰同一个方法。

5:系统类加载器主要有3个,引导类加载器(加载java的核心库)、扩展类加载器(加载java的扩展库)、系统类加载器(根据java应用的类路径加载java类)。

6:HttpServletResponse.sendRedirect()方法将响应定向到参数location指定的、新的URL。location可以是一个绝对的URL,如
response.sendRedirect("http://java.sun.com")也可以使用相对的URL,是请求转发,前后页面共享一个request  。将导致客户端浏览器的请求URL跳转。从浏览器中的地址栏中可以看到新的URL地址,作用类似于上面设置HTTP响应头信息的实现。 
RequestDispatcher.forward()方法将当前的request和response重定向到该 RequestDispacher指定的资源。是重新定向,前后页面不是一个request。

7: spring使用BeanFactory来实例化、配置和管理对象,但是它只是一个接口,里面有一个getBean()方法。
我们一般都不直接用BeanFactory,而是用它的实现类 ApplicationContext ,这个类会自动解析我们配置的applicationContext.xml

8:注入方式:接口注入、属性注入(属性的get/set)、构造注入(构造方法注入)。
使用构造函数依赖注入时,Spring保证一个对象的所有依赖的对象先实例化后,才实例化这个对象。
使用属性注入时,Spring先实例化对象,然后才实例化所有依赖的对象。
当属性注入和构造注入同时存在时,先执行属性注入,再执行构造注入。

9:Spring
mvc和Struts2的区别:1,spring mvc是基于方法的设计,而struts2是基于类的设计,每次发一次请求都会实例一个action,每个action都会被注入属性,而spring基于方法,粒度更细,性能:spring会稍微比struts快。。
2.struts2有以自己的interceptor机制,spring mvc用的是独立的AOP方式。 3.spring mvc的方法之间基本上独立的,独享request response数据,struts2所有Action变量是共享的。 4.机制:spring mvc的入口是servlet,而struts2是filter。

10:
PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

11:通过堆栈获取调用方法名称
StackTraceElement[] stackElements = Thread.currentThread().getStackTrace();
String methodName = stackElements[2].getMethodName();
if(!methodName.startsWith("query")){
LogUtil.log(request,methodName,result.toString(),(new Date()).getTime() - begin.getTime(),"0");
}

12:java中class.forName()和classLoader都可用来对类进行加载。
class.forName()前者除了将类的.class文件加载到jvm中之外,还会对类进行解释,执行类中的static块。
而classLoader只干一件事情,就是将.class文件加载到jvm中,不会执行static中的内容,只有在newInstance才会去执行static块。

13:CAS CAS:Compare and Swap, 翻译成比较并交换。  java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。 CAS应用 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

14:简单记忆线程安全的集合类:
喂!SHE!  喂是指  vector,S是指 stack, H是指    hashtable,E是指:Eenumeration

15: 当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到CPU缓存中。如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中。而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步。 在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: