
java基础
Java基础相关
我咋这么优秀呢
这个作者很懒,什么都没留下…
展开
-
JAVA常用压缩算法底层原理&性能比较
压缩算法目前常用的几个压缩算法GZIP,一个压缩比高的慢速算法,压缩后的数据适合长期使用。 JDK中的java.util.zip.GZIPInputStream / GZIPOutputStream便是这个算法的实现。deflate,zip文件用的就是这一算法。与gzip的不同之处在于,你可以指定算法 的压缩级别,这样你可以在压缩时间和输出文件大小上进行平衡。可选的级别有0(不压缩),以及1(快速压缩)到9(慢速压缩)。它的实现是java.util.zip.DeflaterOutputStrea原创 2020-08-26 22:01:09 · 5107 阅读 · 0 评论 -
synchronized&volatile&synchronized原理
synchronized&volatile&synchronized原理Synchronized&volatileSynchronized本质上是解决对共享变量的访问顺序问题。多线程环境下,方法内的变量是线程安全的。多个线程同时处理一个实例,这个实例内的变量是不安全的。多个线程注入同一个类的不同实例,实例中的变量是安全的。Synchroniz...原创 2019-12-02 14:16:19 · 259 阅读 · 0 评论 -
缓存相关概念&解决方案
缓存缓存穿透(缓存击穿)定义缓存击穿就是指用户查询数据,在数据库中没有,自然在缓存汇中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空。这样就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。解决方案布隆过滤器将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的原创 2020-07-15 11:30:43 · 198 阅读 · 0 评论 -
本地BitMap,通过代码了解BitMap算法
BitMap介绍BitMap就是用一个bit位来标记某个元素对应的value,而key就是该元素。举个例子,假设我们要对0-7内的5个元素(4,7,2,5,3)排序(这里假设这些元素没有重复)。那么我们就可以采用Bit-map的方法来达到排序的目的。要表示8个数,我们就只需要8个Bit(1Bytes),首先我们开辟1Byte的空间,将这些空间的所有Bit位都置为0;然后遍历这5个元素,首先第一个元素是4,那么就把4对应的位置为1(可以这样操作 p+(i/8)|(0×01<<(i%8)原创 2020-07-15 10:20:24 · 232 阅读 · 0 评论 -
幂等性解密
什么是幂等性一次和多次请求某一个资源对于资源本身应该具有同样的结果。就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。f(n) = 1^n 为什么需要幂等性?用户在APP上连续点击了多次提交订单,总不能生成多个订单吧。用户因为网络卡了,连续点击发送消息,接收者总不能收到重复的同一条信息吧。用户发起一笔付款请求,就应该只扣用户一次钱常用手段数据库建立唯一性索引,可以保证最终插入数据库的只有一条数据token机制,每次接口请求前先获取一个token,然后再下次原创 2020-05-08 18:37:14 · 2130 阅读 · 0 评论 -
Java设计模式-原型模式
Java设计模式-原型模式原型模式是用于创建重复的对象,同时又能保证性能。这种设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。...原创 2019-12-24 10:12:41 · 152 阅读 · 0 评论 -
Java设计模式-策略模式
Java设计模式-策略模式介绍在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。举个例子,我们出门的时候会选择不同的出行方式,如骑车,步行,做公交等策略模式定义了一组算法,将每个算法都封装起来,并且使他们之间可以互换。实例定义一个接口Strategypublic interface Strategy { int doOperatio...原创 2019-12-17 11:50:20 · 163 阅读 · 0 评论 -
AtomicInteger&LongAdder
AtomicInteger&LongAdder实例public class MyAtomic { public static void main(String[] args) { AtomicInteger num = new AtomicInteger(1); new Thread(()->AtomicIncrement(num)).s...原创 2019-12-13 17:27:15 · 252 阅读 · 0 评论 -
Unsafe
Unsafe介绍Unsafe在sun.misc包下,不属于java标准。但是很多java的基础类库,如JUC,包括一些被广泛使用的高性能开发库都是基于Unsafe类开发的,比如Netty、Hadoop、Kafka等使用Unsafe可以直接访问系统内存资源并进行自主管理,Unsafe类在提升java运行效率,增强java语言底层操作能力方面起了很大作用。官方不建议使用Unsafe实例化...原创 2019-12-13 16:07:33 · 153 阅读 · 0 评论 -
BlockingQueue
BlockingQueue阻塞队列,BlockingQueue很好的解决了多线程中,如何高效安全传输数据的问题核心方法public interface BlockingQueue<E> extends Queue<E> { //将给定元素插入到队列中,如果插入成功返回true,否则返回false。如果限制了队列长度,推荐使用offer方法 boo...原创 2019-12-13 10:35:16 · 152 阅读 · 0 评论 -
ThreadLocal
ThreadLocalThreadLocal也叫线程本地变量、线程局部变量其作用域覆盖线程,而不是某个任务其自然的生命周期与线程的生命周期相同(但在JDK实现中比线程的生命周期更短,减少了内存泄漏的可能性)ThreadLocal代表了一种线程与任务剥离的思想,从而达到线程封闭的目的,帮助我们设计出更健康的线程安全类ThreadLocal适用于每个线程需要自己独立的实力且该...原创 2019-12-12 16:02:38 · 122 阅读 · 0 评论 -
ConcurrentHashmap的读操作为什么不加synchronized
ConcurrentHashmap的读操作为什么不加synchronized去看ConcurrentHashmap的putVal源码会发现在putVal内部使用了Synchronized关键词保证了线程安全但是看get源码的时候发现根本没有用synchronized关键字,那么get方法是如何保证线程安全的呢?源码如下public V get(Object key) { Nod...原创 2019-12-06 15:55:26 · 1304 阅读 · 0 评论 -
Java内存模型
Java内存模型前言CPU工作过程及出现的问题CPU执行过程计算机在执行程序时,每条指令都是在CPU中执行的,而执行的时候,又免不了要和数据打交道,而计算机上面的临时数据,是存储在主存中的。(计算机内存包括高速缓存和主存)我们知道CPU执行指令的速度比从主存读取数据和向主存写入数据快很多,所以为了高效利用CPU,CPU增加了高速缓存来匹配CPU的执行速度,最终程序的执行过程如下:首...原创 2019-12-04 10:13:09 · 134 阅读 · 0 评论 -
SpringBoot
SpringBoot本质上来说,SpringBoot就是Spring,只是它做了那些没有它你也会去做的Spring Bean配置。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。使用SpringBoot你可以不用或者只需要很少的Spring配置SpringBoot核心自动配置:针对很多Spring应用程序常...原创 2019-11-12 16:37:06 · 332 阅读 · 0 评论 -
FastDFS
FastDFS简介FastDFS是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。应用场景适合以文件为载体的在线服务,如相册网站、视频网站等FastDFS角色跟踪器和存储节点跟踪器主要做调度工作,在访问上起负载均衡的作用存储节点存储工作,完成文件管理的所有功能FastDFS架...原创 2019-11-06 09:37:52 · 136 阅读 · 0 评论 -
Nginx
Nginx简介Nginx是一个网页服务器,它能反向代理HTTP、HTTPS、SMTP、POP3、IMAP的协议链接,以及一个负载均衡器和一个HTTP缓存。作为HTTP服务软件的后起之秀,Nginx与它的老大哥Apache相比有很多改进之处。比如:在性能上,Nginx占用的系统资源更少,能支持更多的并发连接(特别是静态小文件场景),达到更高的访问效率在功能上Nginx不但是一个优秀的W...原创 2019-11-04 15:12:21 · 122 阅读 · 0 评论 -
Lucene
Lucenelucene是什么Lucene在维基百科的定义Lucene是一套用于全文检索和搜索的开放源代码程序库,由Apache软件基金会支持和提供。Lucene提供了一个简单却强大的应用程序接口,能够做全文索引和搜索,在java开发环境里Lucene是一个成熟的免费开放源代码工具;就其本身而论,Lucene是最近几年最受欢迎的java信息检索程序库but,Lucene不提供爬...原创 2019-11-01 17:18:39 · 1587 阅读 · 0 评论 -
开源搜索引擎
开源搜索引擎分类Lucene系搜索引擎,java开发,包括:LuceneSolrElasticsearchKatta、Compass等都是基于Lucene封装Sphinx搜索引擎,C++开发,简单高性能引擎对比LuceneLucene的开发语言是Java,也是Java家族中最为出名的一个开源搜索引擎,在Java世界中已经是标准的全文检索程序,它提供了完整的查询引擎和...原创 2019-11-01 17:14:52 · 420 阅读 · 0 评论 -
深入理解JVM-2
深入理解JVM-2什么是类加载Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型,这就是虚拟机的加载机制。Class文件由类加载器加载后,在JVM中将形成一份描述Class结构的元信息对象,通过元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象...原创 2019-10-30 09:48:56 · 225 阅读 · 0 评论 -
深入理解JVM-1
深入理解JVM-1JVM是什么?JVM是Java Virtual Machine的缩写,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。简单来说JVM就是用来解析和运行Java程序学习JVM的原因程序调优不同的程序(业务场景)需要不同的jvm配置,比如设置不同的垃圾收集器、设置新生代和老生代的内存配置和占比,不同的配置对于...原创 2019-10-29 13:43:13 · 207 阅读 · 0 评论 -
使用Reactor进行反应式编程
使用Reactor进行反应式编程反应式编程(Reactive Programming)这种新的编程范式越来越受到开发人员的欢迎。在 Java 社区中比较流行的是 RxJava 和 RxJava 2。本文要介绍的是另外一个新的反应式编程库 Reactor。反应式编程介绍反应式编程来源于数据流和变化的传播,意味着由底层的执行模型负责通过数据流来自动传播变化。比如求值一个简单的表达式 c=a...原创 2019-10-28 17:11:21 · 466 阅读 · 0 评论 -
ConcurrentHashMap
ConcurrentHashMapjdk8中ConcurrentHashMap的改进jdk1.7中ConcurrentHashMap的设计每一个segment都是一个HashEntry<K,V>[] table,table中的每一个元素本质上都是一个HashEntry的单向队列。比如table[3]为首节点,table[3]->next为节点1,依次类推public...原创 2019-10-22 13:18:20 · 101 阅读 · 0 评论 -
Zookeeper预备知识
Zookeeper预备知识Zookeeper总结ZooKeeper的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。原语:操作系统或计算机网络用语范畴。是由若干条指令组成的,用于完成一定功能的一个过程。具有不可分割性·即原语的执行必须是连续的,在执行过程中不允许被中断。ZooKeeper是一个典型的分布...原创 2019-10-21 15:59:41 · 152 阅读 · 0 评论 -
TreeSet&从树到红黑树
TreeSetTreeSet好处插入的同时就立刻进行排序,只需要设定好比较器,就能按照设定来进行排序,因为他是一个红黑树,树的特征就是拥有排序。同时他是个set,只要比较器认为是同一个,就会被去重。TreeSet使用的结构其内部是是用了TreeMap,Set值保存在Map的key中,value存了一个Object,Map中如果Key值相同会被认为是同一个,这样就能够实现数据去重。Tr...原创 2019-10-18 17:33:24 · 1483 阅读 · 1 评论 -
线程池拒绝策略详解
线程池拒绝策略详解JDK中已经预设了4种线程池拒绝策略,下面结合场景详细聊聊这些策略的使用场景,以及我们还能扩展哪些拒绝策略。池化设计思想池话设计应该不是一个新名词。我们常见的如java线程池、jdbc连接池、redis连接池等就是这类设计的代表实现。这种设计会初始预设资源,解决的问题就是抵消每次获取资源的消耗,如创建线程的开销,获取远程连接的开销等。就好比你去食堂打饭,打饭的大妈会先...原创 2019-10-16 09:55:11 · 1988 阅读 · 3 评论 -
Netty4实例入门
Netty4实例入门建立两个maven模块Server和Clientmaven项目导入注意这里要配置configuration,不然后面执行mvn exec:java会出错 <dependencies> <dependency> <groupId>io.netty</groupId> ...原创 2019-10-15 17:17:20 · 541 阅读 · 0 评论 -
netty介绍
Netty介绍Netty简介Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。一个非常好的处理socket的东西Netty是建立在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象。在Netty里面,Accept连接可以使用单独的线程池去处理,读写操作又是另外的线程池来处理。Accept连接和读写操作也可以使用同一个线程池来进行处...原创 2019-10-15 09:37:22 · 247 阅读 · 0 评论 -
RPC介绍与原理
RPC介绍与原理RPC介绍RPC是什么RPC(Remote Procedure Call)是一种进程间通信方式。简单地说就是能使应用像调用本地方法一样的调用远程的过程或服务,可以应用在分布式服务、分布式计算、远程服务调用等许多场景。说起 RPC 大家并不陌生,业界有很多开源的优秀 RPC 框架,例如 Dubbo、Thrift、gRPC、Hprose 等等。下面先简单介绍一下 RPC 与常用...原创 2019-10-15 09:34:04 · 9964 阅读 · 1 评论 -
查看java内存使用情况
查看java内存情况jinfo:可以输出并修改运行时的java 进程的opts。cmd界面输入jinfo 可以修改运行时的java进程的运行参数。用法是jinfo -opt pid 如:查看2788的MaxPerm大小可以用 jinfo -flag MaxPermSize 2788。jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显...原创 2019-10-12 14:33:25 · 2110 阅读 · 0 评论 -
java并发相关
java并发相关对java并发的误解并发总能改进性能(真相:并发在CPU有很多空闲时间时能明显改进程序的性能,但当线程数量较多的时候,线程间频繁的调度切换反而会让系统的性能下降)编写并发程序无需修改原有的设计。(真相:目的与时机的解耦往往会对系统结构产生巨大的影响)在使用Web或EJB容器时不用关注并发问题。(真相:只有了解了容器在做什么,才能更好的使用容器)正解编写并发程序会在...原创 2019-09-10 11:18:24 · 117 阅读 · 0 评论 -
mybtis-springboot启动过程解析
mybtis-springboot启动过程解析mybatis的启动重要配置XML配置形式<!-- 会话工厂bean sqlSessionFactoryBean --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 数据源 -...原创 2019-09-09 10:00:42 · 799 阅读 · 0 评论 -
技术项目管理
如何做好一个技术项目的管理?目标分析对于任何事情要有清晰的目标才能精确把握。目标:如期交付有质量保障的项目产出。关键词:如期交付(守时守信)、质量保障(保质保量)、项目产出(完整结果)。当然还有最重要的因素:人 + 过程 。既要结果,又要过程,当然,还要这里面人舒服 。总结:项目目标:如期交付(守时守信)、质量保障(保质保量)、项目产出(完整结果);人员目标:...原创 2019-09-06 09:45:37 · 331 阅读 · 0 评论 -
Java设计模式-工厂模式
工厂模式Java里边共有23种设计模式而工厂模式就有三种,它们分别是简单工厂模式(并不在23种模式之中),工厂方法模式以及抽象工厂模式,其中我们通常所说的工厂模式指的是工厂方法模式,工厂方法模式是日常开发中使用频率最高的一种设计模式,甚至在很多源码中也是随处可见。简单工厂模式简单工厂模式并不算是一种设计模式,更多的时候是一种编程习惯。什么是简单工厂模式?定义一个工厂类,根据传...原创 2019-09-05 11:43:41 · 94 阅读 · 0 评论 -
Java设计模式-建造者模式
建造者模式什么是建造者模式?在mybatis处理mybatis-config.xml等映射配置文件时,会在内存中创建相应的配置对系对象,该过程使用了建造者模式建造者模式(也被称为生成器模式)将一个复杂对象的构建过程与它的表示分离,从而使得同样的构建过程可以创建不同的表示。建造者模式将一个复杂对象的创建过程分成了一步步简单的步骤,用户只需要了解复杂对象的类型和内容,而无须关注复杂对象的...原创 2019-09-04 10:01:02 · 114 阅读 · 0 评论 -
Zookeeper简介
Zookeeper简介产生背景当今是个分布式、集群、云计算等名词满天飞的时代。造成这种局面的一个重要因素就是,单一机器的处理能力已经不能满足我们的需求,不得不采用由多台机器组成的服务集群。服务集群对外提供服务的过程中,可以分解处理压力,在一定程度上打破性能瓶颈,并提高服务的可用性(不会因为一台机器宕机而造成服务不可用)。假设有三台机器,每台机器跑同样的一个应用程序。然后我们将这三台...原创 2019-09-04 09:37:03 · 199 阅读 · 0 评论 -
Dubbo简介
Dubbo简介Dubbo历史出生豪门:2011 年 10 月 27 日,阿里巴巴开源了自己服务化治理方案的核心框架 Dubbo,服务治理的设计理念开始逐渐在国内软件行业中落地,并被广泛应用。自开源后,许多非阿里系公司选择使用 Dubbo。半路夭折:2012 年 10 月 23 日,Dubbo 2.5.3 发布后,在 Dubbo 开源将满一周年之际,阿里基本停止了对 Dub...原创 2019-09-03 15:09:17 · 235 阅读 · 0 评论 -
解决git报错 -- Connection reset by [server_ip] port 22
解决git报错 – Connection reset by [server_ip] port 22第一种情况,自己防火墙设置了22端口跳转解决方法打开windows防火墙,选择高级设置新建入站规则,选择端口新建特定端口,22保存就ok了第二种情况,就是这根本不是自己电脑的问题,而是连的网的问题,可能路由器那做了设置解决方法用自己手机无线网坐热点...原创 2019-09-03 10:43:53 · 14630 阅读 · 6 评论 -
Java代码优化细节
Java代码优化细节前言代码优化的目标:减少代码的体积提高代码运行的效率代码优化细节1、尽量指定类、方法的final修饰符带有final修饰符的类是不可派生的。在Java核心API中,有许多应用final的例子,例如java.lang.String,整个类都是final的。为类指定final修饰符可以让类不可以被继承,为方法指定final修饰符可以让方法不可以被重写。如...原创 2019-09-02 15:16:56 · 222 阅读 · 0 评论 -
java容器面试题
二、容器1.java 容器都有哪些?首先分为Collection、Map;Collection下分为List、Set和Queue;Map下分为HashMap、LinkedHashMap、TreeMap、WeakHashMap;List下分为ArrayList和LinkedList;Set下分为HashSet、LinkedHashSet和TreeSet;Queue下有PriorityQueu...原创 2019-08-30 09:47:03 · 257 阅读 · 0 评论 -
java基础面试题
一、Java 基础1.JDK 和 JRE 有什么区别?JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包,可以包括函数库、编译程序等。JRE是Java Runtime Enviroment是指Java的运行环境,是面向Java程序...原创 2019-08-29 09:56:48 · 114 阅读 · 0 评论