知识点总结

1. instanceof()

  • instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例

2.InputStream&OutputStream

  • 一般用(System.in)创建InputStream对象,表示从标准输入中获取数据,用**(System.ou**t)创建OutputStream对象,表示输出到标准输出设备中。
  • 标准输出指输出到屏幕上,即System.out.println()

3.子类方法同步

  • 如果父类中的某个方法使用了 synchronized关键字,而子类中也覆盖了这个方法,默认情况下子类中的这个方法并不是同步的,必须显示的在子类的这个方法中加上 synchronized关键字才可同步。
  • 容器保存的是对象的引用

4.接口中默认权限

  • 接口的方法都是 public abstract (默认不写)
  • 变量都是public static final的 (默认不写)
  • 方法只能通过接口调用,不能通过实现类调用
  • jdk1.8以后,抽象类的方法默认访问权限变为default

5.以下哪个区域不属于新生代?

  • java堆中数据被分为两个不同的区域:新生代和老年代
  • 知识点总结_第1张图片

6.byte类型相加

  • 计算机中默认整数数据类型为int型,默认浮点数为doule型。java中,在进行byte数据类型运算时是将它提升为int类型后,再进行计算的,如果没有强制类型转换,它的结果就为int类型了。所以两个byte类型相加等于int是不会报错的,而两个byte相加等于byte,编译就会报错,提示可能造成精度缺失。
    知识点总结_第2张图片

7.类之间的关系

  • HAS-A:聚合关系,拥有关系,是关联关系的一种特例,是整体和部分的关系。比如鸟群和鸟的关系是聚合关系,鸟群中每个部分都是鸟
  • USES-A:依赖关系,A类会用到B类,这种关系具有偶然性,临时性。但B类的变化会影响A类。这种在代码中的体现为:A类方法中的参数包含了B类。
  • IS-A:表示继承。父类与子类
  • LIKE-A:组合关系,接口和实现类

9.java.lang包中String/Integer/Float等这些引用类都不能被继承,是最终类,被final修饰。

10.访问控制权限表

知识点总结_第3张图片

11.Java网络程序设计中,下列正确的描述是:

  • Java网络编程API建立在Socket基础之上
  • Java网络接口支持IP以上的所有高层协议

12.关于运行时常量池,下列说法是正确的:

  • 运行时常量池在方法区中
  • 存放了编译时期生成的各种字面量和符号引用

13.下列哪些操作会使线程释放锁资源

  • object::wait()
  • thread::join()
  • 注意:所谓的释放锁资源实际是通知对象内置的monitor对象进行释放。又因为所有类都继承自Object,所以wait()就成了Object方法,也就是通过wait()来通知对象内置的monitor对象释放,而且事实上因为这涉及对硬件底层的操作,所以wait()方法是native方法,底层是用C写的。其他都是Thread所有,所以其他3个是没有资格释放资源的。而join()有资格释放资源其实是通过调用wait()来实现的。

14.HashTable&&HashMap&&ConcurrentHashMap

  • HashMap允许键和值都为null,但只允许一个键为null,可以有多个值为null,不可以存入重复数据,(通过hashcode()和equals())判断。hashtable不允许键值为null,否则会报空指针异常
  • hashmap线程不安全,hashtable和concurrenthashmap线程安全。hashtable整个表加了synchronized锁,当有线程访问时会锁住整张表,效率低下。

14.1.concurrenthashmap底层原理

  • ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成,一个ConcurrentHashMap里包含一个Segment数组,Segment的结构和HashMap类似,是一种数组和链表结构, 一个Segment里包含一个HashEntry数组,每个HashEntry是一个链表结构的元素, 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时,必须首先获得它对应的Segment锁

知识点总结_第4张图片

  • jdk1.7与jdk1.8的区别
  • .数据结构:取消了Segment分段锁的数据结构,取而代之的是数组+链表+红黑树的结构。
  • 保证线程安全机制:JDK1.7采用segment的分段锁机制实现线程安全,其中segment继承自ReentrantLock。JDK1.8采用CAS+Synchronized保证线程安全。
  • .锁的粒度:原来是对需要进行数据操作的Segment加锁,现调整为对每个数组元素加锁(Node)
  • jdk1.8 ConcurrentHashMap 中 synchronized 只锁定当前链表或红黑二叉树的首节点,只要节点 hash 不冲突,就不会产生并发,相比 JDK1.7 的 ConcurrentHashMap 效率又提升了 N 倍!

15.HttpServletResponse

  • HttpServletResponse功能:
    设置http头标
    设置cookie
    设置返回数据类型,输出返回数据

  • HttpServletRequest
    读取路径信息
    知识点总结_第5张图片

