java知识库

 

1、加载配置文件

classpath:spring/springmvc.xml

classpath*:spring/springmvc.xml

两者的区别在于前者只加载本项目下的配置文件,而后者还会加载“添加的jar包”中的配置文件。

 

2、动态代理

备注:参考项目ProxyTanSuo

2.1  JDK动态代理   

代理类要实现InvocationHandler接口,实现它的invoke()方法,利用形参Method对象的回调方法--invoke()方法来实现代理。

2.2  Cglib动态代理   

 JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢?,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。

性能分析:CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。

注意:要导入两个jar包--cglib.jar和asm.jar;由于很多java字节码操作和分析的第三方类库都引用了asm.jar文件,所以需要导入它;

缺少asm.jar会导致以下异常:java.lang.NoClassDefFoundError:org/objectweb/asm/Type

 

3、注解

备注:参考项目Annotation&Enum_TanSuo

 

3.1  常用注解

@Target(value={ElementType.TYPE,ElementType.METHOD}),此注解用于指定注解可以支持的范围,例如ElementType.TYPE--类,ElementType.METHOD--方法;

 

@Retention(value=RetentionPolicy.RUNTIME),此注解用于指定注解存在的范围。只有设置成RUNTIME,注解才可以在运行时被获取到。默认是CLASS;

 

 

@Documented(未弄清楚)

被@Documented修饰的注解会生成到javadoc中

@Inherited

此注解用于指定被修饰的注解能否被继承

 

3.2  自定义注解

 

 

 

4、枚举类型

备注:参考项目Annotation&Enum_TanSuo

枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。 在JDK1.5之前,我们定义常量都是:public static fianl....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

总结:枚举的本质是类,在没有枚举之前,仍然可以按照java最基本的编程手段来解决需要用到枚举的地方。枚举屏蔽了枚举值的类型信息,不像在用public static final定义变量必须指定类型。枚举是用来构建常量数据结构的模板,这个模板可扩展。枚举的使用增强了程序的健壮性,比如在引用一个不存在的枚举值的时候,编译器会报错。枚举的更多用法还需要在开发中去研究创造。

注意:枚举类中没有方法和属性,只有项,一般都是大写。定义的项的值就是其本身。

如果需要为项指定属性,那么就需要指定构造方法和getter、setter方法。

 

 

5、load-on-startup属性

相关概念:

1、load-on-startup元素标记容器是否在服务器启动的时候就加载这个servlet(实例化并调用其init()方法)。

2、它的值必须是一个整数,表示servlet应该被载入的顺序。当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;

3、当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。

4、正数的值越小,该servlet的优先级越高,应用启动时就越先加载。

5、当值相同时,容器就会自己选择顺序来加载。

实例:

 

 

6、web.xml中的文件路径如果不加classpath,那么系统默认会去哪里找?

 

通过以上异常可以发现,系统会去ServletContext(Servlet上下文)找指定的文件,而ServletContext其实就是WebRoot,所以我们应该把文件放到WebRoot下面,系统回到这里寻找。当我们输出上下文的路径时,系统会输出项目的名称;

 

7、高内聚

 

 

8、扇入与扇出

 

 

9、decimal(18,2)

相关概念:

18代表精度(其实就是数字的个数,除了小数点),2代表小数位数;

decimal(a,b)

-->a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。

b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0。

a与b的差值最小为3,比如decimal(4,1)可以,但是decimal(4,2)却不行;

10、运算符优先级别

相关概念:

关系运算符:小于、大于、等于、大于等于、小于等于、不等于;

赋值运算符:基本的是“=”,它的优先级别低于其它的运算符,所以它往往是最后被读取;

算术运算符:+  -   *  /  %  ^  !  |x|;

-->其优先级别:3级(/  *  %),4级(+  -);

逻辑运算符:NOT、AND、OR;

 

实例:

由高向低:()、!、算术运算符、关系运算符、逻辑运算符、赋值运算符;

 

