java
舒大飞
南朝四百八十寺,多少楼台烟雨中
展开
-
搞清抽象类和接口的区别
尊重原创,转载请注明出处。 抽象类与接口是Java中很容易被混淆的内容,他们表面看起来很相似,所以可能会有人把他们当一个东西去使用,其实他们表面使用起来就有区别,如果是从设计角度去看他们的本质,更是有着根本的区别。 首先我们看看抽象类与接口之间表面上的区别,那就是抽象类里面包含常量,已实现的方法和抽象函数,而接口里面只能是包含一个一个接口函数,而原创 2016-04-12 22:47:30 · 439 阅读 · 0 评论 -
Java虚拟机探究之--垃圾回收机制
Java有自己的一套垃圾回收机制,为开发者省去了一大笔精力,这也是java相较于C++的一个很大的不同,探究一下垃圾回收机制是如何工作的和GC算法的原理。 一般来说清除垃圾要做一下两步,一.先检测垃圾 二.清除垃圾 先来说说如何检测垃圾,检测垃圾的常用算法有以下几种: 一.可达性分析算法 以根集(GC Root)对象为起始点进行搜索,原创 2016-04-18 11:40:30 · 2443 阅读 · 0 评论 -
Java类的加载过程
编译:即javac的过程,即把.java文件编译成.class文件,即编译成字节码文件,同时做一些类型以及格式的检查。 类只有在要运行的时候才会被加载进JVM,即编译后只有需要到这个类的时候才会把他加载进JVM运行,这种动态加载是依靠反射来实现的,一般来说一个class只会被加载一次,下一次就会从jvm的class缓存中获取,不会再去文件系统中去获取class文件了。原创 2016-05-06 12:50:49 · 10271 阅读 · 0 评论 -
并发容器之ConcurrentHashMap
JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能。因为同步容器将所有对容器状态的访问都串行化了,这样保证了线程的安全性,所以这种方法的代价就是严重降低了并发性,当多个线程竞争容器时,吞吐量严重降低。因此Java5.0开始针对多线程并发访问设计,提供了并发性能较好的并发容器,引入了java.util.concurrent包。与Vecto转载 2016-05-08 16:51:26 · 469 阅读 · 0 评论 -
线程池的原理及实现
1、线程池简介: 多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间。 如果:T1 + T3 远大于 T2,则可以采用线程池,以提高服务器性能。 一个线程转载 2016-05-08 16:10:54 · 749 阅读 · 0 评论 -
Java并发编程之volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们转载 2016-05-08 17:34:43 · 387 阅读 · 0 评论 -
Java NIO使用及原理之--选择器Seclector
转载自:李会军•宁静致远在上一篇文章中介绍了关于缓冲区的一些细节内容,现在终于可以进入NIO中最有意思的部分非阻塞I/O。通常在进行同步I/O操作时,如果读取数据,代码会阻塞直至有 可供读取的数据。同样,写入调用将会阻塞直至数据能够写入。传统的Server/Client模式会基于TPR(Thread per Request),服务器会为每个客户端请求建立一个线程,由该线程单独负转载 2016-05-09 19:06:02 · 1841 阅读 · 0 评论 -
Java NIO使用及原理之--缓冲器buffer(2)
转载自:李会军•宁静致远在上一篇文章中介绍了缓冲区内部对于状态变化的跟踪机制,而对于NIO中缓冲区来说,还有很多的内容值的学习,如缓冲区的分片与数据共享,只读缓冲区等。在本文中我们来看一下缓冲区一些更细节的内容。缓冲区的分配在前面的几个例子中,我们已经看过了,在创建一个缓冲区对象时,会调用静态方法allocate()来指定缓冲区的容量,其实调用 allocate()转载 2016-05-09 18:53:24 · 1159 阅读 · 0 评论 -
Java NIO使用及原理之--缓冲器buffer(1)
转载自:李会军•宁静致远在第一篇中,我们介绍了NIO中的两个核心对象:缓冲区和通道,在谈到缓冲区时,我们说缓冲区对象本质上是一个数组,但它其实是一个特殊的数组,缓冲区对象内置了一些机制,能够跟踪和记录缓冲区的状态变化情况,如果我们使用get()方法从缓冲区获取数据或者使用put()方法把数据写入缓冲区,都会引起缓冲区状态的变化。本文为NIO使用及原理分析的第二篇,将会分析NIO中的转载 2016-05-09 18:50:36 · 1954 阅读 · 1 评论 -
Reactor反应器模式
概述Java NIO非堵塞技术实际是采取反应器模式,或者说是观察者(observer)模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。同步和异步区别:有无通知(是否轮询)堵塞和非堵塞区别:操作结果是否等待(是否马上有返回值),只是设计方式的不同NIO 有一个主要的类Selector,这个类似转载 2016-05-09 19:20:17 · 431 阅读 · 0 评论 -
Java NIO使用及原理之--总概述
转载自:李会军•宁静致远最近由于工作关系要做一些Java方面的开发,其中最重要的一块就是Java NIO(New I/O),尽管很早以前了解过一些,但并没有认真去看过它的实现原理,也没有机会在工作中使用,这次也好重新研究一下,顺便写点东西,就当是自己学习 Java NIO的笔记了。本文为NIO使用及原理分析的第一篇,将会介绍NIO中几个重要的概念。在Java1.4之前的转载 2016-05-09 18:48:26 · 461 阅读 · 0 评论 -
java中一些容器底层的数据结构解析
先来看一个java里一些主要容器的继承图: 然后分别解析一下上面几种容器底层的数据结构以及一些实现:1.ArrayList(非线程安全的)底层的数据结构其实就是数组,但是它比数组优秀的地方在于他是动态的,即不必像数组那样固定大小,那么他是如何实现这种数据结构是数组,但是给我们看起来确实不固定大小的呢?ArrayList 是通过将底层 Object 数组复制的原创 2016-05-08 23:52:34 · 8914 阅读 · 0 评论 -
java中的注解
注解目前非常的流行,很多主流框架都支持注解,而且自己编写代码的时候也会尽量的去用注解,一时方便,而是代码更加简洁。 注解的语法比较简单,除了@符号的使用之外,它基本与Java固有语法一致。Java SE5内置了三种标准注解: @Override,表示当前的方法定义将覆盖超类中的方法。 @Deprecated,使用了注解为它的元素编译器将发出警告,因为转载 2016-08-14 19:08:32 · 362 阅读 · 0 评论 -
ClassLoader的工作原理(Java中和Andriod中的一些区别)
早期使用过 Eclipse 等 Java 编写的软件的同学可能比较熟悉,Eclipse 可以加载许多第三方的插件(或者叫扩展),这就是动态加载。这些插件大多是一些 Jar 包,而使用插件其实就是动态加载 Jar 包里的 Class 进行工作。这其实非常好理解,Java 代码都是写在 Class 里面的,程序运行在虚拟机上时,虚拟机需要把需要的 Class 加载进来才能创建实例对象并工作,而完成这一转载 2016-12-14 11:18:17 · 1407 阅读 · 0 评论 -
Serializable与Parcelable
我们在传输数据的时候经常会碰到想传输对象或者一些除了基础类型以外的类型,如果我们想直接通过intent传输的话是无法成功的,我们必须先给这个对象进行序列化之后,他才能传输,然后接受方通过反序列化把他接收并解析出来,像前面说到的进程间的通信,数据传输都必须实现序列化才能被传输。 对象的序列化Java里面一般用的是 Serializable接口,Serializab原创 2016-04-21 15:45:48 · 565 阅读 · 0 评论 -
String,StringBuffer与StringBulider三者的区别
我们都只到String和StringBuffer的区别,即String是不可拓展的,即String如果要实现A字符串+B字符串的效果,则不能直接把B接在A后面,而必须新开一个C,然后把A+B放进C.而StringBuffer是可拓展的,如果A是StringBuffer要实现A+B的效果只要把B放进A后面就行了(append())。那么为什么他们有这样的区别呢,还是来看看源码就知道了。//Str原创 2016-05-27 23:28:21 · 1083 阅读 · 0 评论 -
==和equal的区别
java中的数据类型可以分为两类: 1.基础数据类型:如int,long,byte,char,double,float,double等 2.复合数据类型:也就是类 对于基础数据类型,我们可以利用“==”对他们进行比较,而对于复合数据类型,如果我们依然用“==”对他们进行对比则达不到我们想要的那种对比效果,“==”的对比对于复合类型的数据来说原创 2016-04-25 15:51:53 · 972 阅读 · 0 评论 -
内存泄露之--JDK6里的subString()方法
在Java中我们无须关心内存的释放,JVM提供了内存管理机制,有垃圾回收器帮助回收不需要的对象。但实际中一些不当的使用仍然会导致一系列的内存问题,常见的就是内存泄漏和内存溢出内存溢出(out of memory ) :通俗的说就是内存不够用了,比如在一个无限循环中不断创建一个大的对象,很快就会引发内存溢出。内存泄漏(leak of memory) :是指为一个对象分配内存之后,在对转载 2016-04-25 15:08:40 · 2270 阅读 · 0 评论 -
hashCode()方法的作用
hashCode()方法和equal()方法的作用其实一样,在java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢? 因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率原创 2016-04-25 17:07:15 · 6604 阅读 · 4 评论 -
HashMap与Hashtable的区别
http://blog.csdn.net/java2000_net/archive/2008/06/05/2512510.aspx 我们先看2个类的定义[java] view plain copypublic class Hashtable extends Dictionary impleme转载 2016-04-25 17:51:30 · 363 阅读 · 0 评论 -
强引用,软引用,弱引用,虚引用
我们开发中如果没有做性能上的优化则经常会遇到OOM的情况,而适当的使用软引用和弱引用则可以一定程度上解决一些OOM的问题。 下面我们先来看看java中的四种引用: 1.强引用(StrongReference):我们平常的A a=new A();就是属于强引用,强引用的情况下,无论如何都不会被JVM回收内存,然后这种强引用多了之后,当内存满了之后,显然会出现O原创 2016-05-01 17:14:32 · 311 阅读 · 0 评论 -
深入理解java类加载器ClassLoader
类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过转载 2016-05-02 18:31:55 · 1217 阅读 · 0 评论 -
JVM虚拟机探究之--内存调优
JVM调优主要是针对内存管理方面的调优,包括控制各个代的大小,GC策略。由于GC开始垃圾回收时会挂起应用线程,严重影响了性能,调优的目是为了尽量降低GC所导致的应用线程暂停时间、 减少Full GC次数。 代大小调优最关键参数:-Xms、 -Xmx 、-Xmn 、-XX:SurvivorRatio、-XX:MaxTenuringThreshold、-XX:PermSi转载 2016-04-18 17:02:56 · 432 阅读 · 0 评论 -
利用wait()和notify()实现生产者与消费者问题
生产者与消费者问题是并发编程里面的经典问题,下面用wait()和notify()来实现消费者线程和生产者线程的并发执行。 说之前先讲几个概念: wait()与sleep()的区别: 1.首先sleep()是Thread()类的方法,而wait()是Object类的方法,包括notify(),notifyAll()都是Object类的方法 2.原创 2016-05-13 11:42:53 · 8345 阅读 · 3 评论 -
内部类的作用
一.定义放在一个类的内部的类我们就叫内部类。二、 作用1.内部类可以很好的实现隐藏 一般的非内部类,是不允许有 private 与protected权限的,但内部类可以2.内部类拥有外围类的所有元素的访问权限3.可是实现多重继承4.可以避免修改接口而实现同一个类中两种同名方法的调用。三、 举例说明转载 2016-05-03 16:02:40 · 341 阅读 · 0 评论 -
面向对象编程的六大原则
要让自己写的代码有质量,特别是对于面向对象编程的话,代码以及框架的是否合理直接决定了你的程序是否可以良好的扩展和壮大,这在软件工程中也多少学过一点,简单来说就是要做到低耦合高内聚,经过编程人员多年的总结,良好的框架设计或者说编码风格应当做到以下六个原则,当然这六个原则要在实际应用中去体会才能更好的理解。 1.单一职责原则 这是优化代码的第一步,当我们设计程序时,某一功原创 2016-05-15 01:17:10 · 4080 阅读 · 0 评论 -
Java动态绑定机制原理分析
在Java方法调用的过程中,JVM是如何知道调用的是哪个类的方法源代码? 这里面到底有什么内幕呢? 这篇文章我们就将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) 。 ★ 静态绑定机制Java代码 //被调用的类 package hr.test; class Father{转载 2016-05-27 18:38:49 · 1930 阅读 · 0 评论 -
Java虚拟机探究之--JVM结构与内存模型
JVM,即Java虚拟机,是Java程序能跨平台无障碍运行的一个基础,我觉得更好的理解Java虚拟机有助于更加深刻的理解Java语言,虽然Java自身为我们提供了一套比较成熟完善的机制,包括垃圾回收机制,这让我们在开发中十分方便,甚至会忘记内存回收这件事,但是更深入的了解java的底层还是必不可少的。下面记录一下JVM的结构,之后也会分享更多关于JVM的学习。 收到JVM的结构原创 2016-04-18 10:58:10 · 2569 阅读 · 0 评论 -
关于多态以及动态绑定
数据抽象,继承,多态是java的三大特征,可见理解多态对于学习java的重要性,多态不但能够改善代码的组织结构和可读性,还能够让程序更加的具有可拓展性。 理解一下什么是多态。多态就是同一事物的多种不同形态,简单点来说就是:“一个接口,多种实现”。举个例子:体育课上体育老师只要喊一句:“开始活动”,则 打篮球的就开始打篮球,踢足球的就开始踢足球,体育老师不用对打篮球的喊“开始原创 2016-05-03 14:59:07 · 5403 阅读 · 2 评论 -
关于Java中枚举Enum的深入剖析
在编程语言中我们,都会接触到枚举类型,通常我们进行有穷的列举来实现一些限定。Java也不例外。Java中的枚举类型为Enum,本文将对枚举进行一些比较深入的剖析。什么是EnumEnum是自Java 5 引入的特性,用来方便Java开发者实现枚举应用。一个简单的Enum使用如下。123456789101112// Col转载 2017-01-06 01:28:16 · 589 阅读 · 0 评论