目前学习java发现有些知识点容易混淆,因此整理一下
1.break和continue的区别
break和continue都是用来控制循环结构的。
- break:提前终止循环可以使用break来完成。break完全结束一个循环,跳出循环体执行循环后面的语句。
- continue:理解为continue是跳过当次循环中剩下的语句,执行下一次循环。
- 区别:continue只终止本次循环,break则完全终止循环
2.多态的表现形式
1 多态的前提1:是继承
2 多态的前提2:要有方法的重写
3 父类引用指向子类对象,如:Animal a = new Cat();
4 多态中,编译看左边,运行看右边
3.类, 抽象类和接口的关系和区别
1 类与类的关系:继承关系,只支持单继承
2 类和接口的关系:实现关系.可以单实现,也可以多实现
3 接口与接口的关系:是继承关系,可以单继承,也可以多继承
4 抽象类与接口的区别:
①抽象类是一个特殊的类,特殊在,抽象类中可以包含没有方法体的方法(抽象方法)
②接口可以理解成一个特殊的抽象类,特殊在,接口里的都是抽象方法,没有普通方法
③接口会为方法自动拼接public abstract,还会为变量自动拼接public final static
④抽象类可以有构造方法–用来给子类创建对象,接口中没有构造方法
⑤抽象类和接口都不能实例化(创建对象)
⑥接口可继承接口,并可多继承接口,但类只能单继承
⑦抽象方法只能声明,不能实现,接口是设计的结果 ,抽象类是重构的结果
4.String类是否可以被继承
1 String是一个封装char[]数组的对象,字符串不可变
2 String类是被final关键字修饰的类,所以不能被继承。
5.String、StringBuilder、StringBuffer的区别
1 StringBuffer线程安全,StringBuilder线程不安全
2 在执行效率上,StringBuilder > StringBuffer > String
3 本质上都是在调用父类抽象类AbstractStringBuilder来干活,只不过Buffer把代码加了同步关键字,使得程序可以保证线程安全问题。
6.ArrayList与LinkedList的区别
1 ArrayList底层是数组结构,查询快,增删慢,适合查询较多的场景
2 LinkedList底层是链表结构,查询慢,增删快,适合增删操作较多的场景
3 注意:LinkedList查询慢是指数据量大时,查询中间要慢,首位操作还是比较快的
7.list,set,map的区别
1 Collection、Set、List和Map都是接口,不能被实例化。
2 Set和List都继承自Collection,而Map则和Collection没什么关系。
3 Set和List的区别在于Set不能重复,而List可以重复。
4 Map和Set与List的区别在于,Map是存取键值对,而另外两个则是保存一个元素。
8.线程的状态
1 新建-->就绪-->执行-->阻塞-->终止
2 阻塞可以分为三种: 其他阻塞、等待阻塞、对象锁阻塞
9.反射机制的优缺点
1 反射机制极大的提高了程序的灵活性和扩展性,降低模块的耦合性,提高自身的适应能力。
2 通过反射机制可以让程序创建和控制任何类的对象,无需提前硬编码目标类。
3 使用反射机制能够在运行时构造一个类的对象、判断一个类所具有的成员变量和方法、调用一个对象的方法。
4 反射机制是构建框架技术的基础所在,使用反射可以避免将代码写死在框架中。
5 java的反射机制就是增加程序的灵活性,避免将程序写死到代码里。
尽管反射机制带来了极大的灵活性及方便性,但反射也有缺点。反射机制的功能非常强大,但不能滥用。在能不使用反射完成时,尽量不要使用,原因有以下几点:
1、性能问题。
Java反射机制中包含了一些动态类型,所以Java虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。而且,如何使用反射决定了性能的高低。如果它作为程序中较少运行的部分,性能将不会成为一个问题。
2、安全限制。
使用反射通常需要程序的运行没有安全方面的限制。如果一个程序对安全性提出要求,则最好不要使用反射。
3、程序健壮性。
反射允许代码执行一些通常不被允许的操作,所以使用反射有可能会导致意想不到的后果。反射代码破坏了Java程序结构的抽象性,所以当程序运行的平台发生变化的时候,由于抽象的逻辑结构不能被识别,代码产生的效果与之前会产生差异。
10.IOC和DI的区别
1 IoC(控制反转)
就是指将对象的创建,对象的存储(map),对象的管理(依赖查找,依赖注入)交给了spring容器。
2 DI(依赖注入)
相对于IoC而言,依赖注入(DI)更加准确地描述了IoC的设计理念。所谓依赖注入,即组件之间的 依赖关系由容器在应用系统运行期来决定,也就是由容器动态地将某种依赖关系的目标对象实例注入到应用系统中的各个关联的组件之中。
11.spring的生命周期
1 实例化BeanFactoryPostProcessor实现类
2 执行BeanFactoryPostProcessor的postProcessBeanFactory方法
3 实例化BeanPostProcessor实现类
4 实例化InstantiationAwareBeanPostProcessBeforeInstantiantion方法
5 执行Bean的构造器
6 执行InstantiationAwareBeanPostProcessor的postProcessPropertyValues方法
7 为Bean注入属性
8 调用BeanNameAware的setBeanName方法
9 调用BeanFactoryAware的setBeanFactory方法
10 执行BeanPostProcessor的postProcessBeforeInitialization方法
11 调用InitializingBean的afterPropertiesSet方法
12 调用的init-method属性指定的初始化方法
13 执行BeanPostProcessor的postProcessAfterInitialization方法
14 执行InstantiationAwareBeanPostProcessor的postProcessAfterInitialization方法
15 容器初始化成功,执行正常调用后,下面销毁容器
16 调用DiposibleBean的destory方法
17 调用的destroy-method属性指定的初始化方法