Java核心技术卷知识点总结

  • 基本数据类型

    • byte(1字节,8位)
    • short(2字节,16位)
    • int(4 字节 32位)
    • long(8字节 , 64位)
    • float(4字节 32位)
    • double(8字节 , 64位)
    • char(2字节 16位)
    • boolean(4字节或1字节)
  • 面向对象的特点

    • 面向对象的三大特点:继承、封装、多态
    • 面向对象就是将一个模块或者是一个完整需求按照某些特点或者功能进行拆分,将具有共有特性的封装到一起,可以独立进行操作的这种低耦合、易扩展维护的思想
  • 多态,简述多态

    • 多态简单来说就是 子类的对象可以赋给超类的变量
   // 前提是Student是Person的子类 ,也就是说多态是发生在继承之上的
   Person per = new Student();
  • 封装的优点

    • 耦合度降低
    • 便于维护数据(可以快速的定位那块出了问题)
    • 提高数据安全性(对外不可见)
  • 反射,应用反射

    • 反射就是具有分析类能力的一段程序,反射最终的目的就是获取类信息,拿到类的实例;
    • 三种获取类的方式:
      • 类名.class;
      • 对象.getClass();
      • Class.forName(“com.abc.Student”);
    • 通过newlnstance获取类的实例:Student.class.newInstance();
    • 应用
      • spring ioc、spring aop
      • 反射获取实例的性能是非常低的(new很快),毫秒级的消耗。但是有一些情况我们是无法通过new来创建实例的,比如我们在使用spring的时候一开始是不知道我们定义什么类的,无法new,只能获取类的路径,通过反射来生成实例,然后通过代理调用具体的方法。
  • 代理,应用

    • 分为静态代理和动态代理
    • 动态代理就是我们在获取类的实例之后,我们通过分析请求中的路径信息拿到方法名和参数,代理帮我们执行该方法的过程,我们只需要传递方法名和参数,就能自动帮我们执行该方法
    • 应用:
      • spring aop、日志管理、mybatis在启动的时候通过cglib字节码注入帮我们生成接口的实现类以及方法,通过invoke()方法调用执行
  • 理解方法调用

    • 比如说调用student.getInfo(Object obj)方法,编译器会首先帮我们找到方法名都是getInfo方法(如果有继承的话,也会将父类的同一方法名加载,注意不是private),并形成一个方法表。然后根据传递的参数去匹配最合适(因为会发生类型转换)的那一个方法(如果子类没有,就会去父类中寻找,这是动态绑定);如果方法有特定修饰符(private、static、final),那么编辑器就会很快知道调用那些方法(静态绑定)
  • Java是按引用传递的吗

    • java里面的传递都是值传递,因为声明一个对象或者一个变量都是在栈中实现的,用完之后会出栈,并没有改变原来的变量或者对象的指向
  • LinkList 和ArraysList的区别

    • ArrayList是实现了基于动态数组的数据结构(自动扩容),LinkedList基于链表的数据结构。
    • 对于随机访问get和set,ArrayList优于LinkedList,因为ArrayList可以随机定位,而LinkedList要移动指向一步一步的移动到节点处。对于增删操作 LinkedList 比 ArrayList 的效率更高
    • ArrayList 、 LinkedList 线程都不安全
  • HashMap的put操作 map.put(“age”,20);

    • 以map为例,我再存储这个信息的时候,我先通过hash函数计算一下key的hashCode值(就是计算 age 的hashCode值),然后将hashCode对数组长度取余操作(或者是其他具体操作)确定数组索引下标,判断数组有没有值,没有值直接放入,如果有值的话,就很根据hashCode值在此链表中一一比较(equals比较),如果hashcode值相同,也就是equals返回true,那么我们就将这个值进行替换,如果没有找到,我们就插到链表中。(拉链法,这个过程就是散列,引入散列的原因 就是避免出现数据倾斜的情况)
  • HashMap的扩容操作(在java 1.7 、 1.8的区别)

    • 重新哈希(链表的长度是有限制的,在没有达到临界点的时候,存储的时间复杂度为O(1);但当达到临界点的时候,他要进行重新哈希,这时候存储的时间复杂度变为O(n)。)
    • 在1.8之前,在存储数据的时候我们规定了链表的长度不能超过多少,如果超过了这个值的话,增加数组的长度,重新进行哈希(rehash),如果要是这样的话,会大大增加时间复杂度(为O(n)),所以这样是不合适,因此1.8引入了 红黑树 的结构。那为什么不引用AVL树呢,关键在于红黑树的局部平衡,而其他的二叉树可能会退化为链表,所以说也是不合适的。
      根据散列函数我们将数据依次放入到哈希表中,在java中规定当某一链表的字节数大于8并且数组长度大于等于64的时候,我们便采用红黑树进行存储,时间复杂度为O(logN),这样大大减少了查找时间。

猜你喜欢

转载自blog.csdn.net/qq_44922113/article/details/113923772