简单的区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构(LinkedList是双向链表,有next也有previous);
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针;
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据;
深度的区别:
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象;
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的;
3.LinkedList不支持高效的随机元素访问;
4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间;
区别:
1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象;
2、抽象类要被子类继承,接口要被类实现;
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现 ;
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量;
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类;
6、抽象方法只能申明,不能实现。abstract void abc();不能写成abstract void abc(){};
7、抽象类里可以没有抽象方法;
8、如果一个类里有抽象方法,那么这个类只能是抽象类;
9、抽象方法要被实现,所以不能是静态的,也不能是私有的;
10、接口可继承接口,并可多继承接口,但类只能单根继承;
类不能继承多个类 接口可以继承多个接口 类可以实现多个接口;
原理区别:
java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理;
而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理;
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP;
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP;
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换;
1)添加CGLIB库,SPRING_HOME/cglib/*.jar ;
2)在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>;
1)JDK动态代理只能对实现了接口的类生成代理,而不能针对类 ;
2)CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 因为是继承,所以该类或方法最好不要声明成final;
1、被final修饰的类不可以被继承 ;
2、被final修饰的方法不可以被重写 ;
3、被final修饰的变量不可以被改变(切记不可变的是变量的引用而非引用指向对象的内容。);
4、被final修饰的方法,JVM会尝试为之寻求内联,这对于提升Java的效率是非常重要的。因此,假如能确定方法不会被继承,那么尽量将方法定义为final的,
具体参见运行期优化技术的方法内联部分 ;
5、被final修饰的常量,在编译阶段会存入调用类的常量池中,具体参见类加载机制最后部分和Java内存区域;
1) start:
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止;
2) run:
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void;
1、一种面向对象的编程语言;
2、一种与平台无关的语言(根据JVM实现的);
3、一种健壮性语言;
4、具有较高的安全性;
先编译(.class),在解释运行;
1、编写源程序,java源代码文件;
2、编译源程序,编译器编译编译成java字节码文件;
3、运行,java虚拟机(JVM);
JDK:java开发工具包:
先编译(编译器javac),后运行(解释器java);
JRE:java运行环境:
加载代码(加载器),校验代码(校验器),执行代码(解释器);
1)Java语言是一种面向对象的编程语言;
2)简单、高效、稳定、安全性高;
3)Java语言是一种与平台无关的编程语言,因为其自身提供程序运行的解释环境;
4)支持多线程处理;
5)Java语言是一种面向网络的高级语言;
1) .javac — 编译器,将源程序转为字节码;
2) .jar — 打包工具,将相关的类文件打包成一个文件;
3) .javadoc — 文档生成器,从源码注释中提取;
4) .jdb — debugger,查错工具;
5) .java — 运行编译后的Java程序(后缀为.class)使用dir命令可查看D盘中的所有文件运行javac HelloWorld.java命令java HelloWorld;
原文:https://www.cnblogs.com/yyqc2017/p/12870588.html