java基础
大数据玩家
致力于大数据源码研究、底层原理研究!
展开
-
final关键字详解
final根据修饰位置的不同作用也不相同,针对三种情况: 1)修饰变量,被final修饰的变量必须要初始化,赋初值后不能再重新赋值。 注意:局部变量不在我们讨论的范畴,因为局部变量本身就有作用范围,不使用private、public等词修饰。 2)修饰方法,被final修饰的方法代表不能重写,但可以被重载。 3)修饰类,被final修饰的类,不能够被继承。 ...原创 2019-02-21 14:33:25 · 163 阅读 · 0 评论 -
BIO、NIO、AIO详解
BIO: 同步并阻塞的IO方式,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务端就需要启动一个线程进行处理,如果这个连接不做任何事情就会造成不必要的CPU资源的浪费。这种IO方式适用于连接数目比较小,切固定的架构,因为操作系统对线程的数量有限制,因此这种方式对服务器的资源要求比较高,并发将局限于应用中。在JDK1.4以前是唯一选择。 NIO:同步非阻塞的IO方式,...原创 2019-03-15 10:48:02 · 120 阅读 · 0 评论 -
面试 | HashMap
现在是晚上11点了,学校屠猪馆的自习室因为太晚要关闭了,勤奋且疲惫的小鲁班也从屠猪馆出来了,正准备回宿舍洗洗睡,由于自习室位置比较偏僻所以是接收不到手机网络信号的,因此小鲁班从兜里掏出手机的时候,信息可真是炸了呀,小鲁班心想,微信群平时都没什么人聊天,今晚肯定是发生了什么大事,仔细一看,才发现原来是小鲁班的室友达摩(光头)拿到了阿里巴巴JAVA开发实习生的offer,此时小鲁班真...转载 2019-03-10 22:46:49 · 142 阅读 · 0 评论 -
线程池的使用与执行流程
什么是线程池线程池的概念大家应该都很清楚,帮我们重复管理线程,避免创建大量的线程增加开销。除了降低开销以外,线程池也可以提高响应速度,了解点 JVM 的同学可能知道,一个对象的创建大概需要经过以下几步:检查对应的类是否已经被加载、解析和初始化 类加载后,为新生对象分配内存 将分配到的内存空间初始为 0 对对象进行关键信息的设置,比如对象的哈希码等 然后执行 init 方法初始化...转载 2019-02-26 10:55:22 · 244 阅读 · 0 评论 -
单例模式八种写法
简介 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。基本的实现思路...转载 2019-02-24 23:35:58 · 96 阅读 · 0 评论 -
二分查找法(java实现)
二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找。 二分查找很好写,却很难写对,据统计只有10%的程序员可以写出没有bug的的二分查找代码。出错原因主要集中在判定条件和边界值的选择上,很容易就会导致越界或者死循环的情况。 以下不考虑重复值:public int bi...原创 2019-02-24 22:00:49 · 201 阅读 · 0 评论 -
HashMap resize导致死循环
问题的症状 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题。后来,我们的程序性能有问题,所以需要变成多线程的,于是,变成多线程后到了线上,发现程序经常占了100%的CPU,查看堆栈,你会发现程序都Hang在了HashMap.get()这个方法上了,重启程序后问题消失。但是过段时间又会来。而且,这个问题在测试环境里可能很难...原创 2019-02-22 17:59:57 · 1420 阅读 · 0 评论 -
JavaGuide
详情请见:https://github.com/Snailclimb/JavaGuide原创 2019-02-22 16:00:41 · 1696 阅读 · 0 评论 -
JVM详解 和 7种垃圾回收器的使用(附带内存调优实战)
目录一、JVM内存监控工具二、jvm内存模型三、GC算法四、垃圾回收器一、JVM内存监控工具 1、jconsole 2、jvisualvm二、jvm内存模型 Java虚拟机运行时数据区域被分为五个区域: 堆(Heap)、栈(Stack)、本地方法栈(Native Stac...原创 2019-02-22 10:17:39 · 321 阅读 · 0 评论 -
假如有一个很大的文件里面全是数字,你要对其进行排序,你要怎么做呢?
我们可以将一个很大的文件,切分成很多个小文件,使得每个小文件能够单独的装进内存,并将每个小文件进行内排序(快速排序等等),然后再将多个小文件进行多路归并排序,最终得到一个有序的文件。 多路归并排序在大数据领域也是常用的算法,常用于海量数据排序。当数据量特别大时,这些数据无法被单个机器内存容纳,它需要被切分位多个集合分别由不同的机器进行内存排序(map 过程),然后再进行...原创 2019-02-21 16:10:28 · 3051 阅读 · 1 评论 -
给定a、b两个文件,各存放50亿个url,每个url各占用64字节,内存限制是4G,如何找出a、b文件共同的url?
分别扫描A,B两个文件,根据hash(url)%k(k为正整数,比如k = 1000,那么每个小文件只占用300M,内存完全可以放得下)将url划分到不同的k个文件中,比如a0,a1,....a999;b0,b1,...b999; 这样处理后相同的url肯定在对应的小文件中(a0 vs b0,a1 vs b1,...a999 vs b999)因为相同的url%1000的值肯定...原创 2019-02-21 14:56:07 · 2196 阅读 · 1 评论 -
netty粘包拆包
介绍 粘包: 会将消息粘粘起来发送。类似吃米饭,一口吃多个饭粒,而不是一粒一粒的吃。 拆包: 会将消息拆开,分为多次接受。类似喝饮料,一口一口的喝,而不是一口气喝完。 简单的来说: 多次发送较少内容,会发生粘包现象。 单次发送内容过多,会发生拆包现象。产生原因 我们需要知道,尽管我...原创 2019-03-15 15:11:29 · 153 阅读 · 0 评论