面向对象
面向过程注重于流程步骤 洗衣服>---打开洗衣机>----放入衣服>----加洗衣液>-----放水
面向对象注重于单位元素负责那些事
人: 放衣服 倒洗衣液
洗衣机: 洗涤 烘干
面向对象特征:
封装 : 不需要关注方法内部的执行流程,直接调用,就例如集成mybatis 不用去关心mybatis如何去连接数据库的过程,只管调用操作数据的方法
四种修饰符
private 只作用于同一类
default 作用于同一包
protected 其他包子类
public 全局
继承:子类继承父类 拥有父类的方法和属性
方法重写 Override
重写父类的方法,方法名,入参,返回参数与父类相同
方法重载 Overload 方法名相同 参数个数,类型不通
多态:多态是同一个行为具有多个不同表现形式或形态的能力。
方法的重写和重载其实是多态的一种体现
JDK,JRE,JVM区别和联系
JDK java开发工具 包含 JRE JAVA工具
JRE java运行环境 包含JVM
JVM java虚拟机
.java文件>----javac编译>---.class文件>----jvm>----映射到windows/Linux操作系统
==和eques区别
== 基本数据类型比较的是值 引用数据类型 比较的是内存地址
eques 方法默认是才用==来比较的 具体还得看类中的重写方法 String类重写了eques主要是用来比较字符串中的各个字符是否完全相同
浅谈final
a.final的作用
最终的
修饰类 不可以被继承
修饰方法 不可以被覆盖 重写 可以重载
修饰变量 变量值不可以改变
1).修饰成员变量 需要直接赋值
final int i = 0
修饰静态变量 static 需要直接赋值或在静态代码块赋值
final static int a= 0
2).修饰基本类型变量 赋值之后就不能改了
修饰引用类型变量 不能再指向另一个对象 但是对象里的值可以修改
b.为什么局部内部类和匿名内部类只能访问局部final变量?
首先要知道内部类和外部类其实属于一个层级,内部类不会在外部类方法执行完之后进行销毁,
但是局部变量会在外部方法执行完成后进行销毁,为了房子内部类调用报错,程序会在执行过程中copy一个一样的变量放入内部类中,为了保证copy的变量和原始局部变量的值一致,所以进行妥协才用final修饰 保证变量不被修改,这也是为什么局部内部类,匿名内部类只能访问final变量的原因。
String,StringBuffer,StringBuilder区别和使用场景
String 是final修饰的 每修改一次就会产生一个新的对象,占内存
StringBuffer和StringBuilder是在原对象上修改的
StringBuffer线程安全的 是由Synchronized修饰的
StringBuilder线程不安全的
线程安全指的是多个线程公用一个变量,导致变量的值受到影响
性能 StringBuilder>StringBuffer>String
单线程 StringBuilder
多线程且共用同一变量用StringBuffer
重载和重写的区别
重载:同一类中方法名相同,参数不同,参数类型不同,参数个数不同,参数顺序同。不存在返回值不同,编译时会直接报错
重写:子类重写父类的方法,方法名,参数列表和父类相同,返回参数范围要下雨等于父类,访问修饰符要大于等于父类,private方法不能被重写
接口和抽象类的区别
抽象类 接口
关键字 abstract interface
成员变量 任何 默认public static final
成员方法 部分实现 没有实现
实现 只能继承一个 可以实现多个
接口 实际上是出于设计的目的,只约束行为的有无,不关心方法的具体实现。
抽象类实际上是先有子类然后为了解决代码复用问题,将公用方法抽取出来派生为抽象类,抽象类可以有自己的方法实现,子类也可以拓展自己的方法,因此抽象类是不能实例化的,因为有些方法没有具体的实现。
抽象类的本质是 对事物的属性进行抽象 is a
接口的本质是 对事物的行为进行抽象 like a
List 和 Set的区别
list 是按照对象进入顺序存储对象,可重复的,允许多个null,可以使用迭代器逐一遍历,也可以通过下标获取
set 是无序的,不可重复的,只能存在一个null,只能使用迭代器逐一遍历
hashCode与equals
hashCode实际是int类型的数字,哈希码,存储的是对象在哈希表中的索引的位置,key-value。作用是通过索引可以快速找到所对应的对象
在执行hashSet时,会先拿hashCode值去检索该位置有没有对象,如果没有,直接将对象保存在该位置,如果存在对象,会调用equals方法来校验存储的对象和该位置的对象是否一样,如果一样,视为重复加入,就不会再进行操作,如果不一痒,就会生成新的hashCode值,将对象存储下来,减少了调用equals次数,提升效率
ArrayList 和 LinkedList区别
ArrayList 底层是数组结构,存储为连续内存,有下标,查询速度快,方便。ArrayList扩容原理为:创建一个更大的数组,将原来的数据copy过去,中间节点插入数据时,后面的每个节点都会往后复制存储,因此插入 删除,效率会显得很慢。如果ArrayList才用尾插法,并指定合适的长度,减少扩容的次数,效率会比LinkedList快
LinkedList 是链式结构,存储为分散内存,再写入数据时直接在要写入的位置断链插入链接即可,因此插入删除效率会很快。 但是插入数据时会创建node对象,如果数据过多,时间都会浪费在 创建node对象上。LinkedList只能使用迭代器循环,如果使用for每次get(i)都会重新遍历 性能极差
HashMap和HashTabel区别 底层实现
HashMap 线程不安全的
HashTabel 线程安全的
底层结构 数组+链式结构
存储时对存储对象hashCode值进行二次hash对数组下标取模然后放在对应下标的数组中,如果不存在hash冲突直接放入,如果存在冲突,进行equals 如果相同取代该元素,不同,判断链表高度,如果小于8且数组长度小于64 插入链表,如果数组长度大于64 转为红黑树,如果长度小于6 再次转回 数组链表
扩容和arrayList一样 创建新数组 重新定义长度,数据复制
如何实现ioc容器
a.创建配置文件,配置需要扫描的包的路径
b.开启扫描判断是否是文件夹,是文件夹继续向下一层扫描,如果是文件判断是否是class文件,是class文件,判断是否有注解,如果有,通过反射生成对象,放入class数组中。如果是接口的实现类,找到接口 通过反射创建实例化对象放入数组中。
c.遍历class数组 检查是否有依赖注入标签确认依赖关系 将依赖入住
什么是字节码?采用字节码的好处
字节码:java程序之所以在各种平台运行是得益于jvm虚拟机。虚拟机提供了和操纵系统交互的接口。所以变成面向jvm即可,写好的java程序会用过javac编译成.class文件来供jvm理解,这种jvm理解的编码即为字节码。 java是编译金额解释共存的语言
采用字节码的好处:提升了执行效率,跨平台,可以在不同计算机操作系统上运行。
java类加载器
类加载器分为:虚拟机自带的加载器 和用户自定义加载器
虚拟机自带的加载器分为:
启动加载器, 加载/lib下的jar class
扩展加载器, 加载/lib/ext 下的jar class
应用程序加载器 加载我们的程序代码
双亲委派机制
类加载器加载过程中先回委托自己的父级去加载文件,父级如果加载成功,直接返回,如果未成功,才会自己去加载,向上委托 查缓存,向下查找加载路径 双亲委派+沙箱机制(防止恶意代码对java的破坏)