Java HashMap底层实现原理
本节用于记录Java HashMap底层数据结构、方法实现原理等,基于JDK
1.8。
底层数据结构
Java
HashMap底层采用哈希表结构(数组+链表、JDK1.8后为数组+链表或红黑树)实现,结合了数组和链表的优点:
数组优点:通过数组下标可以快速实现对数组元素的访问,效率极高;
链表优点:插入或删除数据不需要移动元素,只需修改节点引用,效率极高。
HashMap图示如下所示:
HashMap内部使用数组存储数据,数组中的每个元素类型为Node<K,V>:
123456789101112131415161718192021222324252627282930313233343536373839static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; Node(int hash, K key, V value, ...
后端开发
未读Maven、安装、环境变量配置教程【图文】详细
原文地址:https://blog.csdn.net/qq_43012792/category_10237140.html
一、下载
1、直接去官网下载即可,很轻量级大小就十来兆
官方下载页面地址:http://maven.apache.org/download.cgi
2、进去官网之后,就可以直接下载,提示:jdk1.8支持所有版本的Maven,所以不用担心兼容问题。
没有迅雷直接在浏览器下载一样,由于我分盘问题,不建议下载到C盘(下载到目录最好是非中文路径)。
二、安装
直接解压即可,不需要安装,和Tomcat一样。复制Maven目录的盘符路径(在当前页面)用于一会环境变量的配置。
我的路径是:C:\Sofaware\apache-maven-3.6.3-bin
三、环境变量的配置(只需要配置两个值)
1、首先Maven是依赖JAVA_HOME的,所以你得先有jdk的配置,但是我想你都开始用Maven了,之前肯定配置好了jdk略过;
2、我的电脑->右键->属性->环境变量配置,单用户在用户变量或者系统变量配置 ...
JDK开发环境搭建及环境变量配置(win10)
原文地址:https://blog.csdn.net/weixin_39709686/article/details/104594845
一.安装JDK开发环境
1.网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
然后下载系统对应的版本,我下载的为Windows x64
2.打开下载下来的可执行文件
点击下一步
3.安装位置自行设置,当提示安装JRE时看需求(以后可能会用到),如果需要可一路点击下一步。
二.配置环境变量
1.右键单击“此电脑->属性->高级系统设置->环境变量”
2.在“系统变量”栏下单击“新建”。
新建->变量名:JAVA_HOME
变量值:C:\Program Files\Java\jdk1.8.0_181
(即JDK的安装路径)
“系统变量”栏里找到Path,选中后单击编辑
然后单击新建,填入%JAVA_HOME%\bin
再新建,填入%JAVA_HOME% ...
Thymeleaf 表达式工具类
Thymeleaf默认提供了丰富的表达式工具类,列举一些常用的工具类。
Objects工具类
12345678/* * 当obj不为空时,返回obj,否则返回default默认值 * 其同样适用于数组、列表或集合 */${#objects.nullSafe(obj,default)}${#objects.arrayNullSafe(objArray,default)}${#objects.listNullSafe(objList,default)}${#objects.setNullSafe(objSet,default)}
String工具类
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410 ...
后端开发
未读什么是代理
增强一个对象的功能
买火车票,app就是一个代理,他代理了火车站,小区当中的代售窗口
java当中如何实现代理
java实现的代理的两种办法
代理的名词
代理对象 增强后的对象
目标对象 被增强的对象
他们不是绝对的,会根据情况发生变化
静态代理
继承
代理对象继承目标对象,重写需要增强的方法;
缺点:会代理类过多,非常复杂
聚合
目标对象和代理对象实现同一个接口,代理对象当中要包含目标对象。
缺点:也会产生类爆炸,只不过比继承少一点点
总结:如果在不确定的情况下,尽量不要去使用静态代理。因为一旦你写代码,就会产生类,一旦产生类就爆炸。
动态代理
自己模拟的动态代理
不需要手动创建类文件(因为一旦手动创建类文件,就会产生类爆炸),通过接口反射生成一个类文件,然后调用第三方的编译技术,动态编译这个产生的类文件成class文件,继而利用UrlclassLoader(因为这个动态产生的class不在工程当中所以需要使用UrlclassLoader)把这个动态编译的类加载到jvm当中,最后通过反射把这个类实例化。
缺点:首先要生成文件
缺点:动态编译文件 class
缺点:需要一个 ...
spring AOP常见面试题目
Aop是什么
与OOP对比,面向切面,传统的OOP开发中的代码逻辑是自上而下的,而这些过程会产生一些横切性问题,这些横切性的问题和我们的主业务逻辑关系不大,这些横切性问题不会影响到主逻辑实现的,但是会散落到代码的各个部分,难以维护。AOP是处理一些横切性问题,AOP的编程思想就是把这些问题和主业务逻辑分开,达到与主业务逻辑解耦的目的。使代码的重用性和开发效率更高。
aop的应用场景
1. 日志记录
2. 权限验证
3. 效率检查
4. 事务管理
5. exception
springAop的底层技术
JDK动态代理
CGLIB代理
编译时期的织入还是运行时期的织入?
运行时期织入
运行时期织入
初始化时期织入还是获取对象时期织入?
初始化时期织入
初始化时期织入
springAop和AspectJ的关系
Aop是一种概念
springAop、AspectJ都是Aop的实现,SpringAop有自己的语法,但是语法复杂,所以SpringAop借助了AspectJ的注解,但是底层实现还是自己的
1234spri ...
what is IOC
1控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)
Dependency Injection
依赖注入
关于什么是依赖
关于注入和查找以及拖拽
为什么要使用spring IOC
spring体系结构––IOC的位置 自己看官网
12在日常程序开发过程当中,我们推荐面向抽象编程,面向抽象编程会产生类的依赖,当然如果你够强大可以自己写一个管理的容器,但是既然spring以及实现了,并且spring如此优秀,我们仅仅需要学习spring框架便可。当我们有了一个管理对象的容器之后,类的产生过程也交给了容器,至于我们自己的app则可以不需要去关系这些对象的产生了。
spring实现IOC的思路和方法
12spring实现IOC的思路是提供一些配置信息用来描述类之间的依赖关系,然后由容器去解析这些配置信息,继而维护好对象之间的依赖关系,前 ...
后端开发
未读spring5通用日志框架
各种日志技术的关系和作用
通过源码来分析spring的日志技术
commons-logging源码分析
通过源码分析mybaits的日志技术
架构系统时候如何选择、优化日志技术
主流的log技术名词
log4j
12345<!--<dependency>--> <!--<groupId>log4j</groupId>--> <!--<artifactId>log4j</artifactId>--> <!--<version>1.2.12</version>--><!--</dependency>-->
可以不需要依赖第三方的技术 直接记录日志
jcl
jakartaCommonsLoggingImpl
12345<dependency> <groupId>commons-logging</groupId> <artifa ...
docker安装
安装
123456789101112131415161718yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engineyum install -y yum-utils \ device-mapper-persistent-data \ lvm2yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repoyum install -y docker-ce docker-c ...
kubernetes介绍
Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S。
K8S是Google内部一个叫Borg的容器集群管理系统衍生出来的,Borg已经在Google大规模生产运行十年之久。
K8S主要用于自动化部署、扩展和管理容器应用,提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能。
2015年7月,Kubernetes
v1.0正式发布,截止到2017年9月29日最新稳定版本是v1.8。
Kubernetes目标是让部署容器化应用简单高效。
官方网站:www.kubernetes.io
kubernetes主要功能
数据卷
Pod中容器之间共享数据,可以使用数据卷。
应用程序健康检查
容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性。
复制应用程序实例
控制器维护着Pod副本数量,保证一个Pod或一组同类的Pod数量始终可用。
弹性伸缩
根据设定的指标(CPU利用率)自动缩放Pod副本数。
服务发现
使用环境变量或DNS服务插件保证容器中程序 ...