![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java面试题——基础篇
蟹黄肉松小贝
这个作者很懒,什么都没留下…
展开
-
Java中的锁
Java中的锁乐观锁认为别人不会更新数据,读取数据时不加锁。大部分通过CAS实现(对数据更新前比较当前值与传入值是否一致,一致则更新,否则不执行更新操作,直接返回失败状态)悲观锁每次读写数据前都先加锁。大部分基于AQS(Abstract Queued Synchronized,抽象同步队列)实现。自旋锁认为持有锁的线程很快会释放资源,因此总选择等一段时间重试获取锁。自旋过程中会消耗CPU。优点: 减少CPU上下文切换缺点: 线程长时间自旋获取不到锁,导致CPU资源浪费Synchroni原创 2020-08-26 23:45:43 · 190 阅读 · 0 评论 -
Java多线程
Java多线程一、线程创建方法继承Tread类实现Runable接口使用ExcutorSerivice和Callable实现有返回值的线程,返回值保存在Future对象中基于线程池创建线程二、线程池工作原理线程池的主要作用:线程复用、线程管理、控制最大并发数。线程复用:Thread类中的start方法中不断循环调用传递进来的Runable对象,而将这些对象存储到Queue中,每次循环调用Queue中的对象,即能实现复用。线程池的核心组件关系如下:线程池工作过程如下(新线原创 2020-08-26 00:09:51 · 149 阅读 · 0 评论 -
Java反射
Java反射反射指在程序运行过程中,对任意一个类都能获取其所有属性和方法,且能调用其任意一个方法。一、反射的应用Java中对象有两种类型——编译时类型和运行时类型。编译时类型旨在声明对象所采用的类型,运行时类型为对象赋值时所采用的类型。(如父类和子类,Java多态父类指向子类对象)程序在编译期间无法预知该对象和类的真实信息(这里插播一下Java泛型的类型擦除,在编码阶段使用泛型时加上类型参数,会被编译器在编译时候去除,该过程称为类型擦除,JVM实际上是无法看到泛型的具体类型的),只能通过运行时信息发原创 2020-08-24 21:03:36 · 95 阅读 · 0 评论 -
Java的动态代理(代理模式)
Java的动态代理(代理模式)代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。(如调用method.invoke()方法)代理模式最主要的就是有一个公共接口,一个具体的类,一个代理类,代理类持有具体类的实例,代为执行具体类实例方法。动态代理的实现创建一个与代理对象相关联的InvocationHandler InvocationHa原创 2020-08-24 21:03:11 · 103 阅读 · 0 评论 -
网络基础(二)
网络基础(二)HTTP无状态协议,不需要建立持久的连接。客户端发出请求且服务器收到请求返回response时连接关闭。HTTP的传输流程:地址解析:通过DNS解析服务器域名从而获得主机IP地址封装HTTP数据包:解析协议名、主机、端口、对象路径、本机信息封装成HTTP请求数据包封装TCP包建立TCP连接:三次握手机制客户端发送请求:建立连接后,客户端一次发送一个请求给服务器端服务器响应:响应成功或错误、消息体等服务器关闭TCP连接:服务器响应后TCP关闭连接,使用keep-alive原创 2020-08-23 20:11:38 · 106 阅读 · 0 评论 -
网络基础(一)
网络基础(一)一、OSI的七层模型如下图:二、TCP/IP的四层模型由网络接口层、网络层、传输层和应用层构成。三、TCP的数据包结构主要有一下几个:源端口、目的端口顺序号seq、确认号ack报头长度、保留位、控制位、窗口大小、校验和数据四、TCP的三次握手和四次挥手图片记忆更直观:三次握手四次挥手...原创 2020-08-22 00:10:03 · 79 阅读 · 0 评论 -
分布式缓存基本原理
分布式缓存基本原理一、简述在微服务架构下,一般需要一个分布式缓存系统来实现跨服务的缓存功能。缓存之间需要数据备份的功能,节点出现故障后,能保证用户的请求转发到其他备份节点来保证业务的正常运行。二、Ehcache简述Ehcache是一个用Java实现的使用简单,高速,实现线程安全的缓存管理类库,ehcache提供了用内存、磁盘文件存储,以及分布式存储方式等多种灵活的cache管理方案。原理:内部采用多线程实现,采用了LinkHashMap存储元素,支持数据持久化到物理硬盘。特点:快速、轻量原创 2020-08-20 23:54:19 · 775 阅读 · 0 评论 -
数据库分布式事务
数据库分布式事务CAPCAP即在一个分布式系统中,一致性(C)、可用性(A),分区容错性(Partition tolerance)三个不可兼得。一致性:同一时刻是分布式系统中的所有数据备份是否有相同的值可用性:一部分节点故障,集群整体能否响应客户端的读写请求分区容错性:系统如果两阶段提交协议(协调者+参与者)在计算机网络及数据库领域内,为了使分布式数据库所有节点在进行事务提交时都保持一致性而设计的一种算法。二阶段提交算法:参与者将操作成功与否的信息告知协调者,协调者再根据所有的反馈决定各原创 2020-08-19 12:56:48 · 168 阅读 · 0 评论 -
数据库和缓存(二)
数据库和缓存(二)一、MySQL相关索引种类:普通索引:最基本的索引,没有任何约束限制。唯一索引:和普通索引类似,但是具有唯一性约束,可以有 null主键索引:特殊的唯一索引,不允许有 null,一张表最多一个主键索引组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并全文索引:对文本的内容进行分词、搜索覆盖索引:查询列要被所建的索引覆盖,不必读取数据行索引的作用:减少数据库服务器需要扫描的数据量帮助数据库服务器避免排序和临时表将随机 I/O 变顺序I/O提高查询原创 2020-08-18 23:48:47 · 71 阅读 · 0 评论 -
数据库和缓存(一)
数据库和缓存(一)一、存储引擎MyISAM是MySQL默认的存储引擎,不支持事务、行级锁和外键执行速度快,占用内存和存储资源少用一个变量保存表的总行数,查总行数速度很快非聚集索引,数据文件是分离的,索引保存的是数据文件的指针,主键索引和辅助索引是独立的表存储在两个文件:MYD 和 MYI更新数据慢且不支持事务,查询速度快InnoDB提供了事务、外键、回滚、崩溃修复能力、多版本并发控制、事务安全等操作底层存储结构为B+树不保存表的总行数,执行 select count(*原创 2020-08-17 23:27:39 · 232 阅读 · 0 评论 -
JVM的类加载机制
JVM的类加载机制概述一、加载阶段加载 -> 验证 -> 准备 -> 解析 -> 初始化加载JVM读取class文件,根据Class文件描述创建对象。将Class文件读取到运行时区域的方法区,在堆中创建Class对象。验证确保Class文件符合当前虚拟机的要求。准备在方法区为类变量分配内存空间并设置类中变量的初始值。需要注意final和static赋初值时期不同(static的初始化放在了构造器中,final在准备阶段赋值)解析将常量池中的符号引用替换为直接引用原创 2020-08-17 00:17:40 · 93 阅读 · 0 评论 -
常见I/O模型及Java I/O
常见I/O模型及Java I/O分类方式(拿网上的餐馆点菜来理解)阻塞和非阻塞:描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。阻塞:到饭店吃饭,一直等直到菜好了,否则不能干其他事情。例子:data = socket.read()非阻塞:到饭店吃饭,点了菜之后可以去干其他事情。同步和异步:描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核原创 2020-08-16 00:21:25 · 127 阅读 · 0 评论 -
Java JVM和常用GC算法
Java JVM和常用GC算法一、JVM的内存区域JVM的内存区域分为:线程私有区域(程序计数器、虚拟机栈、本地方法区)、线程共享区域(堆、方法去)和直接内存。程序计数器:线程私有。用于存储当前运行的线程所执行的字节码的行号指示器。虚拟机栈:线程私有。描述Java方法执行过程的内存模型,当前帧中存储了局部变量表、操作数栈、动态链接、方法出口等信息。本地方法区:线程私有,为Native方法服务堆(运行时数据区):线程共享。采用分代收集算法,从GC角度可分为新生代、老年代和永久代。方法区:线程共原创 2020-08-15 01:17:17 · 187 阅读 · 0 评论 -
Java基础语法(二)
Java基础语法(二)异常类 Throwable |—— Error |__ Exception Java内部类有哪些?成员内部类方法内部类匿名内部类继承式匿名内部类格式接口式匿名内部类格式,加@Override注解参数式的匿名内部类静态嵌套类内部类的作用:提供了Java的"多重继承"的解决方案特点:内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号Java中反射的概念在运行原创 2020-08-13 23:50:18 · 86 阅读 · 0 评论 -
Java中的volatile和synchronize
Java中的volatile和synchronize相关术语名称英文释义内存屏障memory barriers对内存操作的顺序限制缓冲行cache lineCPU高速缓存中可以分配的最小存储单位比较并交换Compare and swapCAS操作输入两个数值,旧值没有发生变化,才交换新值CPU流水线CPU pipeline实现在一个CPU时钟周期完成一条指令volatile的定义及实现定义:Java编程语言允许线程访问共享变量,为了确保共原创 2020-08-11 22:39:06 · 116 阅读 · 0 评论 -
关于Java的HashMap
HashMap相关知识基本概念数据结构:数组+链表(拉链法),链表长度超过8,链表转为红黑树(保证平衡)工作原理:数组中每个元素都是链表,由Node内部类实现存储:调用hash(K)计算K的hash,结合数组长度,计算数组下标;扩容时增加一倍;hash值已存在时会发生碰撞——比对两者equals,true则更新键值对,false则插入链表尾部或红黑树中(注:jdk1.7使用头插;jdk1.8使用尾插)获取:使用hash(K)计算数组下标位置,遍历链表使用equals()方法查找值hashCo原创 2020-08-10 22:26:32 · 91 阅读 · 0 评论 -
设计模式(Design Pattern)
概述设计模式指经过高度抽象化的、在编程中可以反复使用的代码设计经验总结,即一种编程的理念或模式。设计模式的7个原则方便识记,用“单开里依合迪接”来概括。单一职责原则即每个类自己做自己的工作。开闭原则对象内部的模块对扩展开发,对修改封闭。(你可以在我的基础上加东西,但是不能改我原来的)里氏代换原则开闭原则的补充,情景:父子类继承。依赖倒转原则从抽象开始编程而非从实例化的对象开始编程。合成/聚合原则尽量使用合成/聚合来扩展类而非使用继承方法。迪米特法则少于其他类发生关原创 2020-05-19 15:43:45 · 199 阅读 · 0 评论 -
Java中的 ==、equal()和hashcode()
Java中的 ==、equal()和hashcode()概述三者都与对象的比较相关,不同之处在于对基本类型、引用类型等的比较,是比较值还是比较地址的区别。基本类型和引用类型Java的基本类型包括8种:byte、boolean、char、short、int、float、long、double引用类型有:类、接口、数组、枚举、注解==的使用== 首先是一个运算符,其次,当两个对象为基本类型时,比较的是值是否相等;当为引用类型时,比较的是地址。若比较的值不相同,返回false;若比较的值相同,基原创 2020-05-17 23:18:29 · 155 阅读 · 0 评论