16.static可以用来修饰内部类,但是不可以用来修饰外部类

  • 内部类可以是静态static的,也可用public,default,protected和private修饰
  • 外部类的修饰符只能是public,abstract,final

17.内部类

知识点总结_第6张图片

18.抽象类&接口

  • 抽象类和接口都不可以实例化
  • final类不能被继承,abstract类就是被用来继承的;所有两者不能同时修饰一个类
  • 抽象类中可以没有抽象方法,有抽象方法的类一定是抽象类
  • 抽象方法必须被重写,所以不可以用abstract修饰

19.在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为:

  • this.A(x)—调用普通方法的格式
  • this(x)—调用构造方法
  • super(x)—调用父类构造方法
  • A(x)—调用静态方法

20.true&false&null都不是关键字

21.默认的整数数据类型是int,默认的浮点数据类型是double

22.原码&反码&补码

  • 在计算机系统中,数据一律用补码来存储
  • 正数原码=反码=补码
  • 1开头为负数,负数反码=原码符号位不变,其他位取反;补码=反码+1;

23.垃圾回收

  • 当程序开始运行时,至少有两个线程开启,一个是主线程,一个是垃圾回收线程,它的优先级较低
  • 垃圾回收机制只能回收jvm不再使用的内存,如果出现了bug,内存照样会溢出
  • 进入DEAD的线程,它还可以恢复,GC不会回收

23.JAVA的初始化顺序

  • 父类的静态成员初始化>父类的静态代码块>子类的静态成员初始化>子类的静态代码块>父类的代码块>父类的构造方法>子类的代码块>子类的构造方法

24.JAVA调试器

  • javac.exe是编译.java文件
  • java.exe是执行编译好的.class文件
  • javadoc.exe是生成Java说明文档
  • jdb.exe是Java调试器
  • javaprof.exe是剖析工具

25.类中的成员变量,在堆区。方法区中的局部变量,在栈区

26.hashmap&linkedhashmap

  • LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的
  • map.replace()可以更改对应键的值
  • Hashmap 具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null

27list&set

  • ArrayList:
    数组实现的底层架构,先进后出原则,有序存储,因为元素都有索引,队尾添加元素快,查询以及替换元素效率高,线程不安全。
  • LinkedList:
    双向链表作为底层架构,先进先出原则,有序存储,因为是通过地址来定位到元素位置,增加元素和插入元素效率高,线程不安全。
  • HashSet:
    底层使用HashCode映射地址储存,无序储存,元素不重复,添加效率高,判断依据是HashCode和equals,先判断HashCode,若是相同再判断equals。
  • TreeSet:
    底层基于TreeMap,可以实现自然排序和去重
  • LinkedHashSet:
    对HashSet的优化,使用链式存储,有序排列。
  • TreeMap:
    底层使用红黑二叉树存储键值对,遇到相同键则覆盖值,也有自然排序和定制排序,常用于网站导航。线程不安全
  • HashMap:
    底层使用HashCode映射存入键值对,可以把null作为key或者value的,线程不安全,访问速度快,线程不同步,用于对排序无要求的集合,无序存入。
  • LinkedHashMap:
    是对HashMap的优化,内部使用双向链表实现,有序存储,存在键值对,直接操作链表地址寻找元素,效率高。
  • HashTable:
    父类是Dictionary,键值对不能是Null,线程同步,线程安全的,效率较低。

28.obj.wait()

void waitForSignal() {
   
        Object obj = new Object();
        synchronized (obj) {
   
            try {
   
                obj.wait();
            } catch (InterruptedException e) {
   
                e.printStackTrace();
            }
            obj.notify();
        }

    }
  • wait()方法必须要用异常捕获
  • 记住调用wait或者notify方法必须采用当前锁调用,即必须采用synchronized中的对象

29.java基本类型的默认值

知识点总结_第7张图片

30.length&length()&size()

  • length是数组的属性,不是方法
  • length()是字符串String的一个方法;
  • size()方法,是List集合的一个方法,包括list,set,map都有size()方法;

31.转发和重定向

  • 转发forwward:
    地址栏不发生变化,显示的是上一个请求的地址
    只有一次请求
    请求域中数据不会丢失
  • 重定向redirect
    地址栏发生改变,显示新的地址
    有两次请求
    请求域中数据丢失,因为是两次请求

32.构造函数

  • 构造函数没有返回值,也不能用void修饰,否则变为普通方法
  • 类中没有显示构造函数的话,编译器会添加默认无参构造函数

