01 2021 档案
摘要:多任务,这是操作系统的一种能力,看起来可以在同一时刻运行多个程序。 并发执行的进程数目并不受限于CPU数目。 操作系统会为每个进程分配CPU时间片,给人并行处理的感觉。 多线程程序在更低一层扩展了多任务的概念:单个程序看起来在同时完成多个任务。 每个任务在一个线程中执行,线程是控制线程的简称。 如果
阅读全文
摘要:JDK的bin目录下有一些用于监视虚拟机运行状态和进行故障处理的工具, 可以分为三类: 商业授权工具 主要是JMC以及它使用到的JFR 正式支持工具 这类工具属于被长期支持的工具,不同平台、不同版本的JDK之间,这类工具会有差异,但是不会出现某个工具突然消失的情况。 实验性工具 这类工具没有技术支持
阅读全文
摘要:直接内存并不是虚拟机运行时数据区的一部分,也不是规范中定义的内存区域 但是这部分内存也被频繁使用,而且也可能导致OutOfMemoryError 在JDK1.4中新添加了NIO类,引入了一种基于通道与缓冲区的I/O方式, 它可以使用Native函数库直接分配堆外内存, 然后通过一个存储在Java堆里
阅读全文
摘要:运行时常量池是方法区的一部分。 Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表, 用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。 Java虚拟机对于Class文件每一部分(包括常量池)的格式都有严格规定,如每一个字
阅读全文
摘要:方法区与Java堆一样,是各个线程共享的内存区域, 用于存储已经被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。 虽然《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但是它有个别名“非堆”(Non-Heap),用于和Java堆区分开来。 在JDK 8之前,许多Jav
阅读全文
摘要:Java堆是虚拟机所管理的内存中最大的一块。 Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。 此内存区域的唯一目的就是存放对象实例,Java中几乎所有的对象实例都在这里分配内存。 随着Java的发展,即时编译技术的进步,Java对象实例分配在堆上慢慢变得不是那么绝对。 Java堆是垃
阅读全文
摘要:Java虚拟机栈是线程私有的,它的生命周期与线程相同。 虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧用于存储局部变量表、操作数栈、动态连接、方法出口等信息。 每一个方法被调用直至执行完毕的过程, 就对应着一个栈帧在虚拟机中从入栈到出栈的过程
阅读全文
摘要:程序计数器是一块较小的内存空间,可以看作是当前线程执行的字节码的行号指示器。 在Java虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。 分支,循环,跳转,异常处理等基础功能都需要依赖这个计数器来完成。 因为Java虚拟机的多线程是轮流切换、分配处理
阅读全文
摘要:虚拟机没有泛型类型对象(所有对象都属于普通类) 类型擦除 无论何时定义一个泛型代码,都会自动提供一个相应的原始类型。 这个原始类型的名字就是去掉类型参数之后的泛型类型名。 类型变量会被擦除,并替换为其限定类型(或者,对于无限定的变量则替换为Object)。 例如,Pair的原始类型如下所示: //
阅读全文
摘要:按值调用表示方法接收的是调用者提供的值。 按引用调用表示方法接收的是调用者提供的变量地址。 方法可以修改按引用传递的变量的值,但是不能修改按值传递的变量的值。 Java总是按值调用。 也就是说,方法得到的是所有参数值的一个副本。意思就是,方法不能修改传递给它的任何参数变量的内容。 有两种类型的方法参
阅读全文
摘要:有时候,使用内部类只是为了把一个类隐藏在另一个类的内部,并不需要内部类有外围类对象的一个引用。为此,可以将内部类声明为static,这样就不会产生那个引用。 只有内部类可以声明为static。 静态内部类类似其他内部类,只是静态内部类的对象没有生成它的外围类对象的引用。 如果内部类对象是在静态方法中
阅读全文
摘要:可以将实例字段定义为final,这样的字段必须在构造对象时初始化。 也就是说,必须确保在每个构造器执行之后,这个字段的值已经设置,并且以后不能再修改这个字段。 例如,可以将Employee类中的name字段声明为final,因为在对象构造之后,这个值不会改变,所以name没有set方法 class
阅读全文
摘要:泛型类和泛型方法有参数类型,这使得它们可以准确地描述用特定实例化时会发生什么。 在有泛型类之前,程序员必须使用Object编写适用于多种类型的代码。这烦琐且不安全。 泛型程序设计意味着编写的代码可以对多种不同类型的对象重用。 在Java 5中增加泛型类之前,泛型程序设计是用继承实现的。 如果用一个明
阅读全文
摘要:由于严格的泛型类型使用不方便,所以Java的设计者发明了一种巧妙但很安全的“解决方案”:通配符类型 通配符概念 在通配符类型中,允许类型参数发生变化。例如通配符类型Pair<? extends Employee> 表示任何泛型Pair类型,它的类型参数是Employee的子类,如Pair<Manag
阅读全文
摘要:Date类的实例有一个状态,即特定的时间点 时间是用距离一个固定时间点的毫秒数(可正可负)表示的,这个时间点就是纪元,它是UTC时间1970年1月1日00:00:00。 UTC就是Coordinated Universal Time(国际协调时间),和GMT(Greenwich Mean Time,
阅读全文
摘要:Java有一种功能很强的循环结构,可以用来依次处理数组(或者其他元素集合)中的每个元素,而不必考虑指定下标值。 语句格式为:for (variable : collection) statement 它定义一个变量用于暂存集合中的每一个元素,并执行相应的语句/语句块 collection这一集合表达
阅读全文
摘要:hashCode()和equals()的区别 hashCode()方法和equals()方法的作用其实是一样的,在Java里都是用来对比两个对象是否相等一致。 那么equals()既然已经能实现对比的功能了,为什么还要hashCode()呢?因为重写的equals()里一般比较的比较全面比较复杂,这
阅读全文
摘要:MySQL DATEDIFF() 函数 DATEDIFF() 函数返回两个日期之间的天数。 语法: DATEDIFF(date1,date2) SELECT DATEDIFF('2008-12-30','2008-12-29'); # 结果为1 SELECT DATEDIFF('2008-12-29
阅读全文
摘要:https://www.runoob.com/w3cnote/sql-join-image-explain.html
阅读全文
摘要:ThreadLocal类用于创建一个线程本地变量 在Thread中有一个成员变量ThreadLocals,该变量的类型是ThreadLocalMap,也就是一个Map,它的键是threadLocal,值为就是变量的副本。通过ThreadLocal的get()方法可以获取该线程变量的本地副本,在get
阅读全文
摘要:Java中的类加载器 Java 中的类加载器大致可以分成两类,一类是系统提供的,另外一类则是由Java 应用开发人员编写的。系统提供的类加载器主要有下面三个: 引导类加载器(bootstrap class loader): 它用来加载 Java 的核心库,是用原生代码来实现的,并不继承自 java.
阅读全文
摘要:sendRedirect()和forward()方法有什么区别? redirect是重定向,forward是转发 sendRedirect()方法会创建一个新的请求,而forward()方法只是把请求转发到一个新的目标上。 重定向(redirect)以后: 之前请求作用域范围以内的对象就失效了,因为
阅读全文
摘要:Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行。 wait()和sleep() 共同点 : 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。 wait()和sleep()都可以通过interrupt()方法
阅读全文
摘要:什么是死锁(deadlock)? 所谓死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。 死锁产生的4个必要条件: 互斥条件:进程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进
阅读全文
摘要:面向对象软件开发的优点有哪些? 代码开发模块化,更易维护和修改。 代码复用。 增强代码的可靠性和灵活性。 增加代码的可理解性。 面向对象编程有很多重要的特性,比如:封装,继承,多态和抽象。 封装的定义和好处有哪些? 封装给对象提供了隐藏内部特性和行为的能力。对象提供一些能被其他对象访问的方法来改变它
阅读全文
摘要:什么是cookie? cookie是Web服务器发送给浏览器的一块信息。 浏览器会在本地文件中给每一个Web服务器存储cookie。 以后浏览器在给特定的Web服务器发请求的时候,同时会发送所有为该服务器存储的cookie。 session和cookie有什么区别? 无论客户端浏览器做怎么样的设置,
阅读全文
摘要:HTTP响应的结构是怎么样的? HTTP响应由三个部分组成: 状态码(Status Code): 描述了响应的状态。 可以用来检查是否成功的完成了请求。 请求失败的情况下,状态码可用来找出失败的原因。 如果Servlet没有返回状态码,默认会返回成功的状态码HttpServletResponse.S
阅读全文
摘要:什么是Servlet? Servlet是用来处理客户端请求并产生动态网页内容的Java类。 Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。 Servlet的体系结构 所有的Servlet都必须要实现的核心的接口是javax.serv
阅读全文
摘要:什么是RMI? Java远程方法调用(Java RMI)是Java API对远程过程调用(RPC)提供的面向对象的等价形式,支持直接传输序列化的Java对象和分布式垃圾回收。 远程方法调用可以看做是激活远程正在运行的对象上的方法的步骤。 RMI对调用者是位置透明的,因为调用者感觉方法是执行在本地运行
阅读全文
摘要:什么是JDBC? JDBC是允许用户在不同数据库之间做选择的一个抽象层。 JDBC允许开发者用JAVA写数据库应用程序,而不需要关心底层特定数据库的细节。 解释下驱动(Driver)在JDBC中的角色。 JDBC驱动提供了特定厂商对JDBC API接口类的实现,驱动必须要提供java.sql包下面这
阅读全文
摘要:finalize()方法什么时候被调用?析构函数(finalization)的目的是什么? 垃圾回收器(garbage collector)决定回收某对象时,就会运行该对象的finalize()方法。 但是在Java中很不幸,如果内存总是充足的,那么垃圾回收可能永远不会进行,也就是说filalize
阅读全文
摘要:面试题 Java中的两种异常类型是什么?他们有什么区别? Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常。 不受检查的异常不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外
阅读全文
摘要:-Xms -Xmx分别设置堆的最小值和最大值,如果要设置成堆的大小可变,那么可以将最大值和最小值设置成不一样,如果要将堆大小固定,那么只需将最大值和最小值设置成一样的就行。 jvm中分为堆和方法区 堆又进一步分为新生代和老年代 方法区为永久代 堆中区分的新生代和老年代是为了垃圾回收,新生代中的对象存
阅读全文
摘要:面试题 Java中垃圾回收有什么目的?什么时候进行垃圾回收? 垃圾回收是在内存中存在没有引用的对象或超过作用域的对象时进行。 垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。 System.gc()和Runtime.gc()会做什么事情? 这两个方法用来提示JVM要进行垃圾回收。 但
阅读全文
摘要:面试题 HashSet和TreeSet有什么区别? HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。 另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remov
阅读全文
摘要:面试题 如何权衡是使用无序的数组还是有序的数组? 有序数组最大的好处在于查找的时间复杂度是O(log n),而无序数组是O(n)。 有序数组的缺点是插入操作的时间复杂度是O(n),因为值大的元素需要往后移动来给新元素腾位置。 相反,无序数组的插入时间复杂度是常量O(1)。
阅读全文
摘要:面试题 你了解大O符号(big-O notation)么?你能给出不同数据结构的例子么? 大O符号描述了当数据结构里面的元素增加的时候,算法的规模或者是一个渐进上界 。 大O符号也可用来描述其他的行为,比如:内存消耗。因为集合类实际上是数据结构,我们一般使用大O符号基于时间,内存和性能来选择最好的实
阅读全文
摘要:面试题 Comparable和Comparator接口是干什么的?列出它们的区别。 Java提供了只包含一个compareTo()方法的Comparable接口。这个方法可以给两个对象排序。 具体来说,它返回负数,0,正数来表明已经存在的对象小于,等于,大于输入对象。 Java提供了包含compar
阅读全文
摘要:面试题 数组(Array)和列表(ArrayList)有什么区别? Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。 Array大小是固定的,ArrayList的大小是动态变化的。 ArrayList提供了更多的方法和特性,比如:addAll(),removeAll(),i
阅读全文
摘要:面试题 Java中的HashMap的工作原理是什么? Java中的HashMap是以键值对(key-value)的形式存储元素的。 HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。 当调用put()方法的时候,HashMap会计算k
阅读全文
摘要:笔记:https://mp.weixin.qq.com/s/AndIwanhZ3Tlg0iQe8a4lQ 视频:https://www.bilibili.com/video/BV187411y7hF?p=10
阅读全文
摘要:Linux操作注意事项 关机前需要先使用sync指令保存文件到硬盘 常用的基本命令 笔记:https://mp.weixin.qq.com/s/4dZ3mbu287pC6mdGOczGAA 视频:https://www.bilibili.com/video/BV187411y7hF?p=6 账号/用
阅读全文
摘要:什么是迭代器(Iterator)? Iterator接口提供了很多对集合元素进行迭代的方法,每一个集合类都包含了可以返回迭代器实例的迭代方法。 迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object Obj)删除,可以通过迭代器的remove()方法删除。 I
阅读全文
摘要:面试题 Java集合类框架的基本接口? 集合类接口指定了一组叫做元素的对象。 集合类接口的每一种具体的实现类都可以选择以它自己的方式对元素进行保存和排序。 有的集合类允许重复的键,有些不允许。 Java集合类提供了一套设计良好的支持对一组对象进行操作的接口和类。 Java集合类里面最基本的接口有:
阅读全文
摘要:这种方式我尝试成功了,特此记录。 这种方式虽然没有成功,但是感觉挺靠谱的。
阅读全文
摘要:面试题 进程和线程的区别是什么? 进程是执行着的应用程序,而线程是进程内部的一个执行序列。 一个进程可以有多个线程。线程又叫做轻量级进程。 线程与进程的区别归纳: a.地址空间和其它资源:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。 b.通信:进程间通信IPC,线程间可以
阅读全文
摘要:在Java中,接口不是类,而是对希望符合这个接口的类的一组需求。 接口中的所有方法都是自动是public方法。因此,在接口中声明方法,不用提供关键字public。 实现接口时,必须把方法声明为public。否则,编译器会认为这个方法是包可见性的(类的默认访问属性),之后编译器会报错,提示应该提供更严
阅读全文
摘要:在调用子类构造器之前,会先调用父类构造器,当子类构造器中没有使用"super(参数或无参数)"指定调用父类构造器时,是默认调用父类的无参构造器。 如果父类中包含有参构造器,却没有无参构造器,则在子类构造器中一定要使用“super(参数)”指定调用父类的有参构造器,不然就会报错。 使用super调用构
阅读全文
摘要:面试题 Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法? (1)当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的无参构造方法。 (2)Java中构造方法重载和方法重载很相似。可以为一个类创建
阅读全文
摘要:面试题 Java中的方法覆盖(Overriding)和方法重载(Overload)是什么意思? (1)Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。 (2)与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者
阅读全文
摘要:静态字段: 如果将字段定义为static,每个类中只有一个这样的字段。 而对于非静态的实例字段,每个对象都有自己的一个副本。 class Employee{ private static int nextId = 1; // 静态字段nextId private int id; // 实例字段id
阅读全文
摘要:IDEA中Maven项目失效 IDEA中创建的maven项目中的文件夹都变成普通格式,pom.xml变成橙色 右键点击橙色的pom.xml文件,选择add as maven project maven项目开始重新导入相应依赖,恢复正常 其他注意事项:打开项目结构,查看SDK是否配置,jdk版本是否对
阅读全文
摘要:队列 先进先出(FIFO) 在 FIFO 数据结构中,将首先处理添加到队列中的第一个元素。 队列是典型的 FIFO 数据结构 插入(insert)操作也称作入队(enqueue),新元素始终被添加在队列的末尾 删除(delete)操作也被称为出队(dequeue)。 你只能移除第一个元素 队列实现如
阅读全文
摘要:位运算符: &("and") | ("or") ^ ("xor") ~("not") &和|运算符不采用"短路"的方式来求值。所以计算结果之前两个操作数都需要计算。 而&&和||都采用短路的方式,所以第一个操作符false则不继续计算后续。 a = 0011 1100; b = 0000 1101;
阅读全文
摘要:JDK8 新特性: lambda 表达式:允许把函数作为参数传递到方法(可以将Lambda表达式理解为一个匿名函数),简化匿名内部类代码。 函数式接口:使用 @FunctionalInterface 标识,有且仅有一个抽象方法,可被隐式转换为 lambda 表达式。 方法引用:可以引用已有类或对象的
阅读全文
摘要:Java同时有编译型和解释型的特征 Java源程序通过Java编译器从.java文件编译成字节码.class文件,字节码文件运行的时候放到JVM虚拟机的类装载器中,这个类就被加载到JVM中,然后通过字节码校验器检查代码是否正确,检查正确则通过解释器解释给操作系统,走一步解释一步将程序运行起来。 随着
阅读全文
摘要:Java是强类型语言,所以进行一些运算时,需要进行强制类型转换,转换成同一类型,然后进行运算。 容量从低到高(字节大小): byte->short->char->int->long->float->double (小数优先级大于整数) 字节从高到低,高容量转到低容量需要强制类型转换。从低到高,自动类
阅读全文
摘要:数据类型 Java是一种强类型语言,这意味着必须为每一个变量声明一种类型。 8种基本类型:4种整型、2种浮点类型、1种用于表示Unicode编码的字符单元的字符类型char和1种表示真值的boolean类型 Java有一个能表示任意精度的算数包,通常称为“大数值”(big number)。但它并不是
阅读全文
摘要:标识符由字母、数字、下划线、美元符号$组成,第一个字符不能是数字。可以使用中文作为标识符的原因是因为字母选自Unicode字符集。 不能使用Java关键字和保留字作为标识符 标识符没有长度限制 标识符对大小写敏感(Java对大小写敏感)
阅读全文
摘要:JDK: Java Development Kit,java开发工具包 提供了编译运行 Java 程序的各种工具,包括编译器、JRE 及常用类库,是 JAVA 核心。 JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jv
阅读全文
摘要:简单性: Java语法可以看作c++语法的一个纯净版本。没有头文件,没有指针运算,不用分配内存,没有操作符重载,虚基类等等。 简单的另一个方面是小,Java的目标之一是支持开发能够在小型机器上独立运行的软件。基本的解释器以及类支持大约40KB;再加上基础的标准类库和对线程的支持(基本上是一个自包含的
阅读全文