SpringBoot第三天以及HachMap
1.hashmap的底层数据结构 1.8之前和1.8的区别?
JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是链表散列。
JDK1.8之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。
2.hashmap存储元素的过程?
当添加一个元素(key-value)时,首先计算key的hash值,以此确定插入数组中的位置,但是可能存在同一个hash值的元素已经放在同一位置了,这是就添加到同一hash值元素的后面,他们在数组同一个位置,就形成了链表,同一个链表上的hash值是相同的,所以说数组存放的是链表。
3.hashMap 加载因子为什么0.75?
HashMap有两个参数影响其性能:初始容量和加载因子。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子是哈希表在其容量自动扩容之前可以达到多满的一种度量。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行扩容、rehash操作(即重建内部数据结构),扩容后的哈希表将具有两倍的原容量。
加载因子需要在时间和空间成本上寻求一种折衷。加载因子过高,例如为1,虽然减少了空间开销,提高了空间利用率,但同时也增加了查询时间成本;加载因子过低,例如0.5,虽然可以减少查询时间成本,但是空间利用率很低,同时提高了rehash操作的次数。在设置初始容量时应该考虑到映射中所需的条目数及其加载因子,以便最大限度地减少rehash操作次数,所以,一般在使用HashMap时建议根据预估值设置初始容量,减少扩容操作。
选择0.75作为默认的加载因子,完全是时间和空间成本上寻求的一种折衷选择
4.hashmap 为什么长度是2的n次方?
HashMap计算添加元素的位置时,使用的位运算,这是特别高效的运算;另外,HashMap的初始容量是2的n次幂,扩容也是2倍的形式进行扩容,是因为容量是2的n次幂,可以使得添加的元素均匀分布在HashMap中的数组上,减少hash碰撞,避免形成链表的结构,使得查询效率降低.
5.为什么转换成红黑树的节点是8?
红黑树的平均查找长度是log(n),如果长度为8,平均查找长度为log(8)=3,链表的平均查找长度为n/2,当长度为8时,平均查找长度为8/2=4,这才有转换成树的必要;链表长度如果是小于等于6,6/2=3,而log(6)=2.6,虽然速度也很快的,但是转化为树结构和生成树的时间并不会太短。
选择8因为符合泊松分布,超过8的时候,概率已经非常小了,所以我们选择8这个数字
6.hashmap的构造函数哪些?
hashMap有4个构造函数:
(1)HashMap()
构造一个具du有默认初始容量 (16) 和默认加载zhi因子 (0.75) 的空dao HashMap。
(2)HashMap(int initialCapacity)
构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。
(3)HashMap(int initialCapacity, float loadFactor)
构造一个带指定初始容量和加载因子的zhuan空 HashMap。
(4)HashMap(Map<? extends K,? extends V> m)
构造一个映射关系与指定 Map 相同的新 HashMap。
7.springboot整合log4j日志记录
log4j.rootLogger=info,error,CONSOLE,DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.info.datePattern=’.‘yyyy-MM-dd
log4j.appender.info.Threshold = info
log4j.appender.info.append=true
log4j.appender.info.File=/Users/dddd/Documents/testspace/pms-api-services/logs/info/api_services_info
log4j.logger.error=error
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.error.datePattern=’.‘yyyy-MM-dd
log4j.appender.error.Threshold = error
log4j.appender.error.append=true
log4j.appender.error.File=/Users/dddd/Documents/testspace/pms-api-services/logs/error/api_services_error
log4j.logger.DEBUG=DEBUG
log4j.appender.DEBUG=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DEBUG.layout=org.apache.log4j.PatternLayout
log4j.appender.DEBUG.layout.ConversionPattern=%d{yyyy-MM-dd-HH-mm} [%t] [%c] [%p] - %m%n
log4j.appender.DEBUG.datePattern=’.'yyyy-MM-dd
log4j.appender.DEBUG.Threshold = DEBUG
log4j.appender.DEBUG.append=true
log4j.appender.DEBUG.File=/Users/dddd/Documents/testspace/pms-api-services/logs/debug/api_services_debug
log4j\u4EE3\u7801
private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
8.引入log4j依赖
<dependency
<groupId org.springframework.boot </groupId
<artifactId spring-boot-starter-log4j </artifactId
<version 1.3.8.RELEASE</version
</dependency
9.Controller
@RestController
public class LoggController {
private static final Logger logger = LoggerFactory.getLogger(LoggController.class);
@RequestMapping("/printLog")
public String printLog(){
logger.info(“日志打印输出了…”);
return “Hello World…”;
}
}
10.使用Aop统一处理Web请求日志
导入依赖
<dependency
<groupId org.springframework.boot </groupId
<artifactId spring-boot-starter-aop </artifactId
</dependency
Aop处理日志的类
package com.oracle.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
@Aspect
@Component
public class WebLogAspect {
private static final Logger logger = LoggerFactory.getLogger(WebLogAspect.class);
@Pointcut(“execution(public * com.oracle.order.controller..(…))”)
public void webLog() {
}
@Before(“webLog()”)
public void doBefore(JoinPoint joinPoint) throws Throwable {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
logger.info("URL : " + request.getRequestURL().toString());
logger.info("HTTP_METHOD : " + request.getMethod());
logger.info("IP : " + request.getRemoteAddr());
Enumeration<String> enu = request.getParameterNames();
while (enu.hasMoreElements()) {
String name = (String) enu.nextElement();
logger.info("name:{},value:{}", name, request.getParameter(name));
}
}
@AfterReturning(returning = "ret", pointcut = "webLog()")
public void doAfterReturning(Object ret) throws Throwable {
logger.info("RESPONSE : " + ret);
}
}
控制类
@RequestMapping("/getMember")
public String getMember(String name,Integer age){
return “success”;
}
本文地址:https://blog.csdn.net/weixin_54479381/article/details/112543459
推荐阅读
-
SpringBoot 定时任务的两种实现方法(Scheduled和quartz)以及InitializingBean接口的作用
-
SpringBoot中SpringMVC的自动配置以及扩展
-
springboot bean循环依赖实现以及源码分析
-
SpringBoot错误处理机制以及自定义异常处理详解
-
springBoot 依赖管理 自动配置,容器功能 ,以及配置常用注解详解
-
SpringBoot整合Elasticsearch详细步骤以及代码示例(附源码)
-
SpringBoot 对IBM MQ进行数据监听接收以及数据发送
-
【SpringBoot】默认错误处理机制的源码大白话分析,以及自定义配置(遇坑)
-
SpringBoot 封装返回类以及session 添加获取
-
【SpringBoot】SpringBoot整合MyBatis,以及配置PageHelper分页插件