精华内容
下载资源
问答
  • JAVA核心知识点整理

    2021-01-22 09:10:29
    JAVA核心知识点整理
  • java核心知识点整理

    2019-02-23 15:26:55
    java核心知识点整理 1.Java中没有多继承,而是用接口来代替多继承 2.运行一个已经编译的程序时,Java解释器总是从指定类的main方法中的代码开始执行,因此,执行代码中必须有一个main函数。 3.Java是典型的强类型...
  • JAVA核心知识点整理
  • Java核心知识点整理

    2021-01-12 13:29:27
    1、当一个新的任务提交到线程池后,首先判断核心线程中是否有空闲者,如果有的话,直接令该空闲线程执行任务,如果核心线程皆忙,则执行第二步 2、线程池将会判断阻塞线程(BlockingQueue workQueue)(相关的有...

    1、ThreadPoolExecutor的工作流程

    1、当一个新的任务提交到线程池后,首先判断核心线程中是否有空闲者,如果有的话,直接令该空闲线程执行任务,如果核心线程皆忙,则执行第二步
    在这里插入图片描述

    在这里插入图片描述
    2、线程池将会判断阻塞线程(BlockingQueue workQueue)(相关的有LinkedBlockingQueue:无界队列;SynchronousQueue:capacity为0)是否已满,如果已满的话则会导致入队失败,并进入第三步
    在这里插入图片描述
    在这里插入图片描述
    3、线程池将会尝试创建一个非核心(core)线程来处理该任务,如果判断线程池中维护的线程数已达到最大线程池中线程数量(maximumPoolSize),则会导致创建失败,进入最后一步
    在这里插入图片描述
    在这里插入图片描述
    4、此时线程池将会触发任务拒绝机制,根据相应的饱和策略来对任务进行处理
    AbortPolicy:抛出异常
    DiscardPolicy:直接丢弃任务,不做任何处理
    CallerRunsPolicy:由调用线程池的线程自己执行该任务
    DiscardOldestPolicy:丢弃掉阻塞队列中的最靠前的一个任务,并将当前任务(指的进入饱和策略的这个任务)重新提交到线程池的execute方法中。

    2、B+tree与B-tree两种数据结构的区别

    B树:在B树中非叶子节点的关键字数 = (子结点分支数 - 1) , 这是因为在B树中,非叶子节点不只存储子结点的指针,同时也存储实际的数据(即指向具体数据如磁盘数据的指针),因此其每个具体数据关键字两侧需要有存储小于与大于当前关键字具体数据的数据块结点指针的关键字。

    B+树:B+树中,非叶子节点中的关键字只用于保存子结点分支的指针,而不用于存储具体的数据,因此对于B+树其关键字数 = (子节点分支数)。B+树的具体数据,即保存用于引向具体磁盘数据的结点都是叶子节点,且各叶子结点之间根据其自然顺序组成双向链表,每个叶子节点都存储其自然顺序中下一个以及上一个结点的指针。

    两者作为数据库索引的对比
    (1)IO损耗 :对于B树来说,由于每个结点中也需要存储磁盘指针,因此在每次的查询中,系统都需要进行额外的IO操作来获取某结点相应的具体磁盘数据以进行数据比较;
    (2)空间利用 : B+树由于不需要像B树一样存储磁盘指针,因此每个结点中可以存储的查找关键字就会更多,这样就使得每次的查找更加精确,从而用更少的层数(即查找次数)来完成一次查询。
    (3)范围查询 : 对于B树来说,如果要完成一次范围查询,必须不断进行查找树遍历,从而获取出一个范围中的数据。而B+树由于叶子节点之间相互连接形成顺序的双向链表,因此在查找到某一个边缘值的结点后很容易进行相应范围结点的查询。

    3、 Class.forName()与ClassLoader.loadClass()加载类的区别

    对于ClassLoader.loadClass方法而言,其作用就是将类加载到内存中,但并不对其进行类加载的初始化工作,而类加载的整个过程如下图中所示:
    在这里插入图片描述
    类加载的初始化阶段,所进行的工作就是执行一个被称为的方法,这个方法是Java编译器自动生成的,其内容为类中的所有变量的赋值工作和静态语句块(static{})。

    因此对于ClassLoader.loadClass这种直接使用类加载器来加载类的方法便不能够执行类中的变量赋值以及静态语句。

    而Class.forName方法其实际使用的是一个叫forName0的方法:
    在这里插入图片描述
    其第二个参数代表是否对所需要加载的类进行类初始化工作,对于只有类名的forName方法来说,此处则是必须为0,但是如果我们拥有该类的类加载器,则可以执行其一个带initialize参数的重载方法:
    在这里插入图片描述

    4、JVM相关的启动参数配置

    -XX:MaxTenuringThreshold=10
    最大任期阈值,这个参数主要用于控制堆内存中新生代区的对象,在经过多少次GC依然存活后,将会晋升至老年代区。该值为0代表Eden区对象在经过GC存活后将会直接进入老年代而不进入Survivor区。默认值为15。

    -XX:PretenureSizeThreshold=1000
    在这里插入图片描述

    Objects are now directly created in the older generation if the size of the young generation is small, and the size of objects are big. The option - XX:PretenureSizeThreshold= in the concurrent collector that can be enabled to indicate the threshold for direct creation in the older generation. This could effectively be used for creation of caches, lookup tables, etc. which are long lived and do not have to go through a promotion cycle of being created in the younger generation and then being copied to the older generation. Use this option with care, since it can degrade performance instead of improving it. The default value is 0 i.e., no objects are created directly in the older generation.

    这代表着在创建对象时,当其大小超过多少byte,将会越过Young代,直接分配到老年代。

    默认值为0

    其他

    引自Oracle官网------https://www.oracle.com/technical-resources/articles/javame/garbagecollection2.html


    Option Default value Max Value Description
    -XX:NewSize 2Mb < 100 GB Controls the initial size of young generation
    -XX:MaxNewSize < 100 GB Controls the maximum size of the young generation
    -XX:SurvivorRatio 8 on windows, and 64 on Solaris <100000 Controls the size of the eden and the survivor spaces
    -Xms 5 MB < 100 GB Initial heap size
    -Xmx 4 MB < 100 GB Maximum heap size
    -Xmn Size of young generation
    -XX:MaxTenuringThreshold 31 Maximum number of times object is aged. Set this to 0 to enable promoteall.
    -XX:PermSize 4 MB < 10 GB Initial size of permanent generation
    -XX:MaxPermSize 64 MB < 10 GB Maximum size of permanent generation
    -XX:NewRatio 2 for server, 8 for client on Solaris Ratio of young generation / old generation
    -XX:PretenureSizeThreshold 0 Objects size greater than this is directly allocated in the older generation
    -XX:+UseISM Use intimate shared memory (see section 16.2.6.1)
    -XX:+UseMPSS Use multiple page sizes (see section 16.2.6.1)
    -XX:+UseTLAB True on Solaris Use thread-local object allocation
    -XX:+AggressiveHeap Use for throughput applications with lots of CPUs and memory > 256MB. Turns on various flags, uses parallel
    scavenge collector for young generation, turns on Adaptive SizePolicy,
    increase sizes of TLAB and other data structures
    -XX:TargetSurvivorRatio 50 100 Desired percentage of survivor space used after a scavenge

    5、JDK8内存模型

    https://www.cnblogs.com/paddix/p/5309550.html

    6、ClassLoader加载类的双亲委托模式

    首先默认的三个类加载器为:

    1. Bootstrap ClassLoader : 用于加载JDK的核心类库
    2. Extension ClassLoader : 用于加载lib\ext目录下的文件
    3. App ClassLoader : 用于加载当前应用程序的类库

    一个类加载器在执行类加载工作时,将会调用loadClass方法:
    在这里插入图片描述
    该方法首先需要调用findLoadedClass来判断该类是否已经被加载,如果没有被加载的话,则开始执行加载过程。
    首先,需要判断自己的parent是否为null,如果为null则代表有除BootStrap外的父加载器

    此处的parent并非代表该ClassLoader类的父类,而是在创建该ClassLoader类时设置的,如果一个自定义类加载器没有设置的话,默认为AppClassLoader

    在这里插入图片描述
    该部分为一个递归加载的方式,每一级加载器都去委托给自己的父加载器去加载这个指定的类,最终传递到Bootstrap ClassLoader中。
    在这里插入图片描述
    如果最终父级加载器都无法加载这个类,那么就必须由该类加载器自己去进行加载,调用findClass方法来寻找这个类(通过文件,或网络流等)。

    此处findClass方法必须重写,默认方法会抛出异常

    7、五种IO模型

    (1)阻塞IO: 读写数据时,如果内核查看数据没有准备就绪,则线程会阻塞,并交出CPU的控制权,等待数据准备就绪。
    (2)非阻塞IO: 当读取数据时,立刻返回结果,如果数据没有准备好则返回"error",如果数据准备好了则立刻返回相应的数据
    (3)多路复用IO模型: 与客户端建立连接的一组socket会有一个线程去对他们进行不断地轮询,只有当某个socket发生读写事件时线程会调用IO操作。
    (4)信号驱动IO模型: 当用户线程发起IO操作时,将会给socket注册一个信号函数,线程将会继续运行,不发生阻塞,当判断到数据就绪时,操作系统会发送信号给用户线程,并回调相应的IO操作。
    (5)异步IO模型: asynchronous IO,用户线程发起read操作后,内核会立刻返回,之后不会发生阻塞,当数据准备好后,系统内核会发送信号给用户线程来使用该数据。

    8、String不可变的原因

    (1)首先对于Java中使用双引号进行直接描述的字符串是直接保存在字符串常量池里面的,当我们声明:

    String a = "A";
    

    这时系统会从字符串常量池中寻找值为“A”的字符串对象,如果找到的话则将其地址赋给引用变量a。这也就是说如果多处地方都引用了一个同样的字符串字面值,那么他们所引用的对象将会是同一个:

    String a = "A";
    String b = "A";
    //此处将会输出true
    System.out.println(a == b);
    

    这就导致,如果我们通过引用变量a修改了String对象"A"的值,那么对于引用变量b所引用到的String对象也会发生变化

    (2)对于String对象来说,其内部存储着自己的hashcode,在第一次调用hashcode()方法时被计算并缓存,值不可变,使得String类型的对象不需要频繁地进行hashcode的计算与修改。

    (3)对于网络连接或者是文件IO的URL一般都是字符串值,如果可以随意修改String的值,将会导致URL被修改

    链接

    高级面试题整理
    String详解
    synchronized详解
    mysql覆盖索引与回表以及聚集索引、普通索引的结构

    展开全文
  • JAVA核心知识点整理
  • Java 核心知识点整理

    2019-04-16 00:35:34
    就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。 但很多小伙伴却苦于没有合适的资料来回顾整个 ...

    听说你在面试

    又到了求职的金三银四的黄金月份,我相信有不少小伙伴已经摩拳擦掌的准备寻找下一份工作。

    就目前国内的面试模式来讲,在面试前积极的准备面试,复习整个 Java 知识体系将变得非常重要,可以很负责任的说一句,复习准备的是否充分,将直接影响你入职的成功率。

    但很多小伙伴却苦于没有合适的资料来回顾整个 Java 知识体系,或者有的小伙伴可能都不知道该从哪里开始复习。

    我偶然从一个网友群中发现了整理的这份资料,不论是从整个 Java 知识体系,还是从面试的角度来看,都是一份含技术量很高的资料。

    也不知道这位作者是谁,里面的内容也大多整理来自于互联网,但很明显的是这位作者为了整理这份资料用了很多心,在此表示感谢。

    注,后来联系上了作者是美团的一位大佬,再次表示感谢!

    我随后截了几张图,大家可以仔细查看左边的菜单栏,覆盖的知识面真的很广,而且质量都很不错。

    说实话,作为一名 Java 程序员,不论你需不需要面试都应该好好看下这份资料。我大概撸了一边,真的是堪称典范。

    那么如何获取这份资料呢?关注下方公众号回复:java,即可获取。

    另外关注后,回复:java ,获取超过10000+人领取的 Java 知识体系/面试必看资料。

    展开全文
  • 来源网络 JAVA核心知识点整理.pdf
  • JAVA核心知识点整理--》从Java基础-->Java数据结构-->框架-->Java中间件,缓存JAVA核心知识点整理--》从Java基础-->Java数据结构-->框架-->Java中间件,缓存JAVA核心知识点整理--》从Java基础--&...
  • JAVA核心知识点整理 java集合,jvm详解 ,java多线程,线程池高并发,java IO ,JAVA 阻塞队列原理
  • 强烈推荐JAVA核心知识点整理,特别详细,适合收藏学习,非常好,帮助你迅速掌握java,加油了大家,下载学习
  • Java核心知识点整理,精简版本,面试前突击学习使用。包含JVM、集合、并发、Spring、微服务、中间件、设计模式、算法、缓存等相关知识的整理。 、

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,123
精华内容 449
关键字:

java核心知识点整理

java 订阅