[专栏]Java基础知识
文章平均质量分 95
pfnie
这个作者很懒,什么都没留下…
展开
-
Java中数组的特性
目录(?)[+]Java中的数组是对象吗Java中数组的类型Java中数组的继承关系Java中数组的另一种继承关系源码数组是基本上所有语言都会有的一种数据类型,它表示一组相同类型的数据的集合,具有固定的长度,并且在内存中占据连续的空间。在C,C++等语言中,数组的定义简洁清晰,而在Java中确有一些会让人迷惑的特性。本文就尝试分析这些特性。Java中的数组是对象转载 2016-05-24 13:19:06 · 424 阅读 · 0 评论 -
深入分析Java的序列化与反序列化
序列化是一种对象持久化的手段。普遍应用在网络传输、RMI等场景中。本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到以下几个问题:怎么实现Java的序列化为什么实现了java.io.Serializable接口才能被序列化transient的作用是什么怎么自定义序列化策略自定义的序列化策略是如何被调用的ArrayList对序列化的实现有什么转载 2016-05-23 17:14:41 · 384 阅读 · 0 评论 -
《Java虚拟机原理图解(一)》JVM运行时数据区
JVM运行时数据区(JVM Runtime Area)其实就是指JVM在运行期间,其对计算机内存空间的划分和分配。本文将通过以下几个话题来讨论JVM运行时数据区。Topic 1. JVM运行时数据区里有什么?Topic 2. 虚拟机栈 是什么?虚拟机栈里有什么?Topic 3.栈帧是什么?栈帧里有什么?Topic 4. 方法区是什么?方法区里有什么?Topic 1.JVM运转载 2016-06-19 20:50:49 · 404 阅读 · 0 评论 -
实战OutOfMemoryError异常以及使用Eclipse Memory Analyzer查看Dump日志
之所以写这篇博客是因为在一次的面试过程中,被问到这个,而我却没有回答出来。当时面试官的问题是:你平时是如何查看Dump日志的?而我当时一听这个问题,蒙了,因为我根本就没有弄过这个什么Dump日志,于是写下这篇博客记录一下。 在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError异常的可能,本节将通过若原创 2016-10-09 14:12:43 · 5599 阅读 · 0 评论 -
虚拟机栈和本地方法栈溢出
由于在HotSpot虚拟机中并不区分虚拟机栈和本地方法栈,因此对于HotSpot来说,-Xoss参数(设置本地方法栈大小)虽然存在,但实际上是无效的,栈容量只由-Xss参数设定。关于虚拟机栈和本地方法栈,在Java虚拟机规范中描述了两种异常:如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。如果虚拟机在扩展栈时无法申请到足够的内存空原创 2016-10-09 15:16:29 · 2245 阅读 · 0 评论 -
方法区和运行时常量池溢出
由于运行时常量池是方法区的一部分,因此这两个区域的溢出测试就放在一起进行。如果要向运行时常量池中添加内容,最简单的做法就是使用String.intern()这个Native方法。该方法的作用是:如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。原创 2016-10-09 18:40:57 · 730 阅读 · 0 评论 -
本机直接内存溢出
DirectMemory容量可通过-XX:MaxDirectMemorySize指定,如果不指定,则默认与Java堆的最大值(-Xmx指定)一样。代码清单2-9越过了DirectByteBuffer类,直接通过反射获取Unsafe实例并进行内存分配(Unsafe类的getUnsafe()方法限制了只有引导类加载器才会返回实例,也就是设计者希望只有rt.jar中的类才能使用Unsafe的功能原创 2016-10-09 19:02:33 · 1427 阅读 · 2 评论 -
JAVA 内存泄露详解
一、介绍Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存。理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它的表现与C++不同。那么什么是内存泄露呢?下面我给出的定义如下:程序代码无法原创 2016-10-16 10:14:40 · 788 阅读 · 0 评论 -
The substring() Method in JDK 6 and JDK 7
一、AbstractionThesubstring(int beginIndex, int endIndex) method in JDK 6 and JDK 7 are different. Knowing the difference can help you better use them. For simplicity reasons, in the followingsubs转载 2016-10-16 10:24:48 · 454 阅读 · 0 评论 -
ThreadLocal内存泄露(上)
一、介绍Java中的ThreadLocal 变量用于将变量同当前线程绑定,每个线程都有自己独立的ThreadLocal变量。这些变量通常用于保存一些变量的状态信息,譬如用户信息这种在整个应用中都使用的到并且你不想在每个方法中都重新声明。ThreadLocal 的生命周期和它相应的线程直接关联。如果线程被终止并且被垃圾回收器收集,它相应的ThreadLocal 变量也将会被回收。内存问题主要原创 2017-01-02 14:34:58 · 447 阅读 · 0 评论 -
认识JAVA数组
噢,它明白了,河水既没有牛伯伯说的那么浅,也没有小松鼠说的那么深,只有自己亲自试过才知道!道听途说永远只能看到表明现象,只有亲自试过了,才知道它的深浅!!!!!一、什么是数组 数组?什么是数组?在我印象中的数组是应该这样的:通过new关键字创建并组装他们,通过使用整形索引值访问它的元素,并且它的尺寸是不可变的! 但是这只是数组的最表面的东西!深一点?就是这样:数组转载 2016-05-23 16:26:50 · 385 阅读 · 0 评论 -
hashCode
在前面三篇博文中LZ讲解了(HashMap、HashSet、HashTable),在其中LZ不断地讲解他们的put和get方法,在这两个方法中计算key的hashCode应该是最重要也是最精华的部分,所以下面LZ揭开hashCode的“神秘”面纱。hashCode的作用要想了解一个方法的内在原理,我们首先需要明白它是干什么的,也就是这个方法的作用。在讲解数组时(java提高篇(十八)——数转载 2016-05-23 14:24:36 · 409 阅读 · 0 评论 -
Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
本文转载自:http://blog.csdn.net/luanlouis/article/details/24589193class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中。这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码。JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信转载 2016-05-26 12:54:51 · 584 阅读 · 0 评论 -
Comparable与Comparator浅析
今天博主在翻阅TreeMap的源码,发现其键必须是实现Comparable或者Comparator的接口时产生了一些兴趣,比如在TreeMap中的put方法分别对Comparable和Comparator接口分别进行处理。那么疑问就来了,Comparable和Comparator接口的区别是什么,Java中为什么会存在两个类似的接口? Comparable和Comparator接口都是用来比转载 2016-05-13 14:32:03 · 318 阅读 · 0 评论 -
fail-fast机制
在JDK的Collection中我们时常会看到类似于这样的话:例如,ArrayList:注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于转载 2016-05-17 18:01:56 · 307 阅读 · 0 评论 -
Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?
Java语言中,Object对象有个特殊的方法:hashcode(), hashcode()表示的是JVM虚拟机为这个Object对象分配的一个int类型的数值,JVM会使用对象的hashcode值来提高对HashMap、Hashtable哈希表存取对象的使用效率。 关于Object对象的hashCode()返回值,网上对它就是一个简单的描述:“JVM根据某种策略生成的”,那么这种策转载 2016-05-31 11:24:35 · 858 阅读 · 0 评论 -
subList的缺陷
我们经常使用subString方法来对String对象进行分割处理,同时我们也可以使用subList、subMap、subSet来对List、Map、Set进行分割处理,但是这个分割存在某些瑕疵。一、subList返回仅仅只是一个视图首先我们先看如下实例:public static void main(String[] args) { List list1 = ne转载 2016-05-19 14:58:40 · 444 阅读 · 0 评论 -
asList的缺陷
在实际开发过程中我们经常使用asList讲数组转换为List,这个方法使用起来非常方便,但是asList方法存在几个缺陷:一、避免使用基本数据类型数组转换为列表使用8个基本类型数组转换为列表时会存在一个比较有味的缺陷。先看如下程序:public static void main(String[] args) { int[] ints = {1,2,3,4,5};转载 2016-05-19 18:04:49 · 384 阅读 · 0 评论 -
请为集合指定初始容量
集合是我们在Java编程中使用非常广泛的,它就像大海,海纳百川,像万能容器,盛装万物,而且这个大海,万能容器还可以无限变大(如果条件允许)。当这个海、容器的量变得非常大的时候,它的初始容量就会显得很重要了,因为挖海、扩容是需要消耗大量的人力物力财力的。同样的道理,Collection的初始容量也显得异常重要。所以:对于已知的情景,请为集合指定初始容量。public static void转载 2016-05-20 11:44:43 · 396 阅读 · 0 评论 -
保持compareTo和equals同步
在Java中我们常使用Comparable接口来实现排序,其中compareTo是实现该接口方法。我们知道compareTo返回0表示两个对象相等,返回正数表示大于,返回负数表示小于。同时我们也知道equals也可以判断两个对象是否相等,那么他们两者之间是否存在关联关系呢?public class Student implements Comparable{ private Str转载 2016-05-20 16:46:01 · 457 阅读 · 0 评论 -
Iterator
迭代对于我们搞Java的来说绝对不陌生。我们常常使用JDK提供的迭代接口进行Java集合的迭代。Iterator iterator = list.iterator(); while(iterator.hasNext()){ String string = iterator.next(); //do something转载 2016-05-23 13:44:11 · 427 阅读 · 0 评论 -
ThreadLocal内存泄露(下)
一、介绍很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路;ThreadLocal的目的是为了解决多线程访问资源时的共享问题。如果你也这样认为的,那现在给你10秒钟清空之前对ThreadLocal的错误的认知。看看JDK中的源码是怎么写的:This class provides thread-local variables. These原创 2017-01-02 20:57:49 · 493 阅读 · 0 评论