自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 JDK1.7及其之前的HashMap死循环问题

只是在jdk1.7以及多线程下进行哈希扩容的情况下才会发生本质是产生了一个循环链表,导致在get或put新元素的时候一直循环遍历链表主要发生在hashmap的transfer方法中 //转移原哈希表中的元素到新的哈希表中 void transfer(Entry[] newTable, boolean rehash) { //获取新数组容量 int newCapacity = newTable.length; //遍历老哈希表En

2021-08-13 09:08:08 189

原创 集合中的modCount属性

modCount:记录当前集合被修改的次数1)添加 2)删除这两个操作都会影响元素的个数当我们使用迭代器或者foreach遍历时,如果你在foreach遍历时,会自动调用迭代器的迭代方法此时在遍历过程中调用了集合的add,remove方法时,modCount就会改变而迭代器记录的modCount是开始迭代之前的,如果两个不一致就会报异常:ConcurrentModificationException说明有两个线路/线程同时操作集合。这种操作有风险,为了保证结果的正确性,避免这样的情况发生,.

2021-08-13 09:04:41 277

原创 HashMap的put方法(JDK1.7)

public V put(K key, V value) { //如果table数组为空,进行数组填充(为table分配实际内存空间),入参为threshold //此时threshold为initCapacity,默认是1<<4(=16) if (table == EMPTY_TABLE) { inflateTable(threshold);//分配数组空间 } //如果存入的键值...

2021-08-13 09:03:38 770

原创 为什么HashMap的容量必须是2的次幂

要明白为什么是2的n次幂,这要从hashmap的hash方式说起,hashmap的容量期望就是用来均匀散列存放map中的元素。hashmap根据hash值把元素放到hashmap内部数组的一个位置上。1、为什么hashmap的容量必须是2的n次幂??我们不妨先看看hashCode的原理,以String为列,获取hashCode的方法源码 public int hashCode() { int h = hash; if (h == 0 && v...

2021-08-11 17:08:41 925

原创 HashMap(JDK1.7)底层原理(二)

HASHMAP(JDK1.7)在PUT的时候会发生冲突,而解决冲突的方式就是使用链表,那么我们假设HASHMAP存储结构如下图:那么节点1和节点2组成了一个链表,那么现在如果再来PUT一个节点3,假设节点3也需要插在这个链表中,我们考虑链表的插入效率,将节点3插在链表的头部是最快的,那么就会如下图:那么按照上图这种插入办法,会出现一个问题:·当我们需要get(节点2)时,我们先将节点2的key进行哈希然后算出下标,拿到下...

2021-08-11 16:29:50 73

原创 HashMap(JDK1.7)底层原理(一)

在JDK1.7中,HashMap是由数组+链表实现的,原理图如下HashMap map = new HashMap(); // 伪初始化map.put("键","值"); // 真初始化HashMap的构造方法在执行时会初始化一个数组table,大小为0HashMap的put方法在执行时会首先判断table大小是否为0,如果为0则会进行真初始化,也叫延迟初始化,当进行真初始化时,数组的默认大小为16,当然也可以调用HASHMAP的有参构造方法由你来指定一个数组的初...

2021-08-11 16:23:43 134

原创 GoF-23之建造者模式

背景当一个类的内部数据过于复杂的时候(通常是负责持有数据的类,比如Config、VO、PO、Entity...),要创建的话可能就需要了解这个类的内部结构,还有这些东西是怎么组织装配等一大坨乱七八糟的东西,这个时候就会增加学习成本而且会很混乱,这个时候就想啊想一种什么法子来管理一下这个类中的数据呢,怎么在创建的时候让它按部就班的来,并且代码可读性很好别让我看花了眼啊,我要的东西也能都很好设置进来,这就是Builder模式的应用场景,Builder模式可以将一个类的构建和表示进行分离1、介绍

2021-08-10 15:59:58 91

原创 GoF-23之工厂设计模式

工厂设计模式1、什么是工厂设计模式工厂设计模式,顾名思义,就是用来生产对象的,在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则,如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦 2、简单工厂设计模式定义:一个工厂方法,依据传入

2021-08-10 15:57:42 57

原创 GoF-23之单例模式

1、什么是单例模式?单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在 ​ 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。 ​ 比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取, ​ 然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。2、单例的实现步骤1)将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象

2021-08-10 15:53:48 129

原创 动态代理-JDK动态代理

1、 什么是代理模式?当一个对象不能直接使用,可以在客户端和目标对象之间创建一个中介,这个中介就是代理作用:1.控制访问:在代理模式中,控制是否可以调用目标对象的方法2.功能增强:可以在完成目标对象的调用时,附加一些额外的功能,这些额外的功能叫做功能增强代理的实现方式:1.静态代理:代理类是手动实现的一个java文件,同时代理的目标对象是固定的优点:容易理解,使用方便缺点:在目标类比较多的时候,会产生大量的代理类;当接口改变时,所影响的目标类和代理类比较多2.动态代理:使

2021-08-10 15:42:43 126

原创 关于SSM框架中的乱码问题

1、可以在web.xml中配置spring内置的字符过滤器<filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding<

2021-08-09 19:52:08 112

原创 SpringMVC的执行流程

1、SpringMVC工作原理图执行流程: 1、用户发送请求至前端控制器DIspatcherServlet 2、DIspatcherServlet收到请求调用处理器映射器HandlerMapping 3、处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet 4、DIspatcherServlet根据处...

2021-08-09 19:37:25 83

原创 关于Spring中的事务处理

1、声明式事务 spring中的声明式事务是通过aop来实现的 <!--配置声明式事务--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <constructor-arg ref="dataSource"/> </bean> &l...

2021-08-09 19:14:48 105

原创 spring整合MyBatis

导入相关依赖junit、mybatis、mysql数据库、Spring相关的、aop织入、mybatis-spring <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12...

2021-08-09 19:02:55 71

原创 IOC-DI注入

控制反转(Inversion of Control)是一种设计思想,DI(依赖注入)是实现IOC的一种方法,也有人认为DI只是IOC的另一种说法。没有IOC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。控制反转:控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的反转:程...

2021-08-09 18:42:52 89

原创 ResultMap:结果集映射:一对多assaciation,多对一collection(重点)

<resultMap id="UserMap" type="User"> colum:数据库中的字段 property:实体类中的属性 <result colum="id" property="id"/> <result colum="name" property="name"/> <result colum="pwd" property="password"/></resultMap><select i.

2021-08-09 17:22:35 370

原创 第一个MyBatis程序

1.导入依赖<dependencies> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.

2021-08-09 17:17:10 60

原创 SSM框架整合

基本环境搭建1、导入SSM框架以及所必需的依赖<!--依赖:junit,数据库驱动,连接池,servlet,jsp,mybatis,mybatis-spring,spring--> <dependencies> <!--Junit--> <dependency> <groupId>junit</groupId> <artifact..

2021-08-07 17:30:07 109

原创 C3P0连接池在Tomcat服务关闭时报多个线程无法停止的问题

在TomCat服务器关闭时,使用c3p0或者别的连接池会报出连接池关闭失败,可能会导致内存泄漏的问题,解决如下: 首先是连接池的配置 注意:destroy-method="close" <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value="${jdbc

2021-08-07 14:30:15 511

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除