循环优化:代码外提 删除归纳变量 强度削弱
“==”:作用是判断两个对象的地址是否相等,即,判断两个对象是不是同一个对象,
如果是基本数据类型,则比较的是值是否相等。
"equal":作用是判断两个对象是否相等,但一般有两种使用情况
1.类没有覆盖equals()方法,则相当于通过“==”比较
2.类覆盖equals()方法,一般,我们都通过equals()方法来比较两个对象的内容是否相等,
相等则返回true,如String
地址比较是通过计算对象的哈希值来比较的,
hashcode属于Object的本地方法,对象相等(地址相等),hashcode相等,
对象不相等,hashcode()可能相等,哈希冲突
hashCode()的存在是为了查找的快捷性,用于在散列存储结构中确定对象的存储地址 如果两个对象 equals相等,则 hashCode()也一定相等 如果 equals方法被重写,则 hashCode()也应该被重写 如果两个对象的 hashCode()相等, equals()方法不一定相等 equals方法没有重写,比较的就是应用类型的变量所指向的对象的地址
首先要注意的是 (short)10/10.2*2,只是把10强转成short。有由于式子中存在浮点数,所以会对结果值进行一个自动类型的提升,浮点数默认是double,
而(short) (10/10.2*2)是把计算完之后的值强转成short
A. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
//正确,这里的所谓动态数组并不是那个“ 有多少元素就申请多少空间 ”的意思,通过查看源码,可以发现,这个动态数组是这样实现的,如果没指定数组大小,则申请默认大小为10的数组,当元素个数增加,数组无法存储时,系统会另个申请一个长度为当前长度1.5倍的数组,然后,把之前的数据拷贝到新建的数组。
----------------------------------------------------------------------
B. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
//正确,ArrayList是数组,所以,直接定位到相应位置取元素,LinkedLIst是链表,所以需要从前往后遍历。
-----------------------------------------------------------------------
C. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
//正确,ArrayList的新增和删除就是数组的新增和删除,LinkedList与链表一致。
-------------------------------------------------------------------------
D. ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。
//正确,因为ArrayList空间的增长率为1.5倍,所以,最后很可能留下一部分空间是没有用到的,因此,会造成浪费的情况。对于LInkedList的话,由于每个节点都需要额外的指针,所以,你懂的。
-------------------------------------------------------------------------
非静态成员只能被类的实例化对象引用,因此这里在静态方法中访问x会导致编译报错
Java的跨平台特性是因为JVM的存在,它可以执行.class字节码文件,而不是 .java源代码。
我们编译好的文件是以 .java后缀保存的看,编译器会自动帮我们生成一个标准的 .class字节码文件,JVM运行该文件,JVM也是一个软件,不同的系统平台JVM不同,但都可以实现标准的 .class字节码文件。
跨平台是JVM决定的,而JVM处理的是class字节码文件 write once,run everywhere值得是编译后的字节码可以跨平台执行,也就是class文件,而不是java源文件
A、JDK8开始,接口中可以定义有方法体的方法,方法必须被default和static修饰。除此之外,其他方法都是抽象方法。
B、Java的语法是单继承,但是继承可以传递。其实B更准确一点是只能有一个直接父类。
C、继承用extends,实现用implements。先继承后实现。
D、定义接口是interface 实现接口是implements
Java 语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,即包装类。对应的基本类型和包装类如下表:
基本数据类型 | 包装类 |
byte | Byte |
boolean | Boolean |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
1、如果是本类使用,可以直接就用静态变量名。
2、如果是其他类使用,可以使用类名来调用,也可以创建一个实例对象来调用。
3、如果静态变量所在的类是静态类,那么不管在本类里或者在其他外部类,都可以直接使用静态变量名。
重写Overriding是父类与子类之间多态性的一种表现,子类重写父类的方法
重载Overloading是一个类中多态性的一种表现。
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。
如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。
Overloaded的方法是可以改变返回值的类型(重载和返回值的类型无关)
try-catch是必须在一起使用的,而finally是根据需要进行使用,一般用来关闭资源。
AOP的概念是Aspected Oriented Programming 面向切面编程。
好处:AOP将程序分解成各个方面或者说关注点。这使得可以模块化,相当横向上分切了。
它可以解决OOP和过程化方法不能够很好解决的横切(crosscut)问题,如:事务、安全、日志等横切关注
实现AOP有几种方式:
1. Spring 1.2版本中通过ProxyFactoryBean来实现aop,即通过动态代理来实现的,Aspect必须继承 MethodBeforeAdvice,MethodAfterAdvice等
2. Spring 2.0 AOP需要改的是FBI 这个类,而且它也不需要再实现某些接口
3. 三使用标注(@AspectJ)实现AOP
AOP 和 OOP的区别:
1. 面向方面编程 AOP 偏重业务处理过程的某个步骤或阶段,强调降低模块之间的耦合度,使代码拥有更好的移植性。
2. 面向对象编程 (oop) 则是对业务分析中抽取的实体进行方法和属性的封装。
也可以说 AOP 是面向业务中的动词领域, OOP 面向名词领域。
AOP 的一个很重要的特点是源代码无关性,也就是说如果我们的系统中引用了 AOP 组件,即使我们把该组件去掉,系统代码也应该能够编译通过。要实现这一点,可以使用动态 proxy 模式。
AOP将散落在系统中的“方面”代码集中实现;
AOP有助于提高系统可维护性;
AOP是一种设计模式,Spring提供了一种实现;
jps:查看本机java进程信息。 jstack:打印线程的栈信息,制作线程dump文件。 jmap:打印内存映射,制作堆dump文件 jstat:性能监控工具 jhat:内存分析工具 jconsole:简易的可视化控制台 jvisualvm:功能强大的控制台 jinfo可以查看当前堆内存的分配情况,如年轻代多少,老年代多少