Guava

java集合与guava集合常见使用方法

十年热恋 提交于 2020-10-29 18:50:59
1. HashMap 是无序集合 Map<Integer,Integer> maps= new HashMap<>(); maps.put(9,11); maps.put(10,23); maps.put(11,78); //遍历方式 /* Key = 9, Value = 11 Key = 10, Value = 23 Key = 11, Value = 78 */ for (Map.Entry<Integer, Integer> entry : maps.entrySet()) { System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); } 2. LinkedHashMap 是有序集合 可以通过LinkedHashMap的keySet方法遍历 LinkedHashMap<Integer,Integer> maps= new LinkedHashMap<>(); maps.put(9,11); maps.put(10,23); maps.put(11,78); //遍历方式 获取map中key-value Set<Map.Entry<Integer,Integer>> entrySet = maps.entrySet(); //通过迭代器遍历set集合 Iterator

高并发学习笔记

▼魔方 西西 提交于 2020-10-28 11:44:58
并发 概念 高并发 并发: 多个线程操作相同的资源,保证线程安全,合理使用资源 高并发: 服务能同时处理很多请求,提高程序性能 java 内存模型 Thread Stack 存储基本 变量:比如 int , long 等,或者对象句柄 或者方法 本地变量存在 栈上即 Thread Stack , 对象存在 堆上即Heap 一个本地变量也可能指向一个 对象引用。即引用存储在栈上, 对象是 存在堆上, 一个对象的方法和本地变量是存储在 Thread stack 上的,就算该对象存在 Heap堆上, 一个对象的成员变量 可能会随着这个对象存在 堆上,不管这个成员变量是 原始类型还是引用类型, 静态成员变量,跟随类的定义一起存在堆上, 堆上对象可以被持有该对象引用的线程访问, 一个线程可以访问一个对象,也可以访问该对象的成员变量 如果两个线程 持有 同一个对象的引用,或者调用了同一个对象的方法,线程都会持有对象的成员变量, 但是这两个线程都拥有这个对象的成员变量的 私有拷贝(所以并发时候就容易造成数据不一致) CPU与 Java Memory Model 内存模型 CPU Registers 即 CPU 寄存器 Main Memory 即 主存 同步八种操作 同步规则 总结 并发测试工具 postman , Apache Bench https://www.cnblogs.com

面试官问我:创建线程有几种方式?我笑了

心不动则不痛 提交于 2020-10-28 09:24:31
前言 多线程在面试中基本上已经是必问项了,面试官通常会从简单的问题开始发问,然后再一步一步的挖掘你的知识面。 比如,从线程是什么开始,线程和进程的区别,创建线程有几种方式,线程有几种状态,等等。 接下来自然就会引出线程池,Lock,Synchronized,JUC的各种并发包。然后就会引出 AQS、CAS、JMM、JVM等偏底层原理,一环扣一环。 这一节我们不聊其他的,只说创建线程有几种方式。 是不是感觉非常简单,不就是那个啥啥那几种么。 其实不然,只有我们给面试官解释清楚了,并加上我们自己的理解,才能在面试中加分。 正文 一般来说我们比较常用的有以下四种方式,下面先介绍它们的使用方法。然后,再说面试中怎样回答面试官的问题比较合适。 1、继承 Thread 类 通过继承 Thread 类,并重写它的 run 方法,我们就可以创建一个线程。 首先定义一个类来继承 Thread 类,重写 run 方法。 然后创建这个子类对象,并调用 start 方法启动线程。 2、实现 Runnable 接口 通过实现 Runnable ,并实现 run 方法,也可以创建一个线程。 首先定义一个类实现 Runnable 接口,并实现 run 方法。 然后创建 Runnable 实现类对象,并把它作为 target 传入 Thread 的构造函数中 最后调用 start 方法启动线程。 3、实现

告别 NPE,Optional 全网最全实战理解

