常见的Java问题
文章平均质量分 55
mmalan
这个作者很懒,什么都没留下…
展开
-
jdk 1.7 1.8 HashMap 源码分析
好久不写博客了 从今天开始针对常见面试题写博客 本篇简单分析 jdk1.7 HashMap源码先写好简单测试类 ,然后用idea(神器) debug进入源码中,初始大小为3,装载因子为0.75,我们先进入构造函数看看!我们先看构造函数源代码啊可以看到,我们自己初始化的大小为3(initialCapacity),构造函数中 capacity要找到一个数为2的n次幂最接原创 2018-01-11 13:24:19 · 419 阅读 · 0 评论 -
再学习类加载过程
1.加载类加载就是指将类的二进制class文件读入到内存中,然后将其放在方法区,在堆区创建一个class对象,作为访问这些数据的接口。2. 验证验证的目的是为了确保Class文件中的字节流包含的信息符合当前虚拟机的要求,而且不会危害虚拟机自身的安全。不同的虚拟机对类验证的实现可能会有所不同,但大致都会完成以下四个阶段的验证:文件格式的验证、元数据的验证、字节码验证和符号原创 2018-02-03 19:47:44 · 121 阅读 · 0 评论 -
java 方法区
首先要说明的是,此文章转载自 http://blog.csdn.net/zzhangxiaoyun/article/details/7518917 谢谢作者。另外,这里ps一下,Class对象是存放在堆区的,不是方法区!这点很多人容易犯错。类的元数据(元数据并不是类的Class对象!Class对象是加载的最终产品,类的方法代码,变量名,方法名,访问权限,返回值等等都是在方法区的)才是存在方转载 2018-02-03 20:09:26 · 262 阅读 · 0 评论 -
多线程学习第一天
避免死锁的几个常见方法1.避免一个线程同时获取多个锁2.避免一个锁同时占有多个资源3.使用定时锁 lock.tryLock(time) 来代替内置锁(synchronized)Synchronized底层实现原理代码块同步是通过monitorenter和monitorexit指令实现,monitorenter指令在编译后插入到代码块开始的位置,monitorexit原创 2018-01-19 20:04:27 · 125 阅读 · 0 评论 -
线程池 threadpoolexecutor 学习
线程池状态 在ThreadPoolExecutor中定义了一个volatile变量,另外定义了几个static final变量表示线程池的各个状态:volatile int runState;static final int RUNNING = 0;static final int SHUTDOWN = 1;static final int STOP原创 2018-01-20 11:02:46 · 168 阅读 · 0 评论 -
数据库事务隔离级别
read_uncommitted 隔离级别最低 会出现脏读 不可重复读 幻读,脏读就是事务B能读取到事务A的未提交的数据(未提交到数据库)。read_committed 会出现不可重复读 幻读的现象不可重复读(重点在于修改)就是你可以修改别人提交过的数据,所以别人两次读到的数据不一样repeatedable read (锁行) 会出现幻读一个事务A对所有记录进行更改,另原创 2018-01-20 11:36:25 · 194 阅读 · 0 评论 -
简单聊聊java 中断机制
首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止。所以,Thread.stop, Thread.suspend, Thread.resume 都已经被废弃了。而 Thread.interrupt 的作用其实也不是中断线程,而是「通知线程应该中断了」,具体到底中断还是继续运行,应该由被通知的线程自己处理。具体来说,当对一个线程,调用 interrupt()转载 2018-01-13 20:10:07 · 285 阅读 · 1 评论 -
读写锁
小结一下;读锁是共享的,多个线程可以同时获得读锁。写锁是互斥的,只要有写就是互斥的,比如线程a获得了写锁(lock.writlock),没有释放,那么其他线程不能获得这个写锁,也不能获得对应的读锁(lock.readlock),也就是有写线程获得了写锁没有释放,那么读线程,写线程都会堵塞。原创 2018-02-04 21:11:47 · 129 阅读 · 0 评论 -
同步工具 semaphore countdownlatch使用小结
semaphore 控制访问共享资源的最大线程数 semaphore.acquire获得许可证 semaphore.release释放许可证下面这个代码最多运行3个打印机工作,初始许可证的数目为3 semaphore = new Semaphore(3);public class PrintQueue { /** * 信号量控制打印者的访问 */原创 2018-02-05 14:17:12 · 915 阅读 · 0 评论 -
CompletionService ExecutorService区别
Java中ExecutorService和CompletionService区别我们现在在Java中使用多线程通常不会直接用Thread对象了,而是会用到java.util.concurrent包下的ExecutorService类来初始化一个线程池供我们使用。之前我一直习惯自己维护一个list保存submit的callable task所返回的Future对象。在主线原创 2018-02-05 17:04:49 · 397 阅读 · 0 评论 -
网易云别人的面经 我试着写出答案
针对这个面经https://www.nowcoder.net/discuss/35362?type=2&order=0&pos=17&page=2写一些部分答案hashmap如何解决链表过长?红黑树有哪些特性?链表过长就会转化为红黑树,提高查找效率。红黑树的特性 1. 根节点是黑色 2 每个红色节点的叶子节点都是黑色 3 从任意节点到每个叶子节点的路径中,都包含相同数目的黑色节点。原创 2018-02-05 22:16:33 · 904 阅读 · 0 评论 -
jdk 动态代理的原理
jdk动态代理会动态写一个java文件(代理类 与目标类实现了同一个接口),还有一个声明类实例变量(invocationHandler)jvm会自动生成一个Java文件 这个过程对用户不可见 这个生成类与目标类一样的接口,拥有invocationHandler这个实例变量,代理类每次调用方法 实际上都是调用这个InvocationHandler的invoke方法,在invoke方法里面原创 2018-01-11 16:41:54 · 185 阅读 · 0 评论 -
b 树 b+树
转载: https://www.cnblogs.com/ivictor/p/5849061.htmlB树和B+树的区别 如图所示,区别有以下两点:1. B+树中只有叶子节点会带有指向记录的指针(ROWID),而B树则所有节点都带有,在内部节点出现的索引项不会再出现在叶子节点中。2. B+树中所有叶子节点都是通过指针连接在一起,而B树不会。 B+树的优点:1. 非叶子节点不会带上ROWID,这样,一...转载 2018-02-01 16:44:51 · 162 阅读 · 0 评论 -
syncronized 底层原理
如果对上面的执行结果还有疑问,也先不用急,我们先来了解Synchronized的原理,再回头上面的问题就一目了然了。我们先通过反编译下面的代码来看看Synchronized是如何实现对代码块进行同步的:1 package com.paddx.test.concurrent;2 3 public class SynchronizedDemo {4 public void m原创 2018-02-03 18:48:17 · 618 阅读 · 0 评论 -
静态内部类实现单例模式
/** * 静态内部类实现单例模式 * 加载Singleton类时 不会加载静态内部类SingletonHolder 实现懒加载 * 当使用Instance字段时,会初始化类SingletonHolder 这个由jvm保证线程的唯一性 * */public class Singleton { public static class SingletonHolder {原创 2018-01-19 14:28:24 · 415 阅读 · 0 评论 -
volatile 作用,原理
volatile会增加一个内存屏障。1. 禁止指令重排序12345678//x、y为非volatile变量//flag为volatile变量 x = 2; //语句1y = 0; //语句2flag = true; //语句3x = 4; //语句4y = -1; //语句5由于flag变量为volatile变量,那么在进行指令重排序的过程原创 2018-01-19 12:06:24 · 199 阅读 · 1 评论 -
String 对象不可变的原理
我们先看看String 的源代码string对象成员变量实际上是字符串数组,也是一个引用变量,它用final修饰,这个引用变量就不能指向别的对象,用private修饰,我们就无法在程序中修改引用变量所指的对象的内容,因为在程序中我们拿不到这个引用变量。我们再来看看一个拼接函数 concat举个列子来分析concat函数的原理如下计算所有字符长度 4 定义一个原创 2018-01-12 16:50:43 · 217 阅读 · 1 评论 -
为什么重写equals方法就要重写hashcode方法
有这样一个场景,我们要将很多学生加入到一个set集合中,年龄,姓名相同的视为同一个学生。下面是student类的代码,我们只重写了equals方法。下面将学生添加到set中:发现我们自定义两个相同学生都加进去set集合中。set集合添加元素首先根据hashcode加,如果hashcode不一样,肯定都把元素加进去,如果hashcode一样,再用equals比较,如果相同,则不会原创 2018-01-12 19:50:51 · 514 阅读 · 0 评论 -
虚拟机 常量池概念学习
首先常量池分为静态时常量池和运行时常量池静态时常量池属于class文件数据的一部分,存放着字面量和符号引用。字面量:就是常量 比如String s="aaa", 这个"aaa"就是字面量。符号引用分为三类常量: 对类型,字段,方法的符号引用。静态常量在类加载后进入方法区的运行池常量池中存放。方法区包括常量池,字段信息,方法信息,类信息,类变量。对Class类的引用,对原创 2018-01-13 12:34:25 · 166 阅读 · 0 评论 -
java 线程池的原理
频繁地创建线程很浪费资源。线程池的线程可以复用,执行完一个任务后可以执行另一个任务。corePoolSize:核心池的大小。默认情况下,在创建了线程池后,线程池中的线程数为0,当有任务来之后,就会创建一个线程去执行任务,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中;maximumPoolSize:线程池最大线程数,这个参数也是一个非常重要的参数,原创 2018-01-13 21:37:02 · 75 阅读 · 0 评论 -
ThreadLocal 的工作原理
我们首先来看看set函数吧public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t,原创 2018-01-22 21:41:58 · 270 阅读 · 1 评论 -
双亲委托机制
当前类applicationclassloader加载类的时候,首先查看这个类是否被加载过,被加载过直接返回,没有加载过会委托父类尝试加载,父类没有加载过会继续委托其父类,一直到bootstrapclassloader。这样做的好处就是避免用户自己恶意写了一些与基础类相同名字类所造成的错误。从上面可以看出loadClass方法调用了loadcClass(name,false)方法,原创 2018-01-31 20:57:45 · 284 阅读 · 0 评论 -
简单工厂 工厂方法 抽象工厂
代码参考地址 https://github.com/liuqidong/javase/tree/a5afb4e10a4929862d30c1e817ff471add0f7973/PatternDemo/src/main/java/com/bjsxt/factory/simplefactory简单工厂也叫静态工厂,就是通过静态方法,通过不同的参数构建不同的对象。uml图如下原创 2018-02-01 13:58:08 · 225 阅读 · 0 评论 -
建立索引的原则
小结经常查询的字段,order by ,gropu by后面字段,按范围查找的字段要建立索引。重复值很多,如性别字段,不要建立索引。多表关联查询的时候,关联字段要建立索引。复合索引的工作原理,复合索引有多个字段,先是按照第一个字段排序,第一个字段排序后相同的记录再按照第二个字段排序。索引where语句后面必须用到第一个字段,如果只用到第二个字段不用第一个字段,索引不会有用。原创 2018-02-01 15:07:58 · 282 阅读 · 0 评论 -
乐观锁与悲观锁学习
悲观锁在整个数据处理过程中,将数据处于锁定状态,依靠数据库的锁机制来实现。在上面的场景中,商品信息从查询出来到修改,中间有一个处理订单的过程,使用悲观锁的原理就是,当我们在查询出goods信息后就把当前的数据锁定,直到我们修改完毕后再解锁。那么在这个过程中,因为goods被锁定了,就不会出现有第三者来对其进行修改了。设置完autocommit后,我们就可以执行我们的正常业务了。具体如下://0.开原创 2018-01-19 10:03:43 · 182 阅读 · 0 评论 -
MyISAM与InnoDB区别
1.存储结构不一样MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。2.原创 2018-01-19 11:06:16 · 1071 阅读 · 1 评论 -
记录一些面试题
mysql索引的类型普通索引 index 没有限制 既可以不唯一 也可以为空唯一索引 unique 必须唯一 可以为空主键索引 primary key 唯一 不能为空全文索引 fulltext组合索引https 用了ssl协议 非对称加密 所以是安全的String 不可变两个原因 String 本质是 final 字符数组 value[] 说明value指向的地址不可变 但是本身数组内...原创 2018-02-20 17:43:40 · 181 阅读 · 0 评论