java学习
文章平均质量分 70
Rainnnbow
这个作者很懒,什么都没留下…
展开
-
Java中使用long类型实现精确的四则运算
引子Effective Java 2nd Edition 第48条建议:如果需要精确的答案,请避免使用float和doble。float和double类型主要是为了科学计算和工程计算而设计的。他们执行二进制制浮点运算(binary floating-point arithmetic),这是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的。然而,他们并没有提供完全精确的结果,所以不应该被用原创 2016-08-22 16:42:46 · 27474 阅读 · 0 评论 -
Java继承时的初始化顺序
Java程序在启动和运行时,需要首先完成初始化的工作。在涉及到继承、static成员变量等因素时,初始化的顺序就复杂起来。下面以一个例子说明继承时的Java初始化顺序。例子:class Insect{ private int i = 9; protected int j; Insect(){ System.out.println("i = "原创 2015-10-22 11:14:48 · 1145 阅读 · 0 评论 -
JUnit单元测试教程(翻译自Java Code Geeks)
本教程翻译自Java Code Geeks,原文网址:https://www.javacodegeeks.com/2014/11/junit-tutorial-unit-testing.html#suite_tests。翻译的过程中,有少部分内容是译者添加的解释说明和对原文章中错误地方的修正。水平有限,如果有错误的地方,希望能在我的博客里告诉我,谢谢。翻译 2016-08-16 09:28:58 · 5429 阅读 · 2 评论 -
String放入运行时常量池的时机与String.intern()方法解惑
运行时常量池概述Java运行时常量池中主要存放两大类常量:字面量和符号引用。字面量比较接近于Java语言层面的常量概念,如文本字符串、声明为final的常量值等。 而符号引用则属于编译原理方面的概念,包括了下面三类常量: - 类和接口的全限定名(包名+类名) - 字段的名称和描述符 - 方法的名称和描述符运行时常量池位置运行时常量池在JDK1.6及之前版本的JVM中是方法区的一部分原创 2016-01-05 11:28:40 · 4974 阅读 · 9 评论 -
Eclipse调试(1)——基础篇
作为使用Eclipse的程序员都会使用它的Debug。但是有不少人只会用F6、F8,其他功能知之甚少。今天我就来总结一下我在使用eclipse的debug时的一些个人经验。水平有限,不足之处还请赐教。测试代码学东西能够学以致用才是关键。所以我使用示例代码的形式讲解每一个点。在下面的代码中,我打了两个断点(代码中注释位置)public class DebugTest { public stati原创 2016-07-25 16:26:06 · 1024 阅读 · 2 评论 -
STATE(状态)模式
引子场景在我们软件开发的过程中,有许多对象是有状态的。而对象的行为会随着状态的改变而发生改变。例如开发一个电梯类,电梯有开门、关门、停止、运行等行为,同时电梯也会有开门状态、关门状态、停止状态、运行状态等不同的状态。电梯处于不同的状态时,对不同的行为会做出不同的动作。如当电梯处于开门状态时,电梯可以做关门动作;开门状态时,电梯一定是停止的,所以此时停止动作不会发生任何行为;开门状态时,电梯不能运行,原创 2016-07-14 22:02:55 · 2692 阅读 · 0 评论 -
Java中的简单工厂模式
Java中的简单工厂模式举两个例子以快速明白Java中的简单工厂模式:女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人。”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面。女娲造人,这就是简单工厂模式的应用。 首先,在这个造人的思想里面,有几个重要的角色:女娲本身、抽象的人的概念和女娲所造出的一个个具体的人。 1.)女转载 2015-01-06 11:42:35 · 798 阅读 · 0 评论 -
Java的LinkedList详解,看源码之后的总结
1. LinkedList实现了一个带表头的双向循环链表;2. LinkedList是线程不同步的;3. LinkedList中实现了push、pop、peek、empty等方法,因此LinkedList实现了所有栈的操作,可以被当作栈来使用;4. LinkedList中实现了offer、peek、element、poll、remove等方法,因此LinkedList实现了所有队列的操原创 2015-09-16 13:59:32 · 1193 阅读 · 0 评论 -
永远不要在循环之外调用wait方法
1. 前言随着摩尔定律的失效,Amdahl定律成为了多核计算机性能发展的指导。对于现在的java程序员们来说,并发编程越来越重要和习以为常。很惭愧和恐慌的是我对java的并发编程一直是只知道概念,入门都不算。最近工作需要,开始认真学习java并发编程。先找了一本简单的电子书《Java7并发编程实战手册》开始看。刚刚看到简单的生产者消费者问题,在书中给出的代码中,有一点不理解:为什么wait()语句要原创 2016-03-03 12:53:51 · 3918 阅读 · 4 评论 -
学习一样新东西行而有效的方法
在简书看到的这篇关于如何学习新东西的总结,挺有收获的。虽然有些道理大家可能都懂,但是如果不付诸实践那还是没有意义的。以下是正文:有人曾从我工作的一家公司盗取了9千万美元。我不太懂得如何观人识人。这家公司最终关门了。有一些事情我就是学不会。我很容易相信一个人。因此,无论我如何尝试,判断一个人对我来说,简直太难了。所以,我寻找擅长做这件事的人,我让他们给我提供帮助。不要转载 2015-06-17 15:53:59 · 1213 阅读 · 0 评论 -
Java编程思想阅读收获
15年8月份买了一本Java编程思想第四版中文版。之所以买中文版是因为我试读了同事的英文版发现自己英语水平还是有限,单词虽然认识,但对很多句子把握不准,这样看书太慢了,要理解英文还要理解技术有些hold不住。买了之后断断续续的看到现在,看了400多页了,看到了泛型一章。从15年8月份到元旦,中间还看了本周志明著的《深入理解java虚拟机-JVM高级特性与最佳实践》对JVM有了初步的了解。对于内存布原创 2016-01-14 10:11:40 · 3442 阅读 · 0 评论 -
String&StringBuilder&StringBuffer总结
一、String的JVM内存分配测试与分析 String a="a"; String b="b"; String c="ab"; String d="ab"; String e=a+b; String str1 = new String("ab"); String str原创 2015-06-03 08:39:48 · 887 阅读 · 0 评论 -
Eclipse调试(2)——各种类型断点设置
本文是 Eclipse调试(1)——基础篇 的提高篇。分两个部分: 1) Debug视图下的3个小窗口视图:变量视图、断点视图和表达式视图 2) 设置各种类型的断点变量视图、断点视图和表达式视图1. variable:变量视图显示debug过程中程序中出现的所有的变量以及其值。我们也可以通过该视图手动设置变量的value。手动设置变量值的作用在于,当debug到该变量处时,没有得到我们预期的值,原创 2016-07-26 13:39:08 · 3032 阅读 · 0 评论 -
JVM学习之-栈
JVM栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;JVM堆解决的是数据存储的问题,即数据怎么放、放在哪儿,另外JVM堆中存的是对象。JVM栈中存的是基本数据类型和JVM堆中对象的引用。JVM基础概念:JVM堆与JVM栈数据类型Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引转载 2015-09-01 13:35:12 · 554 阅读 · 0 评论 -
Java异常处理机制难点解惑-用代码说话
是否需要看这篇文章?下面的例子中,如果正常执行返回值多少? 如果出现了ArithmeticException返回值多少? 如果出现非ArithmeticException(如NullPointerException)返回值多少? 如果你了解这个例子说明的问题,并了解例子中三种情况下的执行细节,这篇文章你就不用浪费时间看了。 例子: public int testException_fina原创 2016-01-08 09:20:01 · 2470 阅读 · 0 评论 -
Minor GC、Major GC和Full GC之间的区别
在 Plumbr 从事 GC 暂停检测相关功能的工作时,我被迫用自己的方式,通过大量文章、书籍和演讲来介绍我所做的工作。在整个过程中,经常对 Minor、Major、和 Full GC 事件的使用感到困惑。这也是我写这篇博客的原因,我希望能清楚地解释这其中的一些疑惑。文章要求读者熟悉 JVM 内置的通用垃圾回收原则。堆内存划分为 Eden、Survivor 和 Tenured/Old 空间转载 2016-08-11 10:36:23 · 1182 阅读 · 0 评论 -
JVM三种垃圾收集算法思想及发展过程
JVM垃圾收集算法的具体实现有很多种,本文只是介绍实现这些垃圾收集算法的三种思想和发展过程。所有的垃圾收集算法的具体实现都是遵循着三种算法思想而实现的。1.标记-清除算法 标记-清除(Mark-Sweep)算法是最基础的垃圾收集算法。正如其名字描述的那样,该算法分为两个阶段:“标记”和“清除”。首先标记出所有可以被回收的对象,然后经过一轮垃圾回收将所有被标记的对象的内存空间释放,即清除可被回收的对原创 2016-02-18 11:18:06 · 1564 阅读 · 3 评论 -
Java对象的内存布局以及对象所需内存大小计算详解
1. 内存布局在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header)、 实例数据(Instance Data)和对齐填充(Padding)。1) 对象头(Header):对象头又可以分为两部分: 第一部分用来存储对象自身的运行时基本数据信息。如哈希码、GC分代年龄、锁状态标示、线程持有的锁等。这部分数据的长度在32bit和64bit虚拟机上分别为32bit和64bit。官方原创 2016-08-08 12:45:06 · 1483 阅读 · 0 评论 -
Java对象的访问定位
java对象在访问的时候,我们需要通过java虚拟机栈的reference类型的数据去操作具体的对象。由于reference类型在java虚拟机规范中只规定了一个对象的引用,并没有定义这个这个引用应该通过那种方式去定位、访问java堆中的具体对象实例,所以一般的访问方式也是取决与java虚拟机的类型。目前主流的访问方式有通过句柄和直接指针两种方式。1.句柄访问 使用句柄访问方式,java堆将会划分原创 2016-08-08 13:01:16 · 1256 阅读 · 0 评论 -
Java对象的创建 —— new之后JVM都做了什么?
Java对象创建过程1. 类加载检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有则进行相应的类加载过程。(我之后会写一篇关于类加载顺序和过程的博客,并在此补充连接地址)2. 分配内存空间类加载检查通过之后,JVM将为新生对象在堆中分配内存。对象所需内存的大小在类加载完成后已经完全确定原创 2016-08-08 10:26:52 · 5275 阅读 · 0 评论 -
JVM的Server与Client运行模式区别与切换
JVM有两种运行模式Server与Client。两种模式的区别在于,Client模式启动速度较快,Server模式启动较慢;但是启动进入稳定期长期运行之后Server模式的程序运行速度比Client要快很多。这是因为Server模式启动的JVM采用的是重量级的虚拟机,对程序采用了更多的优化;而Client模式启动的JVM采用的是轻量级的虚拟机。所以Server启动慢,但稳定后速度比Client远原创 2016-08-17 10:45:30 · 5969 阅读 · 0 评论 -
ArrayList中的modCount与ConcurrentModificationException
在看ArrayList源码时,看到了一个字段modCount。在add、remove、clear等方法中都有modCount++的操作。不明白什么意思。点进去看了看该字段的解释,总算明白了。modCount是在AbstractList抽象类中定义的。该字段的解释如下所示。 /** * The number of times this list has been <i>structur翻译 2016-05-13 11:25:43 · 4314 阅读 · 1 评论 -
我为什么放弃使用MyBatis3的Mapper注解
最近在使用MyBatis3做项目。在使用注解实现Mapper的时候遇到了比较奇葩的问题:在实现数据的batch insert的时候总是报错。好不容易可以正常插入了,但是又不能返回自增的主键id到实体bean中了。而这些问题在XML配置中都不存在。一方面可能是我能力有限,没有找到合适的解决方案;另一方面可能与MyBatis自身对Java中注解的支持不够给力有关系。以下是MyBatis官网对Mapper翻译 2016-08-02 09:55:40 · 5882 阅读 · 1 评论 -
一个Java对象到底占用多大内存
最近在读《深入理解Java虚拟机》,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存?在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用: View Code大家可以用这个代码边看边验证,注意的是,运行这个程序需要通转载 2015-09-22 16:24:08 · 2044 阅读 · 1 评论 -
优先使用TimeUnit类中的sleep()
TimeUnit是什么?TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep(),在很长一段时间里Thread的sleep()方法作为暂停线程的标准方式,几乎所有Java程序员都熟悉它,事实上sleep方法本身也很常用而且出现在很多面试中。如果你已经使用过Thread.sleep(),转载 2016-03-01 17:48:17 · 1427 阅读 · 0 评论 -
Java异常的深入研究与分析
今天上午做完了公司的工作,下午暂时没有工作任务,想到关于Java的异常处理机制和框架的认识还有待提高,看了两篇相关的文章,分享出来。先看了网名为“真实的归宿”的一篇博文:http://blog.csdn.net/hguisu/article/details/6155636,里面有一个例子如下:public class TestException { public TestExc转载 2015-09-16 17:37:08 · 1166 阅读 · 0 评论 -
Java集合类: Set、List、Map、Queue使用场景梳理
本文主要关注Java编程中涉及到的各种集合类,以及它们的使用场景 相关学习资料http://files.cnblogs.com/LittleHann/java%E9%9B%86%E5%90%88%E6%8E%92%E5%BA%8F%E5%8F%8Ajava%E9%9B%86%E5%90%88%E7%B1%BB%E8%AF%A6%E8%A7%A3%28collection%E3%80转载 2015-09-16 13:37:23 · 1447 阅读 · 0 评论 -
Eclipse打jar包,资源文件的读取
最近的工作中需要将java程序打一个jar包,然后在Linux中供调用。程序中需要读取一个配置文件。遇到了三个问题。第一个是依赖的第三方Jar包打成Jar包后找不到;第二个问题是资源文件所在的文件夹打jar包时没有一起打入Jar包中;第三个问题是找不到资源文件,无法读取到指定的文件。下面给出我对三个问题的解决方法:第三方jar包找不到针对这个问题,我没有按照网上一般的方法自己写MANIFI原创 2015-09-15 14:11:29 · 3392 阅读 · 0 评论 -
史上最昂贵的代码(大众欺骗代码)
这可能是史上最昂贵的三行代码了,价值180亿美金。大众汽车可能因为这三行代码面临严重的危及,甚至整个德国经济也会受到影响。(代码大体意思:当前面两个驱动轮转动并且后面的两个非驱动轮不转的时候,启动欺骗模式。)原创 2015-09-29 14:05:41 · 1689 阅读 · 0 评论 -
Java HashMap并发死循环
在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历过,本来觉得没什么好写的,因为Java的HashMap是非线程安全的,所以在并发下必然出现问题。但是,我发现近几年,很多人都经历过这个事(在网上查“HashMap Infinite Loo转载 2015-09-10 16:39:48 · 1009 阅读 · 0 评论 -
ArrayList、HashMap、HashSet源码总结
ArrayList:1. ArrayList是List接口的大小可变数组的实现,此实现是不同步的。2. ArrayList内部使用类型为Object[]的数组存储元素。3. ArrayList默认的数组长度为10, 当需要扩大容量时,扩大后的容量为:newCapacity = (oldCapacity * 3)/2 + 1;4. ArrayList的clone方法为浅拷贝(shal原创 2015-09-09 14:33:25 · 1122 阅读 · 0 评论 -
Java遍历时删除List、Set、Map中的元素(源码分析)
在对List、Set、Map执行遍历删除或添加等改变集合个数的操作时,不能使用普通的while、for循环或增强for。会抛出ConcurrentModificationException异常或者没有达到删除的需求。在遍历时删除元素,需要使用迭代器的方式,代码示例如下:public class CollectionRemoveDemo { public static void mai原创 2015-09-07 18:12:13 · 2403 阅读 · 0 评论 -
JVM的GC(概念与深入)
深入浅出了解什么是GC:http://my.oschina.net/xianggao/blog/86985GC策略详解:http://blog.csdn.net/winniepu/article/details/4829087转载 2015-09-02 12:25:49 · 665 阅读 · 0 评论 -
JVM虚拟机结构
JVM的主要结构如下图所示,图片引用自舒の随想日记。方法区和堆由所有线程共享,其他区域都是线程私有的程序计数器(Program Counter Register)类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemer转载 2015-09-02 10:11:58 · 742 阅读 · 0 评论 -
java的overload与override
概括方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现。重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个类中多态性的一种表现。 overload重载①在一个类中同名的方法通过参数类型、参数个数、参数顺序等区分不同方法。②返回类型、访问控制修饰符、抛出的异常不一样,不能构成重载。原创 2015-08-14 15:45:44 · 705 阅读 · 0 评论 -
Java的访问权限详解(3+1)public private protected default
Java使用三个关键字在类的内部设定访问权限:public、private、protected。这些访问指定词(access specifier)决定了紧跟其后被定义的成员(方法或属性)可以被谁使用。public表示紧随其后的元素对任何人都是可用的,而private这个关键字表示除类型创建者(类内部访问)和类型的内部方法之外的任何人都不能访问的元素。private就像你与客户端程序员之间的一堵砖墙原创 2015-08-05 09:18:47 · 1063 阅读 · 0 评论 -
Java反射详解
一、什么是反射:反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。这一概念的提 出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。其中 LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava等就是基于反射机制的语言。最近,反射机制也被应用到了视转载 2015-09-18 13:26:48 · 620 阅读 · 0 评论 -
JVM基础知识GC
在网上看到一篇很不错的讲解JVM GC的文章,看完之后觉得可以留着以后多看几遍便转载了下来。但是找了半天也没有找到原作者地址。抱歉不能标明原文地址了。以下是文章内容。几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看,又添加了一些东西。突然发现,基础真的很重要。学习的过程是一个由表及里,再由里及表的过程,所谓的“温故而知新”。而真正能走完这个轮回的人,也就能称为大牛或专家转载 2015-09-18 15:17:06 · 842 阅读 · 0 评论 -
Eclipse中配置javap命令
Run→External Tools→External Tools Configurations…进入如下图二所示的Program配置界面。也可以通过如下图一所示的工具栏按钮进入Program配置界面。图一: 图二: 如上图二所示的“Program”处第一次打开时是空的,右键单击选择”new”。配置如上图二右侧红框中的三处。Location为当前使用的jdk中javap.exe的位置; Wor原创 2015-12-22 11:15:29 · 2261 阅读 · 0 评论 -
java自动装箱拆箱总结
对于java1.5引入的自动装箱拆箱,之前只是知道一点点,最近在看一篇博客时发现自己对自动装箱拆箱这个特性了解的太少了,所以今天研究了下这个特性。以下是结合测试代码进行的总结。测试代码: int a = 1; Integer b = 1; Integer c = 1; Integer d = 2; Integer e =原创 2016-01-06 09:45:41 · 2503 阅读 · 0 评论