JVM 可以理解的代码就叫做字节码(即扩展名为 .class 的⽂件),它不⾯向任何特定的处理器,只⾯向虚拟机。Java 语⾔通过字节码的⽅式,在⼀定程度上解决了传统解释型语⾔执⾏效率低的问题,同时⼜保留了解释型语⾔可移植的特点。所以 Java 程序运⾏时⽐较⾼效,⽽且,由于字节码并不针对⼀种特定的机器,因此,Java 程序⽆须重新编译便可在多种不同操作系统的计算机上运⾏。
JDK 是 Java Development Kit,它是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。
Java允许重载任何方法
多态就是指程序中定义的引⽤变量所指向的具体类型和通过该引⽤变量发出的⽅法调⽤在编程时并不确定,⽽是在程序运⾏期间才确定
成员变量如果没有被赋初值:则会⾃动以类型的默认值⽽赋值(⼀种情况例外:被 final 修饰的成员变量也必须显式地赋值),⽽局部变量则不会⾃动赋值。
String 中的 equals ⽅法是被重写过的,因为 object 的 equals ⽅法是⽐较的对象的内存地址,⽽ String 的 equals ⽅法⽐较的是对象的值。
当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引⽤。如果没有就在常量池中重新创建⼀个 String 对象。
hashCode()该⽅法通常⽤来将对象的 内存地址 转换为整数之后返回
当你把对象加⼊ HashSet 时, HashSet 会先计算对象的 hashcode 值来判断对象加⼊的位置,同时也会与其他已经加⼊的对象的 hashcode 值作⽐较,如果没有相符的 hashcode, HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调⽤ equals() 方法来检查 hashcode 相等的对象是否真的相同
Runnable 接⼝不会返回结果或抛出检查异常,但是 Callable 接⼝可以
Atomic 是指⼀个操作是不可中断的。即使是在多个线程⼀起执⾏的时候,⼀个操作⼀旦开始,就不会被其他线程⼲扰。
IOC方式
lock 接口在多线程和并发编程中最大的优势是它们为读和写分别提供了锁,它能满足你写
像 ConcurrentHashMap 这样的高性能数据结构和有条件的阻塞。
sleep与wait的区别
sleep是放弃CPU,在经过指定的时间后再获取CPU继续执行,wait是放弃同步锁,等待notify去唤醒
ArrayList扩容是1.5倍
王道记录
并行是并发的特例,并行一定并发
并行是真正的同一时刻发生。
线程是独立调度的基本单位,进程是拥有资源的基本单位。同一个进程的线程共享资源。内核意识不到线程的存在
死锁是指多个进程因竞争资源而造成的互相等待
预防死锁:破坏死锁的四个必要条件
避免死锁:在资源动态分配过程中设置某些条件防止系统进入不安全状态(银行家算法)
CSMA适用于半双工
端口标识的是主机中的应用进程
两次握手的问题:
防止已失效的报文传到服务端产生问题。假设客户A向服务端B建立TCP请求,A的第一个报文超时于是重传一次,B收到之后建立连接通信,数据传输结束后断开连接,而此时超时的第一个报文又到达B则B又会认为A发来了连接请求从而产生错误。
DNS不区分大小写,除了-外不能使用其他标点。
URL中也不区分大小写。
万维网以C/S架构工作
链表的存储密度不如顺序表
克鲁斯卡尔是加边与点无关,普利姆是加点适合稠密图
基数排序的适用场景是关键字选择范围较小
复杂度
时间:快希堆nlogn、
空间:快nlogn,归并n,基数rd
稳定性:快希选堆
b树孩子节点个数的最大值称为阶
叶节点处于同一层
select name as Employee
from Employee e
where salary > (select salary from Employee
where id = e.managerId)
每次对 String 类型进行改变的时候都会生成一个新的 String 对象,然后将指针指向新的 String。
join 可以把两张相同的表拼接到一起,更准确的说是按某种条件拼接到同一行。