33.Thread.run()&Thread.start()

  • 调用run()方法是立刻执行run,此时程序是顺序执行,达不到多线程的目的
  • 调用start()方法是预备执行,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;

34.equals&hascode

知识点总结_第8张图片

35.volatile和synchronized

  • synchronized保证三大性,原子性,有序性,可见性,volatile保证有序性,可见性,不能保证原子性
  • volatile和synchronized的区别
    使用时的区别
    volatile关键字只能用来修饰实例变量或者类变量
    synchronized关键字只能用于修饰方法和语句块
    对原子性的保证
    volatile无法保证原子性
    synchronizde能够保证。因为无法被中途打断。
    对可见性的保证
    都可以实现共享资源的可见性,但是实现的机制不同,volatile使用jvm插入一条lock指令锁住缓存,再通过缓存一致性协议保证的,每次访问数据必须从主内存继续加载
    对有序性的保证
    volatile关键字禁止JVM编译器已及处理器对其进行重排序,插入内存屏障,能够保证有序性。
    synchronized保证顺序性是串行化的结果,但同步块里的语句是会发生指令从排
    其他
    volatile不会使线程陷入阻塞
    synchronized会会使线程进入阻塞。

36.JVM五大内存结构

知识点总结_第9张图片

37.try-catch-finally

  • try的形式有以下三种
    try-catch
    try-finally
    try-catch-finally
    catch可以省略,但是catch和finally不可以同时省略

38.JAVA包

  • java.lang包是java语言包,是自动导入的。
    java.util包是java的工具包,需要手动导入。
    java.sql包,JDBC接口类,需要手动导入。
    java.io;各种输入输入流,需要手动导入。

39.ASCII码表

知识点总结_第10张图片

‘0’=48 ‘A’=65 ‘a’=97

40.构造函数只能被调用,不能被继承

41.Arrays.sort()底层实现原理:

  • 数组的长度大于286使用归并排序(merge sort)
  • 数组长度小于47则直接采用插入排序(insertion sort)
  • 基于两者中间使用快排

42.Collections.sort()

  • 排序的数据小于60:使用插入排序,插入排序是稳定的

  • 大于60的数据量会根据数据类型选择排序方式

    • 基本类型:使用快速排序
    • Object类型:使用归并排序。因为归并排序具有稳定性
  • 注意:不管是快速排序还是归并排序。在二分的时候小于60的数据量依旧会使用插入排序

Arrays.sort()实现原理和Collections.sort()一样

43.hashmap扩容和负载因子

  • hashmap默认的容量为16,负载因子0.75,那么当超过12时就会发生扩容
  • 当遇到大数据时,频繁的扩容效率低下,可使用如下方法直接设置容量
    在这里插入图片描述

44.说出几种遇到过的异常

  • java.util.ConcurrentModificationException并发异常,使用线程不安全的集合时会发生,解决方法:见JUC编程
    • 如使用hashmap并发修改时会出现此异常。
    • 此处涉及到安全失败和快速失败相关
    • java.util.concurrent包下的容器都是安全失败,支持并发修改,在遍历时并不是直接在集合内容上访问,而是先复制原有集合内容,在拷贝的集合上进行遍历
  • StackOverflowError,如果线程请求的栈深度大于虚拟机所允许的最大深度,解决方法:检查代码是否深度递归或者有死循环
  • OutOfMemoryError–java heap space,检查是否有死循环创建线程等
    • 首先通过内存映像分析工具(JProfiler)确定是内存溢出(Memory Leak)还是内存泄漏(Memory Overflow)
    • 如果是内存泄漏,可通过工具进一步查看泄漏对象到GC roots的引用链,找到泄漏对象是与哪些GC Roots关联才导致垃圾回收器无法将他们回收,从而定位内存代码泄漏的位置
    • 如果是内存溢出,也就是内存中的对象必须存活,那么就应该检查java虚拟机的设置,与机器的内存相比,看看是否还有上升的空间

Error通常是仅靠程序本身无法恢复的严重错误,例如:JVM内存不足或是方法调用过程中栈溢出 (java.lang.StackOverflowError栈溢出)、 (OutOfMemoryError堆溢出)

  • IllegalAccessException。是因为自己在用暴力反射获取字节码对象的时候没有去除权限,也就是setAccessible(true)

45.ping相关

  • ping使用的是 ICMP 协议,是 TCP/IP协议族 的一个子协议,用于在IP主机、 路由器 之间传递控制消息。

46.动态sql的写法

  • mybatisplus可以自动生成sql语句
  • 我们也可以自己写sql语句,格式如下
public interface ContentCategoryMapper extends Mapper<ContentCategory> {
   
    @Select(

你可能感兴趣的:(JAVA,java)