美文网首页
最详细的Java学习点知识脑图,从基础到进阶,看完还有啥你不懂的

最详细的Java学习点知识脑图,从基础到进阶,看完还有啥你不懂的

作者: Java_苏先生 | 来源:发表于2020-02-11 17:32 被阅读0次

    一、代码块加载顺序

    1. 静态代码块只会加载1次,在普通代码块前执行,会在类链接中的准备阶段执行

    2. 普通代码块每次new的时候都会加载,在构造方法前执行,其实是编译的时候,代码被放到构造函数前

    3. 构造函数每次new都会加载。构造函数默认前面是super0方法。默认会先调用父类的构造函数

    二、类加载器双亲委派

    1. 类的加载过程

    ①. 类的加载

    class文件加入内存,生成class对象

    ②. 类的链接

    • 验证:验证class文件是否满足JVM规范
    • 准备:静态类变量默认初始化
    • 解析:常虽池的符号引用替换为直接引用

    ③. 类的初始化

    类构造器(构造方法和静态代码块)初始化

    2. 类的加载器

    • bootStrapClassLoader:核心加载器
    • ExtersionClassLoader:扩展加载器
    • SystemClassLoader:系统加载器
    • ApplicationClassLoader:应用加载器
    • 自定义加载器

    3. 双亲委派

    • 保证加载的关是唯一的.只会有份所以向上由父类加载
    • 与Tomcat不满足双亲委派

    三、String

    1. Stringa= "adf"

    • adf存在于方法区的常量池,栈空间的a直接指向常量池的adf

    2. String b = new String(" adf")

    • adf存在于常量池,堆空间生成对象,对象实际存储指向常量池adf的地址,栈空间的b指向堆空间的地址

    3. Stringc= "adf" + "df";Stringd = "adfdf";Stringe= a +"df"

    • c和d栈都指向常量池的adfdf. e保存了堆中对象,对象指向的是常量池中的adfdf值
    • 直接常量操作,返回的地址是在常量池
    • 经过new或者不是纯常量操作,会进行一-次new在堆中生成对象, 对象在指向常量池中数据
    • final修饰的String也在常量池

    4. final修饰,不可以被继承(不可以被修改)

    • 出于安全考虑,java很多类都用字符串来描述
    • 处于内存考虑,字符串被常用,共享同一块内存,减少内存使用量

    5. 一般字符串的内部操作

    • 转成数组,toCharArray0
    • 数组操作变化值
    • String构造函数数组转为字符串

    6. length0方法

    • 返回字符串的实际长度,字符串没有size0方法

    四、Integer

    1. 直接赋值或者ValueOf田

    • 享元模式,池的技术
    • -128~127是常量,在堆中只会有一个对象

    2. new的话,是在堆中生成新对象

    3. BigInteger是整形,任意大小

    4. BigDecimal是浮点型,任意精度

    五、注解

    1. 元注解

    • 修饰注解
    • @Retention:注解的生命周期,Compile编译, class类对象, RunTimer运行时(此生命周期才可以用被反射拿到)
    • @Target:接口,类,方法,变量,构造器
    • @Inherited:注解具有继承性,随着类继承存在

    2. 可重复注解, 类型注解

    • Java8新特性

    六、集合

    1. 存储单值

    ①. 数组

    • []初始化后长度不可以更改
    • 插入删除效率不高
    • 查找速度快
    • 只有length成员变量表示长度,没有其他的可用API

    ②. collection

    A. set

    a. 实现

    treeset

    • 底层是treemap.数据是红黑树结构
    • 可以按属性进行排序,指定排序规则
    • 需要重写比较函数,被存数据继承comparable接口(数据是否相同按compareto决定)

    linkedhashSet

    • 按添加的顺序有序
    • 底层也是linkedhashmap,数据+链表
    • 在原有的hashset的基础上增加了添加元素的链接关系,使添加数据有序(对频繁的遍历要比hashset快)

    hashSet

    • 存储无序的
    • 底层是hashmap,也是数组+链表存的

    b. 无序不可重复

    c. linkedhashset和hashset的数据,一定要重写,并且要求hashcode方法和equals方法一致

    • hashcode决定了key存储位置
    • equals决定了key是否相等

    B. list

    a. 实现

    arrayList线程不安全

    • 数组
    • 适用增删改少,遍历多

    vector线程安全

    • 数组:stack继承于vector

    linkedList

    • 链表
    • 使用增删改多,遍历少

    b. 有序,可重复

    2. 存储对值(map)

    ①. hashMap线程不安全

    • 底层树数组+链表
    • java8后,数组+链表/红黑树,链表长度大于8的时候转红黑树
    • 复合的数据需要重写hashcode和equals方法
    • 多线程下死循环
      • 主要是rehash函数
      • 内部链表重写计算的时候,多线程下会出现环
      • 链表的环造成get数据的时候会出现死循环

    ②. linkedHashMap线程不安全

    • 底层是数组+链表/红黑树
    • 根据添加数据的顺序,有指针关联添加的数据,数据按添加顺序有序
    • 复合的数据需要重写hashcode和equals方法

    ③. concurrentHashMap分段锁线程安全

    • 复合的数据需要重写hashcode和equals方法
    • java1.7是数据的分段锁
    • java1.8是CAS实现的

    ④. hashTable线程安全

    • 方法用Synchronize修饰的
    • 不能有null的key和值
    • 复合的数据需要重写hashcode和equals方法
    • 子类: Properties 取配置文件的数据

    ⑤. treeMap有序的

    • 底层是红黑树结构
    • 存储的数据需要实现Comparable接口

    ⑥. key是无序的,不可以重复,使用set存储所有的key; Entry是无序, 可重复

    ⑦. 扩容

    • 容量的0.75的时候,会扩容,扩为原来的两倍,将数据拷贝到新的空间
    • Jdk7. Jdk8默认初始数组大小是16
    • Jdk8当链表长度超过8,就改用红黑树存储
    • Jdk8底层是Node[]数组,Jdk是Entry[数组
    • 最大容量2的30次方

    3. collections

    集合相关的静态方法集

    4. 排序

    • 自然排序:实现comparable重写compareTo(Object o)方法(随处可用的比较)
    • 定制排序:实现comparator重写compare(Object o1,Object o2)方法(临时性的比较)

    5. sizeQ方法

    返回的是元素的个数,集合是没有length方法的

    6. 数组和集合的相互转换

    • toArray0集合变数组
    • Arrays.asList ()数组变集合(注意,存的数据要是对象)

    7. 集合遍历方式

    • for循环
    • iteraton迭代器
    • foreach方式
    • java8新特性,streem流

    8. 通配符?

    List<?>

    • 可以写入null,不能写入数据
    • 可以读数据
    • List<? super A>; List<? extends A>有限制条件的通配符

    七、反射

    1. 动态语言的特性,拿到运行时对象的状态类信息,class对象, 增加了代码的灵活性

    2. 缺点:执行效率低,性能差

    3. 功能

    ①. 拿到运行时对象的类信息

    ②. 根据运行时对象信息创建对象

    ③. 根据运行时对象信息使用其方法

    ④. 根据运行时对象信息修改成员,修改私有成员

    ⑤. 动态代理

    • 创建一个实现接DInvocationHandler的类,它必须实现invoke方法
    • 创建需要被代理接口和实现类
    • 通过Pry)的I态nnewporvatalasloaderlader Cass iterfaces. InocationHander h)创建个代理
    • 通过代理调用方法
    • 生成的动态代理关会调用nvocationHandler实现类中的invoke方法
    • invoke方法中我们可以选择执行被代理实现类的方法,并在其前后进行处理

    4. 拿到class对象

    • 类名.class
    • 对象.getClass0
    • Class类的静态方法forName0
    • ClassLoader对象的IoadClass0方法获取

    5. class对象的作用

    • Constructor拿到类的构造函数,实例化对象
    • Field拿到类的属性
    • Method拿到类的方法(Invoke调用方法)

    6. 提升反射使用的效率

    • 尽量不要getMethods0后再遍历筛选,而直接用getMethod(methodName)来根据方法名获取方法
    • forName获取类对象,使用缓存

    八、lambda表达式

    1. 实质:作为接口的实例

    2. 接口需要是函数式接口

    • 接口中只有一个抽象函数
    • 可以用注解声明接口,@FunctionInterface
    • util.function包下有大量的函数式接门

    九、= =和equals

    1. = =

    • 基本数据类型比较值
    • 引用类型比较地址

    2. equals

    • 比较的是引用类型
    • 重写过的quls比较的是地址obiec的原生方法批比较的是地址

    # 链接 Java程序员福利"常用资料分享"

    相关文章

      网友评论

          本文标题:最详细的Java学习点知识脑图,从基础到进阶,看完还有啥你不懂的

          本文链接:https://www.haomeiwen.com/subject/gugxfhtx.html