11、"=="与"equals"的区别(*

java中,"=="比较存储位置,而"equals"其实也是比较存储位置。equals方法有Object类定义,有很多类如Integer和String都重写了方法,所以两者的equals方法的功能就不同了。Integer的equals方法是比较两者数值是否相等:

 

String的equals方法是比较两者字面上是否完全一样:

 

需要注意的实例:

example1:String a="abc";  String b="abc";

那么a==b将返回true。因为在java中字符串的值是不可改变的,相同的字符串在内存中只会存一份,所以a和b指向的是同一个对象;

 

example2:String a=new String("abc"); String b=new String("abc");

那么a==b将返回false,此时a和b指向不同的对象。

 

String a="abc",是存在String pool里;

String a=new String("abc");是存在对象pool里;

这两者有区别,前者是简单类型,后者是对象类型。

 

12、String、StringBuffer、StringBuilder三者的区别

http://blog.csdn.net/qq_36128330/article/details/59123553

注意:

String是不可变类,所以是线程安全的;

所有不可变类都是线程安全的,线程安全的类不一定是不

可变类,如StringBuffer是可变类,它靠锁实现线程安全;

 

 

 

特别注意(自己总结的概念、小细节):

1、别名定义,如果两个包中有相同的类-->系统会抛出异常;

2、如果html中的两个表单名称及其中的元素名称都相同,当对同名的元素进行js调用时,系统会出错;

3、html中的img标签不能使用绝对路径;

4、在网页中调节图片大小的宽度时,图片高度也会随之改变;不过可以同时指定宽度和高度;

5、如果一个方法、属性或类上面写着许多不同的注解,那么这些注解都会被引用,注解之间也许会相互制约;如@Ignore和@Test注解同时出现,那么程序会使用Ignore注解;

6、spring框架中的global session为整个HTTP请求中,在作用域方面就是application;

7、hibernate映射文件中不能写schema="dbo";

8、id在苹果电脑上作为一个关键字,所以数据库中的字段别定义为id;

9、mybatis中驼峰命名规则不会自动映射;

10、八大基本数据类型有一个是boolean,不包含String;

11、final 类,无法被继承

final方法,无法被覆盖,重写

final变量,无法被修改

12、反射是什么:

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

13、反射的作用:

1)在运行时判断任意一个对象所属的类。

2)在运行时判断任意一个类所具有的成员变量和方法。

3)在运行时任意调用一个对象的方法

4)在运行时构造任意一个类的对象

可以通过配置文件来动态配置和加载类,以实现软件工程理论里所提及的类与类,模块与模块之间的解耦。反射最经典的应用是spring框架。

14、泛型是什么:

泛型是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类,泛型一般是用来解决代码复用的问题。

15、泛型的作用:

保证类型安全;

消除类型转换,增强代码可读性,减少出错机会;

提升性能,无需装箱和拆箱;

实现了代码复用;

16、AOP是什么:

简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”

17、AOP的应用场景:

性能监测,访问控制,事务管理、缓存、对象池管理以及日志记录。

18、Ajax的格式:

$.ajax({

type:"get",

url:"test01.action",

data:$("#myform").serialize(),

async:true,

success:function(){

alert("dd");

 

}

});

19、java四大常用连接池:

c3p0、BoneCP、Proxool、DBCP

20、java中获取的毫秒数是当前时间与"1970-01-1 8:0:0"的时间差;

21、mysql数据库导出的SQL文件不能有任何改动,否则就导入时会出错;

但是你可以将字段名和表名的单引号去掉,这样就可以了。

22、分工的时候一定得按模块来分的,绝对不能把一个模块分给几个人一起开发,因为那样公共的代码接口不好写。就比如我和邓泽军一起写广告模块,有些功能我这边其实一起完成,但那是他的模块,我又不好写,有点小顾忌;而且我这边改动会影响他,导致开发效率降低。

23、做事之前一定要考虑是否有更简单的方式去实现要求,否则耗费的时间会很多。

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/syjp/p/11082321.html