孤者浪人 提交于 2020-10-27 08:31:40
1. 前言 相信不少小伙伴已经被java的NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨, 有大佬说过“防止 NPE,是程序员的基本修养。”但是修养归修养,也是我们程序员最头疼的问题之一。之前,Google Guava项目曾提出用Optional类来包装对象从而解决NullPointerException。受此影响,JDK8的类中也引入了Optional类,在新版的SpringData Jpa和Spring Redis Data中都已实现了对该方法的支持。我们今天就要尽可能的利用Java8的新特性 Optional来尽量简化代码同时高效处理NPE(Null Pointer Exception 空指针异常) 2. 初识Optional 首先我们看下面一段代码,肯定会很熟悉 public static String getFirstName(User user) { if(null == user) { return "Unkown"; } return student.getFirstName(); } 从上面看出,就是对这个实例是不是空做了判断,然后我们看下使用java8 的Optional类之后的代码 public static String getFirstName(User user) { return Optional

Guava学习

不想你离开。 提交于 2020-10-26 07:11:35
https://juejin.im/post/5b8823c4e51d4538b7766bfa Guava 中文指南 https://github.com/guobinhit/guava-guide ​​​ 来源: oschina 链接: https://my.oschina.net/u/3847203/blog/4313679

PBFT算法java实现(上)

百般思念 提交于 2020-10-23 02:46:21
PBFT 算法的java实现(上) 在这篇博客中,我会通过Java 去实现PBFT中结点的加入,以及认证。其中使用socket实现网络信息传输。 关于PBFT算法的一些介绍,大家可以去看一看网上的博客,也可以参考我的上上一篇 博客 ,关于怎么构建P2P网络可以参考我的上一篇 博客 。 该项目的地址: GitHub 使用前的准备 使用maven构建项目,当然,也可以不使用,这个就看自己的想法吧。 需要使用到的Java包: t-io:使用t-io进行网络socket通信,emm,这个框架的文档需要收费(699RMB),但是这里我们只是简单的使用,不需要使用到其中很复杂的功能。 fastjson:Json 数据解析 lombok:快速的get,set以及toString hutool:万一要用到呢? lombok:节省代码 log4j:日志 guava:Google的一些并发包 结点的数据结构 首先的首先,我们需要来定义一下结点的数据结构。 首先是结点Node的数据结构: @Data public class Node extends NodeBasicInfo { /** * 单例设计模式 * @return */ public static Node getInstance () { return node; } private Node () {} private static

算法(3)---布隆过滤器原理

倖福魔咒の 提交于 2020-10-20 08:03:50
算法(3)---布隆过滤器原理 开发一个电商项目,因为数据量一直在增加(已达亿级),所以需要重构之前开发好的秒杀功能,为了更好的支持高并发,在验证用户是否重复购买的环节,就考虑用布隆过滤器。 也顺便更加深入的去了解下布隆过滤器的原理,感觉还是蛮有意思的,这一连串的公式不静下心来思考,很容易被绕晕。 一、概述 1、什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的 概率型数据结构 ,特点是 高效地插入和查询 。根据查询结果可以用来告诉你 某样东西一定不存在或者可能存在 这句话是该算法的核心。 相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的,同时布隆过滤器还有一个缺陷就是 数据只能插入不能删除 。 2、数据如何存入布隆过滤器 布隆过滤器是 由一个很长的bit数组和一系列哈希函数组成的 。 数组的每个元素都只占1bit空间,并且每个元素只能为0或1。 布隆过滤器还拥有k个哈希函数,当一个元素加入布隆过滤器时,会使用k个哈希函数对其进行k次计算,得到k个哈希值,并且根据得到的哈希值,在维数组中把对应下标的值置位1。 判断某个数是否在布隆过滤器中,就对该元素进行k次哈希计算,得到的值在位数组中判断每个元素是否都为1,如果每个元素都为1,就说明这个值在布隆过滤器中。 3、布隆过滤器为什么会有误判

为什么牛逼的程序员都不用 “ ! = null

谁说胖子不能爱 提交于 2020-10-15 19:19:19
问题 为了避免空指针调用,我们经常会看到这样的语句 ...if (someobject != null) { someobject.doCalc();}... 最终,项目中会存在大量判空代码,多么丑陋繁冗!如何避免这种情况?我们是否滥用了判空呢? 精华回答 这是初、中级程序猿经常会遇到的问题。他们总喜欢在方法中返回null,因此,在调用这些方法时,也不得不去判空。另外,也许受此习惯影响,他们总潜意识地认为,所有的返回都是不可信任的,为了保护自己程序,就加了大量的判空。 吐槽完毕,回到这个题目本身: 进行判空前,请区分以下两种情况: 1、null 是一个有效有意义的返回值(Where null is a valid response in terms of the contract; and) 2、null是无效有误的(Where it isn't a valid response.) 你可能还不明白这两句话的意思,不急,继续往下看,接下来将详细讨论这两种情况 先说第2种情况 null就是一个不合理的参数,就应该明确地中断程序,往外抛错误。这种情况常见于api方法。例如你开发了一个接口,id是一个必选的参数,如果调用方没传这个参数给你,当然不行。你要感知到这个情况,告诉调用方“嘿,哥们,你传个null给我做甚"。 相对于判空语句,更好的检查方式有两个 (1)assert语句