Java 集合框架
Java集合框架 (Java Collections Framework, JCF) 也称容器,在这里主要对如下部分进行源码分析,及在面试中常见的问题。例如,在阿里面试常问到的 HashMap 和 ConcurrentHashMap 原理等等。深入源码分析是面试中必备的技能,通过本文的阅读会对集合框架有更深一步的了解。
一、概述
Java集合框架提供了数据持有对象的方式,提供了对数据集合的操作。Java 集合框架位于 java.util 包下,主要有三个大类:Collection(接口)、Map(接口)、集合工具类。
1.1 集合框架图
1.2 Collection
ArrayList:线程不同步。默认初始容量为 10,当数组大小不足时容量扩大为 1.5 倍。为追求效率,ArrayList 没有实现同步(synchronized),如果需要多个线程并发访问,用户可以手动同步,也可使用 Vector 替代。
LinkedList:线程不同步。双向链表实现。LinkedList 同时实现了 List 接口和 Deque 接口,也就是说它既可以看作一个顺序容器,又可以看作一个队列( ...
SpringBoot 整合 AOP
一、前言
AOP(Aspect Oriented Programming, 面向切面编程),是 Spring 的核心思想之一,即纵向重复,横向抽取,它在 Spring 中应用广泛,例如 拦截器、日志、事务等等,在 SpringBoot 中使用 AOP 之前,我们先复习下 AOP 的理论知识。
二、AOP 理论
2.1 术语解释
为了方便解释,给出一个例子:
123456public interface UserService { void save(); void delete(); void update(); void query();}
12345678910111213public class UserServiceImpl implements UserService { @Override public void save() { System.out.println("save"); } @Override public void delete() ...
SpringBoot 配置 Logback
一、前言
SLF4J(Simple Logging Facade For Java), 它是针对各类 Java 日志框架的同一抽象,即日志门面。Java 的日志框架众多,SLF4J定义了统一的日志抽象接口。
默认情况下,SpringBoot 采用 Logback 来记录日志,并输出 INFO 级别日志到控制台。从下图可以看到,spring-boot-stater 的依赖中已经包含了 Logback,因此我们无需手动导入依赖。
从下图可以看到,日志输出内容包含:
内容
描述
时间日期
精确到毫秒
日志级别
ERROR, WARN, INFO, DEBUG, TRACE
进程ID
分隔符
标识实际日志的开始
线程名
方括号括起来(可能会截断控制台输出)
Logger名
通常使用源代码的类名
日志内容
二、基础配置
2.1 控制台输出
日志级别从低到高分为 TRACE < DEBUG < INFO < WARN < ERROR < FATAL。如果你将日志级别修改为 ERROR,那么低于 ERROR级别的 ...
HoloLens 开发笔记(7)——Voice
本篇文章来学习 HoloLens 的基础开发之语音操作。
创建一个新的 Unity 项目 VoiceDemo,初始化项目:
导入 MRTK 包
应用项目设置为 MR 项目
使用 HoloLensCamera 替代默认相机
添加 CursorWithFeedback
添加 InputManager
设置 InputManager 的 SimpleSinglePointerSelector 脚本的 Cursor 属性为添加的 CursorWithFeedback
添加一个 Cube,位置如下
最终 Hierarchy 结构如下:
一、语音控制
在 Hierarchy 创建一个空的 gameObject 并重命名为 SpeechManager,为其添加 MRTK 的 SpeechInputSource.cs 脚本,为其添加两个关键字,分别是 start rotate 和 stop rotate。
后面对应的 Key Shortcut,字面意思是对应的键盘按键,但是我在实际程序中并没有体会到有啥用,所以就随便设了两个值,有知道的同学可以留言告诉我下。
...
SpringBoot 配置国际化
一、LocaleResolver
国际化的支持中一个重要的类是 LocaleResolver,它提供了四种默认实现:
AcceptHeaderLocaleResolver
没有任何具体实现,通过浏览器头部的语言信息来进行多语言选择。
FixedLocaleResolver
设置固定的语言信息,这样整个系统的语言是一成不变的,用处不大。
CookieLocaleResolver
将语言信息设置到 Cookie 中,这样整个系统就可以获得语言信息
SessionLocaleResolver
将语言信息放到 Session 中,这样整个系统就可以从Session中获得语言信息。
一般来说,我们都使用基于 Cookie 或者是基于 Session 的 LocaleResolver,也可以自定义 LocaleResolver。
当每次请求时,都会调用我们设置的 LocaleResolver,根据它的 resolveLocale()方法来解析 Locale,从而实现国际化。
二、MessageSource
Spring 中定义了一个 MessageSource 接口,以用于支持信息的国际化 ...
SpringBoot 集成 Spring Security(7)——认证流程
在前面的六章中,介绍了 Spring Security 的基础使用,在继续深入向下的学习前,有必要理解清楚 Spring Security 的认证流程,这样才能理解为什么要这样写代码,也方便后续的扩展。
一、认证流程
上图是 Spring Security 认证流程的一部分,下面的讲解以上图为依据。
(1) 用户发起表单登录请求后,首先进入 UsernamePasswordAuthenticationFilter:
在 UsernamePasswordAuthenticationFilter 中根据用户输入的用户名、密码构建了 UsernamePasswordAuthenticationToken,并将其交给 AuthenticationManager 来进行认证处理。
AuthenticationManager 本身不包含认证逻辑,其核心是用来管理所有的 AuthenticationProvider,通过交由合适的 AuthenticationProvider 来实现认证。
(2) 下面跳转到了 ProviderManager ,该类是 AuthenticationMana ...
HoloLens 开发笔记(6)——Gesture
本篇文章来学习 HoloLens 的基础开发之手势操作。
创建一个新的 Unity 项目 GestureDemo,初始化项目:
导入 MRTK 包
应用项目设置为 MR 项目
使用 HoloLensCamera 替代默认相机
添加 CursorWithFeedback
添加 InputManager
设置 InputManager 的 SimpleSinglePointerSelector 脚本的 Cursor 属性为添加的 CursorWithFeedback
添加一个 Cube,位置如下
最终 Hierarchy 结构如下:
一、Navigation
新建一个脚本 CubeNavigation.cs,并将其添加到 Cube 上。
1234567891011121314151617181920212223242526272829using UnityEngine;using HoloToolkit.Unity.InputModule;public class CubeNavigation : MonoBehaviour,INavigationHa ...
SpringBoot 集成 Spring Security(6)——登录管理
在本篇中,主要关注登录的管理,因此代码使用最原始版本的即可,即《SpringBoot集成Spring Security(1)——入门程序》源码即可。
一、自定义认证成功、失败处理
有些时候我们想要在认证成功后做一些业务处理,例如添加积分;有些时候我们想要在认证失败后也做一些业务处理,例如记录日志。
在之前的文章中,关于认证成功、失败后的处理都是如下配置的:
12345678910http.authorizeRequests() // 如果有允许匿名的url,填在下面// .antMatchers().permitAll() .anyRequest().authenticated().and() // 设置登陆页 .formLogin().loginPage("/login") .failureUrl("/login/error") .defaultSuccessUrl("/") .permitAll() ...;
即 failureUrl() 指定认证失败后Url,def ...
如何判断一个元素在亿级数据中是否存在
前言
最近有朋友问我这么一个面试题目:
现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)。
需求其实很清晰,只是要判断一个数据是否存在即可。但这里有一个比较重要的前提:非常庞大的数据。
常规实现
先不考虑这个条件,我们脑海中出现的第一种方案是什么?
我想大多数想到的都是用 HashMap 来存放数据,因为它的写入查询的效率都比较高。写入和判断元素是否存在都有对应的 API,所以实现起来也比较简单。
为此我写了一个单测,利用 HashSet 来存数据(底层也是 HashMap );同时为了后面的对比将堆内存写死:
1-Xms64m -Xmx64m -XX:+PrintHeapAtGC -XX:+HeapDumpOnOutOfMemoryError
复制代码为了方便调试加入了 GC 日志的打印,以及内存溢出后 Dump 内存。
123456789101112131415@Testpublic void hashMapTest(){ long star = System.currentTimeMillis() ...
2019 秋招总结
一、前言
做了一段时间的 HoloLens,换换脑子,记录下刚刚结束的秋招。
因为本科是渣渣二本,且准备时间太短(9月份才开始),各一线互联网大厂连简历关都过不去。既然网申不行,那就跑宣讲,跑双选会。两个月时间,跑遍了南京各大学校、各个软件园,最后尘埃落定,有遗憾,有收获,也算是不负自己的努力吧。
二、如何准备秋招?
2.1 实习很重要
因为一些原因,没能在大三下学期参加实习,但是我认为:实习很总要!实习很总要!实习很总要!
重要的话说三遍,秋招的企业,下到中小企业大到一线大厂,都十分看重实习经验。在我们学校,会组织安排企业实习,但是如果你有能力,请务必自己找实习企业,而且如果你想毕业后进大厂的话,实习企业越大越好。
说的明白了,这段实习经验不是去赚钱的,甚至是要亏钱的,通过这段经历,你可以:
熟悉企业开发流程,规范自己编码规范
参与实际项目,学校项目企业一般会无视
实习企业水准,一定程度上代表了你的水平
有大厂经历背书,不论是再进大厂 or 小厂都会比较容易
2.2 关注大厂内推和招聘资讯
一般大厂在6月份就会开始秋招,比一般公司提早许多。你需要及时关注各 ...