2019/08/05的准备

  1. 早上查题,背一遍然后检查自己一遍以上
  2. 中午有时间就背一遍以复习昨天的为主
  3. 晚上背一遍,第二天中午再看一眼:day+1
  4. 第四天课间看一遍:day+3
  5. 第七天课间看一遍:day+6
  6. 第十五天课间看一遍:day+14

重写equals和hashcode方法

 @Override
	    public boolean equals(Object o) {
//同一个对象相等
		 	if (this == o) {
	            return true;
	        }
// 比较的对象为空或不同对象返回false
	        if (o == null || !(o instanceof Test4)) {
	            return false;
	        }
//Objects.equals(s1, s2); 这个方法可以容忍空指针异常      
	        Test4 that = (Test4) o;
	        return Objects.equals(this.empId, that.empId);
	    }
	    
	 @Override
	    public int hashCode() {
	        return Objects.hash(empId);
	    }

List接口两个实现类的区别:
ArrayList
1.ArrayList是线性顺序存储的,是一种线性表
2.它的特性和数组很接近,数组大小是不变的,而ArrayList的大小是可以动态改变的
LinkedList
1.是数据结构中链表的java实现
2.相对于List来说,LinkedList最主要的功能方面的增强是可以在List的头部和尾部添加、删除、取得元素,直接提供了这些方法的实现。


ArrayList、LinkedList、Vector的区别
List的三个子类的特点

ArrayList:

1.ArrayList是线性顺序存储的,是一种线性表
2、查询快,增删慢。
3、线程不安全,效率高。
4、它的特性和数组很接近,数组大小是不变的,而ArrayList的大小是可以动态改变的

Vector:

底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
Vector相对ArrayList查询慢(线程安全的)。
Vector相对LinkedList增删慢(数组结构)。

LinkedList

1、底层数据结构是链表
2、查询慢,增删快。
3、相对于List来说,LinkedList最主要的功能方面的增强是可以在List的头部和尾部添加、删除、取得元素,直接提供了这些方法的实现。
4、线程不安全,效率高。

List有三个子类使用

查询多用ArrayList。
增删多用LinkedList。
如果都多ArrayList。


Collection等等的 精炼的总结

Collection 是对象集合, Collection 有两个子接口 List 和 Set

List 可以通过下标 (1,2…) 来取得值,值可以重复。 Set 只能通过游标来取值,并且值是不能重复的。

ArrayList , Vector , LinkedList 是 List 的实现类

ArrayList 是线程不安全的, Vector 是线程安全的,这两个类底层都是由线性表实现的。
LinkedList 是线程不安全的,底层是由链表实现的。

Map 是键值对集合

HashTable 和 HashMap 是 Map 的实现类。
HashTable 是线程安全的,不能存储 null 值。
HashMap 不是线程安全的,可以存储 null 值。

Stack类:继承自Vector,实现一个后进先出的栈。提供了几个基本方法,push、pop、peak、empty、search等。

Queue接口:提供了几个基本方法,offer、poll、peek等。已知实现类有LinkedList(队列不允许插入null元素,但是LinkedList可以)、PriorityQueue等。

在这里插入图片描述


OOM和SOF

堆内存溢出 OutOfMemoryError(OOM)

除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的可能。

Java Heap 溢出。 一般的异常信息:java.lang.OutOfMemoryError:Java heap spacess。 java堆用于存储对象实例,我们只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象数量达到最大堆容量限制后产生内存溢出异常。

堆栈溢出 StackOverflow (SOF)

StackOverflowError 的定义: 当应用程序递归太深而发生堆栈溢出时,抛出该错误。 因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。

栈溢出的原因:

递归调用。 大量循环或死循环。 全局变量是否过多。 数组、List、map数据过大。


foreach与正常for循环效率对比
循环ArrayList时,普通for循环比foreach循环花费的时间要少一点。 循环LinkList时,普通for循环比foreach循环花费的时间要多很多。

ArrayList:ArrayList是采用数组的形式保存对象的,这种方式将对象放在连续的内存块中,所以插入和删除时比较麻烦,查询比较方便。对于类似数组结构的数据来说,采用下标访问比较好

LinkList:LinkList是将对象放在独立的空间中,而且每个空间中还保存下一个空间的索引,也就是数据结构中的链表结构,插入和删除比较方便,但是查找很麻烦,要从第一个开始遍历。


## java反射的作用于原理 **什么是Java的反射呢?**

Java 反射是可以让我们在运行时,通过一个类的Class对象来获取它获取类的方法、属性、父类、接口等类的内部信息的机制。

这种动态获取信息以及动态调用对象的方法的功能称为JAVA的反射。

反射的作用?

反射就是:在任意一个方法里:

1.如果我知道一个类的名称/或者它的一个实例对象, 我就能把这个类的所有方法和变量的信息找出来(方法名,变量名,方法,修饰符,类型,方法参数等等所有信息)

2.如果我还明确知道这个类里某个变量的名称,我还能得到这个变量当前的值。

3.当然,如果我明确知道这个类里的某个方法名+参数个数类型,我还能通过传递参数来运行那个类里的那个方法。

反射机制主要提供了以下功能:

在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
生成动态代理。
反射的原理?

JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。

反射的实现API有哪些?

反射的实现主要借助以下四个类:

Class:类的对象
Constructor:类的构造方法
Field:类中的属性对象
Method:类中的方法对象

TreeMap、HashMap、LindedHashMap的区别
LinkedHashMap可以保证HashMap集合有序,存入的顺序和取出的顺序一致。

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。

HashMap不保证顺序,即为无序的,具有很快的访问速度。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null。 HashMap不支持线程的同步。

我们在开发的过程中使用HashMap比较多,在Map中在Map 中插入、删除和定位元素,HashMap 是最好的选择。

但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列。


Object有哪些公用方法

equals 在Object中与==是一样的,子类一般需要重写该方法。

hashCode 该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。

getClass final方法,获得运行时类型

toString 转换成字符串,一般子类都有重写,否则打印句柄。


设计模式的六大原则

开闭原则:实现热插拔,提高扩展性。
里氏代换原则:实现抽象的规范,实现子父类互相替换;
依赖倒转原则:针对接口编程,实现开闭原则的基础;
接口隔离原则:降低耦合度,接口单独设计,互相隔离;
迪米特法则,又称不知道原则:功能模块尽量独立;
合成复用原则:尽量使用聚合,组合,而不是继承;


1、开闭原则(Open Close Principle)

开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

2、里氏代换原则(Liskov Substitution Principle)

里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

3、依赖倒转原则(Dependence Inversion Principle)

这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。

5、迪米特法则,又称最少知道原则(Demeter Principle)

最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则(Composite Reuse Principle)

合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。


JNI的使用

JNI是 Java Native Interface 的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。


AOP是什么
AOP(Aspect Oriented Programming) 面向切面编程,是目前软件开发中的一个热点,是Spring框架内容,利用AOP可以对业务逻辑的各个部分隔离,从而使的业务逻辑各部分的耦合性降低,提高程序的可重用性,提高开发效率。主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等。

OOP是什么
OOP面向对象编程,针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分

举例:

对于“雇员”这样一个业务实体进行封装,自然是OOP的任务,我们可以建立一个“Employee”类,并将“雇员”相关的属性和行为封装其中。而用AOP 设计思想对“雇员”进行封装则无从谈起。

同样,对于“权限检查”这一动作片段进行划分,则是AOP的目标领域。

OOP面向名次领域,AOP面向动词领域。

总之AOP可以通过预编译方式和运行期动态代理实现在不修改源码的情况下,给程序动态添加功能的一项技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值