阅读笔记:基础知识(Java篇)
1. GC机制(垃圾回收机制)
找到垃圾的方法:引用计数法、可达性分析法
- 回收垃圾的方法:标记清除算法、复制算法、标记整理法、分代算法
2. JVM内存划分
- 线程私有:程序计数器、JVM虚拟机栈、本地方法栈
- 线程公有:堆、方法区、运行时常量池
3. 会发生OOM的区域
- 堆:内存泄漏
- JVM虚拟机栈和本地方法栈:递归循环
- 方法区:早期类加载过多会OOM,现在一般不会
4. 类加载过程
1.加载:将字节码数据从不同的数据源读取到JVM内存,并映射为JVM认可的数据结构
2.链接:
- 验证:校验字节信息是否符合规范,避免恶意信息和不规范数据危害JVM运行安全
- 准备:创建静态变量,并为静态变量开辟内存空间
- 解析:将符号引用替换为直接引用
3.初始化:为静态变量赋值,并执行静态代码块中的逻辑
5. 双亲委派模型
1.类加载器分类
- 启动类加载器:主要加载jre/lib下的jar文件
- 扩展类加载器:主要加载jre/lib/ext下的jar文件
- 应用程序类加载器:主要加载classpath下的文件
2.双亲委派模型:当加载一个类时,优先使用父类加载器加载,当父类加载器无法加载时才使用子类加载器去加载
6. HashMap的原理
- 可以看作是数组+链表的组合。数组被分为一个个的桶。哈希值决定了键值对在数组中的寻址。具有相同哈希值的键值对会组成链表(避免哈希冲突)。当链表长度超过阈值(默认是8)的时候会触发树化,链表会变成树形结构。
7. HashMap需要关注的4个方法
1.hash方法
将key的hashCode值的高位数据移位到低位进行异或运算。这么做的原因是有些key的hashCode值的差异集中在高位,而哈希寻址是忽略容量以上高位的,这种做法可以有效避免哈希冲突
2.put方法(步骤)
- 通过hash方法获取hash值,根据hash值寻址
- 如果未发生碰撞,直接放到桶中
- 如果发生碰撞,则以链表形式放在桶后
- 当链表长度大于阈值后会触发树化,将链表转换为红黑树
- 如果数组长度达到阈值,会调用resize方法扩容
3.get方法(步骤)
- 通过hash方法获取hash值,根据hash值寻址
- 如果与寻址到桶的key相同,直接返回对应的value
- 如果发生冲突,分两种情况。如果是树,则调用getTreeNode获取value;如果是链表,则循环遍历查找对应的value
4.resize方法(步骤)
- 将原数组扩展为原来的2倍
- 重新计算index索引值,将原节点重新放到新的数组中。这一步可以将原先冲突的节点分散到新的桶中
8. sleep和wait的区别
- sleep方法是Thread类中的静态方法,wait是Object类中的方法
- sleep并不会释放同步锁,而wait会释放同步锁
- sleep可以在任何地方使用,而wait方法只能在同步方法或者同步方法块中使用
- sleep中必须传入时间,而wait可以传也可以不传,不传时间的话只有notify或者notifyAll才能唤醒,传时间的话在时间之后会自动唤醒
9. final、finally、finalize的区别
- final可以修饰类、变量和方法。修饰类代表这个类不可被继承,修饰变量代表此变量不可被改变,修饰方法表示此方法不可被重写(override)
- finally是保证重点代码一定会执行的一种机制。通常是使用try-finally或者try-catch-finally来进行文件流的关闭等操作
- finalize是Object类中的一个方法。它的设计目的是保证对象在垃圾回收前完成特定资源的回收。finalize机制已不推荐使用,并且在JDK9已经被标记为deprecated
10. 常见的单例模式
- 饿汉式、双重判断的懒汉式、静态内部类实现的单例(最推荐的方式)、枚举实现的单例
单例对象实例需要有volatile修饰,是因为:mInstance = new SingleTon()包含三个操作(给mInstance分配内存,调用SingleTon的构造方法初始化成员变量,将mInstance指向分配的内存空间),又由于JVM会发生指令重排,所以可能调用顺序会发生错误。这样会导致报错。而volatile的作用有保持可见性和禁止指令重排
11. java中引用类型的区别
- 强引用:指的是通过new对象创建的引用,垃圾回收器即使在内存不足的情况下也不会回收具有强引用的对象
- 软引用:是通过SoftRefrence实现的,在内存不足之前会被垃圾回收器回收。可用于存储一些内存敏感的缓存
- 弱引用:是通过WeakRefrence实现的,垃圾回收器只要扫描到就会将其回收。可用于存储一些内存敏感的缓存
- 虚引用:是通过FanttomRefrence实现的,随时有可能被回收。可用于跟踪对象被垃圾回收的活动,当一个虚引用关联的对象被GC回收之前会受到一条系统通知
12. volatile的原理是在生成的汇编代码中多了一个lock前缀指令,这个前缀指令相当于一个内存屏障,这个屏障有三个作用
- 确保指令重排的时候不会把屏障后的指令排在屏障前,确保不会把屏障前的指令排在屏障后
- 修改缓存中的共享变量后立即刷新到主存中
- 当执行写操作时会导致其他CPU中的缓存无效
13. http与https的区别
- https需要CA证书,很少免费,需要一定费用
- http是明文传输,安全性低;而https是http的基础上通过ssl加密,安全性高
- 默认端口不同。http是80,https是443
14. https的加密算法
- 称加密:加密和解密用的都是相同的秘钥,优点是速度快,缺点是安全性低。常见的算法有DES、AES等等
- 非对称加密:非对称加密有一个密钥对,分为公钥和私钥。一般来说,私钥自己持有,公钥可以公开给对方,优点是安全性比对称加密高,缺点是数据传输效率比对称加密低。采用公钥加密的信息只有对应的私钥可以解密。常见的算法有RSA等
正式场景中一般都是采用对称加密和非对称加密结合的方式,使用非对称加密来完成秘钥的传递,然后使用对称加密实现数据的传递。这样保证了安全性又提高了传输效率
大家如果有什么疑问或者建议可以通过评论或者邮件的方式联系我,欢迎大家的评论~
阅读笔记:基础知识(Java篇)的更多相关文章
- jQuery学习笔记 - 基础知识扫盲入门篇
jQuery学习笔记 - 基础知识扫盲入门篇 2013-06-16 18:42 by 全新时代, 11 阅读, 0 评论, 收藏, 编辑 1.为什么要使用jQuery? 提供了强大的功能函数解决浏览器 ...
- 【进阶之路】Redis基础知识两篇就满足(二)
导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第二篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首 ...
- 【进阶之路】Redis基础知识两篇就满足(一)
导言 大家好,我是南橘,一名练习时常两年半的java练习生,这是我在博客园的第一篇文章,当然,都是要从别处搬运过来的,不过以后新的文章也会在博客园同步发布,希望大家能多多支持^_^ 这篇文章的出现,首 ...
- SQL数据库基础知识-巩固篇<一>
SQL数据库基础知识-巩固篇<一>... =============== 首先展示两款我个人很喜欢的数据库-专用于平时个人SQL技术的练习<特点:体积小,好安装和好卸载,功能完全够用 ...
- JavaScript 基础知识 - BOM篇
前言 本篇文章是JavaScript基础知识的BOM篇,如果前面的<JavaScript基础知识-DOM篇>看完了,现在就可以学习BOM了. 注意: 所有的案例都在这里链接: 提取密码密码 ...
- day01<计算机基础知识&Java语言基础>
计算机基础知识(计算机概述) 计算机基础知识(软件开发和计算机语言概述) 计算机基础知识(人机交互) 计算机基础知识(键盘功能键和快捷键) 计算机基础知识(如何打开DOS控制台) 计算机基础知识(常见 ...
- 10-MySQlL DBA笔记-基础知识
第四部分 运维篇 首先来了解一下数据库的定义,数据库是高效的.可靠的.易用的.安全的多用户存储引擎,我们可以通过它访问大量的持久化数据.我们管理和维护数据库,本质上也是要确保如上的特性,尽可能地保证数 ...
- JQuery基础知识梳理篇
这周没事,优化线上项目,因为前端都在赶项目,我又若菜.于是前端数据展示也要自己来.看javascript看到吐,决定梳理一下Jquery基础知识.敲黑板) 闲扯结束,进入正题. 选择器 介绍 jque ...
- JAVA基础知识|java虚拟机(JVM)
一.JVM简介 java语言是跨平台的,兼容各种操作系统.实现跨平台的基石就是虚拟机(JVM),虚拟机不是跨平台的,所以不同的操作系统需要安装不同的jdk版本(jre=jvm+类库:jdk=jre+开 ...
- SQLServer学习笔记<>.基础知识,一些基本命令,单表查询(null top用法,with ties附加属性,over开窗函数),排名函数
Sqlserver基础知识 (1)创建数据库 创建数据库有两种方式,手动创建和编写sql脚本创建,在这里我采用脚本的方式创建一个名称为TSQLFundamentals2008的数据库.脚本如下: ...
随机推荐
- asp.net core系列 51 Identity 授权(下)
1.6 基于资源的授权 前面二篇中,熟悉了五种授权方式(对于上篇讲的策略授权,还有IAuthorizationPolicyProvider的自定义授权策略提供程序没有讲,后面再补充).本篇讲的授权方式 ...
- 接口测试心得--签名处理(Python)
一.背景 最近负责的项目接口签名规则做了调整,第一次接触“2次认证“的方式,正好有时间,记录一下. 测试的服务A有一部分接口需要给第三方调用,这样需要对第三方有个认证,认证是由一个公共服务(API鉴权 ...
- 从git仓库导入idea的gradle项目无法添加依赖包问题
引言 之前将项目导入到git仓库,后来同事从git仓库将项目导入到本地,发现无法导入依赖包. 解决方法 这个勾idea是默认勾上的,意思是idea将默认使用本地离线工作模式,使用的是本地仓库,每次依赖 ...
- Python进阶:全面解读高级特性之切片!
导读:切片系列文章连续写了三篇,本文是对它们做的汇总.为什么要把序列文章合并呢?在此说明一下,本文绝不是简单地将它们做了合并,主要是修正了一些严重的错误(如自定义序列切片的部分),还对行文结构与章节衔 ...
- netcore程序部署到docker
1.基础准备 1. ubuntu 18.04 2. docker version 18.09 3. netcore 2.1 2.简介 自从netcore支持跨平台之后,以及现在很多公司都是采用容器化部 ...
- Windows核心编程第二章,字符串的表示以及宽窄字符的转换
目录 Windows核心编程,字符串的表示以及宽窄字符的转换 1.字符集 1.1.双字节字符集DBCS 1.2 Unicode字符集 1.3 UTF-8编码 1.4 UTF - 32编码. 1.5 U ...
- JS常用正则表达式备忘录
摘要: 玩转正则表达式. 原文:JS常用正则表达式备忘录 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正则表达式或"regex"用于匹配字符串的各个部分 下面是 ...
- CSS消除button标签的默认样式
button{ /*消除button的默认样式*/ /*这种写法是对所有的button标签同时生效*/ margin: 0px; padding: 0px; /*自定义边框*/ border: 0px ...
- boostrap中模态框显示在阴影之下
boostrap中模态框显示在阴影之下 出现这种情况的原因我开始也搞了很久,问题出现在哪里呢? 有事问百度,在百度上查了一下资料,他们主要的解决办法:是 修改标签的z-index属性的值, 我试着改了 ...
- SqlServer中的系统数据库
SqlServer中的系统数据库有五个,平时写代码不太关注,今天一时兴起研究了一下. 1. master 记录SQL Server系统的所有系统级信息,例如:登陆账户信息.链接服务器和系统配置设置.记 ...