
Java
文章平均质量分 84
BridgeGeorge
脚踏实地,展望未来
展开
-
Java 枚举深入分析
介绍Java 枚举在JDK1.5版本中被引入,枚举用于将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。枚举是一种非常有用的功能。示例Color.java public enum Color{ RED,GREEN,BLUE}编译Color.java 得到 Color.class,利用Java 反编译 命令javap Color.cl原创 2016-10-31 09:31:25 · 1327 阅读 · 0 评论 -
Java 并发编程深入学习——CAS操作
CAS简介 所谓CAS(Compare And Swap)即比较并交换。在 Intel 处理器中,比较并交换通过指令的 cmpxchg 系列实现。CAS有三个操作数: 内存位置(V) 预期原值(A) 新值(B) 如果内存位置V的值与预期A原值相匹配,那么处理器会自动将该位置值更新为新值B。否则,处理器不做任何操作。 无论哪种情况,它都会在 CAS 指令之前返回该位置的值。原创 2016-11-21 18:43:54 · 750 阅读 · 0 评论 -
Java 并发编程深入学习——线程池及其实现原理
Java线程池介绍 线程池,从字面含义来看,是指管理一组同构工作线程的资源池。线程池是与工作队列(work Queue)密切相关的,其中工作队列中保存了所有等待执行的任务。工作者线程(Work Thread)的任务很简单:从工作队列中获取一个任务,执行任务,然后返回线程池并等待下一个任务。使用线程池的优势 在线程池中执行任务比为每个任务分配一个线程优势更多。通过重用现有的线程而不是原创 2016-09-07 23:26:16 · 2262 阅读 · 0 评论 -
深入理解Java内部类
内部类介绍Java内部类是一个非常重要的概念,但是在日常工作中貌似并不是十分常用,即使用到可能大多数人也没有去深入归纳总结,对于其原理也并不甚了解。因此有必要重新认识并深入理解内部类的概念。在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。内部类分类内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。1.成员内部类成员内原创 2016-09-23 13:16:38 · 643 阅读 · 0 评论 -
Java并发编程深入学习——CountDownLatch、CyclicBarrier和Semaphore
闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态。闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当到达结束状态时,这扇门会打开并允许所有的线程通过。当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。原创 2016-09-18 15:26:16 · 1032 阅读 · 0 评论 -
Java并发编程深入学习——生产者-消费者模式多种实现方式
生产者消费者模型是经典的同步问题。问题大致如下:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界资源(即队列)的占用权。因为生产者如果不释放对临界资源的占用权,那么消费者就无法消费队列中的商品,就不会让队列有空间,那么生产者就会一直无限等待下去。原创 2016-09-18 09:12:40 · 914 阅读 · 0 评论 -
Java虚拟机(三)——类加载机制
介绍 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被Java虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 类从被加载到虚拟内存中开始,到卸载内存为止,它的整个生命周期包括了:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使原创 2016-08-25 21:48:39 · 1222 阅读 · 0 评论 -
Java 并发编程深入学习(五)——死锁
死锁介绍 在Java中,一个对象可以有synchronized方法或别的加锁机制来防止别的任务在互斥还没有释放的时候就访问这个对象。线程是可以阻塞的,某个线程在等待另一个线程,而后者又在等待别的线程,这样一直下去,直到这个链条上的线程又在等待第一个线程释放锁。这就造成了线程之间相互等待的连续循环,没有哪个线程能够继续,这被称之为死锁。产生条件 虽然进程在运行过程中,可能发生死锁,但原创 2016-09-05 10:35:12 · 663 阅读 · 0 评论 -
Java并发编程深入学习—— sleep和wait的区别
概念sleep()方法:该方法是属于Thread类中的。wait()方法:属于Object类,属于Object类的9大方法之一。以下是JDK 1.6官方文档中对于wait方法和sleep方法的说明。waitpublic final void wait() throws InterruptedException在其他线程调用此对象的 notify() 方法或原创 2015-08-19 17:12:43 · 648 阅读 · 0 评论 -
Java 深入理解排序接口Comparable和比较器接口Comparator
ComparableComparable 是排序接口。若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。 Comparable 接口仅仅只包括一个原创 2017-01-06 18:48:03 · 2291 阅读 · 1 评论 -
Android性能优化—— Apk瘦身的实现
为了能够减小APK的大小,首先需要知道APK由哪些部分构成,然后针对每个部分做相应的优化工作,下图是一个APK解压后的文件结构:原创 2017-05-16 19:21:58 · 870 阅读 · 0 评论 -
Java并发编程深入学习—— synchronized
synchronized介绍synchronized是Java中的关键字,是一种同步锁。 它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象; 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象; 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是原创 2017-09-27 19:46:49 · 435 阅读 · 0 评论 -
Java并发编程深入学习——Lock锁
Lock锁介绍在Java 5.0之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile。Java 5.0 增加了一种新的机制:ReentrantLock.它并不是一种替代内置加锁的方法,而是当内置加锁机制不适用时,作为一种可选择的高级功能。Lock接口Lock接口位于java.util.concurrent.locks包中,它定义了一组抽象的加锁操作。public原创 2017-09-27 19:34:19 · 517 阅读 · 0 评论 -
Java 并发编程深入学习(一)——实现多线程的方式
介绍实现方式继承Thread类class MyThread extends Thread{ private int ticket = 5; public void run(){ for (int i=0;i10;i++) { if(ticket > 0){原创 2016-08-30 12:51:04 · 1191 阅读 · 0 评论 -
Java虚拟机(九)——多态性理解
介绍 对于面向对象的三大特征,很多人可以毫不犹豫地讲出来,封装,继承,多态。封装,和继承自不必说,而对于多态的理解,可能对于不少人来说,总好像理解了,但是好像又有点迷惑,这篇文章着重介绍这个特性。 多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。这种技术称为动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类原创 2017-09-27 17:45:45 · 493 阅读 · 0 评论 -
Java 集合框架源码分析(八)—— ConcurrentHashMap
概述ConcurrentHashMap 是Java 并发框架中很重要的一个类,是实现支持高并发、高吞吐量的线程安全的HashMap。当然不能直接对整个hashtable加锁,所以在ConcurrentHashMap中,数据的组织结构和HashMap有所区别。与HashTable区别下面这幅图直观展示了ConcurrentHashMap与HashTable的区别,可以看到HashTable是对整个Ha原创 2017-05-16 12:00:36 · 845 阅读 · 0 评论 -
Java 集合框架源码分析(三)——HashMap
HashMap简介HashMap是基于哈希表实现的,每一个元素都是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阈值)时,同样会自动增长。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能原创 2017-09-22 17:19:34 · 631 阅读 · 0 评论 -
算法系列--Two Sum
继续算法系列。今天再看一道leetcode(www.leetcode.com)的题目。问题描述原文 Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the原创 2015-09-13 23:34:12 · 1882 阅读 · 0 评论 -
Java虚拟机(九)——Java语法糖
介绍在Java 编程中,做循环操作莫过于使用while或者for了。 比如int i=0;while(i10){ //do something... i++; }再比如int []attr={1,2,3,4,5,6};for(int i=0;iattr.length;i++){ //do sth...} 当然 还有 do while原创 2017-05-19 14:58:02 · 583 阅读 · 0 评论 -
Java 并发编程深入学习——CopyOnWrite容器使用和原理分析
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。原创 2017-05-18 17:56:42 · 1035 阅读 · 0 评论 -
Java 异常捕获深入分析
java中的 try、catch、finally及finally执行顺序详解: 1、首相简单介绍一下异常以及异常的运行情况:在Java中异常的继承主要有两个: Error和Exception 这两个,而Error就是jvm出现错误,以及系统奔溃等现象这些错误没办法通过程序来处理,所以在程序中不能使用catch来捕捉处理这类的异常。对于Exception 又可以分为checkedExcep原创 2017-04-26 10:57:37 · 597 阅读 · 0 评论 -
Java 并发编程深入学习——ThreadLocal 原理分析
介绍ThreadLocal 是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有在指定线程中可以获取到存储的数据,对于其他线程来说则无法获取到数据。应用场景在日常开发中用到ThreadLocal的地方较少,但是在某些特殊的场景下,通过ThreadLocal 可以轻松地实现一些看起来很复杂的功能,这一点在Android的源码中也有所体现,比如Looper,ActivityT原创 2017-04-25 18:08:00 · 600 阅读 · 0 评论 -
Java虚拟机(八)——Java内存模型
Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。为了获得较好的执行效能,Java内存模型并没有限制执行引擎使用处理器的特定寄存器或缓存来和主内存进行交互,也没有限制即时编译器调整代码执行顺序这类权利。原创 2016-09-02 16:59:56 · 1018 阅读 · 1 评论 -
Java虚拟机(二)——Java堆内存划分
堆内存介绍 在《Java虚拟机(一)——Java内存区域划分》一文中介绍了Java 虚拟机 内存划分的内容,其中讲到堆内存(Heap)。对于大多数应用来说,Java堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块。此内存区域的唯一目的就是存在对象实例,几乎所有的对象实例都在这里分配内存。这个区域也是Java 垃圾收集器管理的主要区域,因此很多时候也被称为”GC堆”。所以堆内原创 2016-08-23 17:21:37 · 4945 阅读 · 0 评论 -
字符编码详解——彻底理解掌握编码知识,“乱码”不复存在
文章出处 http://polaris.blog.51cto.com/1146394/377468每一个程序员都不可避免的遇到字符编码的问题,特别是做Web开发的程序员,“乱码问题”一直是让人头疼的问题,也许您已经很少遇到“乱码”问题,然而,对解决乱码的方法的内在原理,您是否明白?本人作为一个程序员,在字符编码方面同样遇到不少问题,而且一直对各种编码懵懵懂懂、不清不楚;在工作中也曾经遇到一个很烦人的转载 2016-07-25 16:42:58 · 870 阅读 · 0 评论 -
Java中String ,StringBuffer和StringBuilder的区别
Java中的与字符串操作相关的三个类String,StringBuffer和StringBuilder非常重要,特别做下总结。String 字符串常量 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能原创 2015-10-26 22:39:42 · 567 阅读 · 2 评论 -
深入理解Java中的堆和栈
我想这篇足以让大家很清晰理解Java的栈和堆栈的区别。下面的是我收集了好多网友的资料加以整理的。Java 中的堆和栈Java把内存划分成两种:一种是栈内存,一种是堆内存。 1.栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。 2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在转载 2015-10-26 23:40:17 · 3583 阅读 · 0 评论 -
StringBuffer清空操作效率分析
Collection和Map都有相应的clear操作,但是StringBuffer和StringBuilder没有,那么如何复用呢?查看JDK文档,我们知道有两种方式:StringBuffer sb=new StringBuffer();sb.setLength(0);sb.delete(0, sb.length());我们观察下他们的区别:他们的实现都是在AbstractStringBuild原创 2015-10-26 22:14:46 · 14991 阅读 · 0 评论 -
深入理解Java接口和抽象类
对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。抽象类 在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:abst转载 2015-10-26 23:00:42 · 539 阅读 · 0 评论 -
算法系列-Remove Element
对于数组的操作是算法题目中经常会出现的类型,这次来看一个从数组中移除元素的问题。 问题描述原文: Given an array and a value, remove all instances of that value in place and return the new length. The order of elements can be changed. It does原创 2015-09-17 19:43:25 · 595 阅读 · 0 评论 -
算法系列——旋转图像(Rotate Image)
今天仍然来分析一个与数组操作相关的算法,是关于二维数组旋转问题的。问题描述原文 You are given an n × n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place? 大意:给一个 n *原创 2015-09-17 16:44:05 · 1231 阅读 · 0 评论 -
算法系列——跳台阶(Climbing Stairs)
爬楼梯问题是一个经典的递归斐波那契数列问题。这个问题也见于leetcode (www.leetcode.com)网站中。今天来说说它。问题描述原文 You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb 1 or 2 steps. In how原创 2015-09-14 23:37:21 · 1046 阅读 · 0 评论 -
算法系列——整数反转(Reverse Integer)
问题描述原文描述: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return -321 Have you thought about this? Here are some good questions to ask before coding. Bonu原创 2015-09-14 19:33:06 · 844 阅读 · 0 评论 -
Java复习笔记--Java中==与equal的区别
值类型是存储在内存中的堆栈(以后简称栈),而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。 ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。 ==比较的是2个对象的地址,而equals比较的是2个对象的内容。转载 2015-08-01 19:37:54 · 533 阅读 · 0 评论 -
Java 集合框架源码分析(五)——Vector
Vector介绍Vector也是基于数组实现的,是一个动态数组,其容量能自动增长。 Vector是JDK1.0引入了,它的很多实现方法都加入了同步语句,因此是线程安全的(其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全),可以用于多线程环境。 Vector实现了Serializable接口,可以被序列化,Cloneable接口,能被克隆,实现了RandomAccess接口,支原创 2016-08-15 16:01:01 · 707 阅读 · 0 评论 -
深入理解Java参数传递
本篇探讨Java中一个争论已久的问题,Java的参数是值传递还是引用传递? 熟悉C的程序员都用过指针,对指针可谓爱之深恨之切。指针是指向一块内存地址的内存数据(有些拗口),也就是说指针本身是一个占用4字节内存的 int(32 位系统内),而这个int值恰恰又是另一块内存的地址。比如”hello”这个字串,存放在@0x0000F000这个地址到 @0x0000F005这段内存区域内(包括0x00的结转载 2015-10-27 00:27:14 · 579 阅读 · 0 评论 -
Java 集合框架源码分析(六)——HashTable
HashTable经常和HashMap拿来做对比。HashTable同样是基于哈希表实现的。原创 2016-08-18 09:32:46 · 905 阅读 · 0 评论 -
Java虚拟机(七)——理解四种引用类型
介绍 如果一个内存中的对象没有任何引用的话,就说明这个对象已经不再被使用了,从而可以成为被垃圾回收的候选。不过由于垃圾回收器的运行时间不确定,可被垃圾回收的对象的实际被回收时间是不确定的。对于一个对象来说,只要有引用的存在,它就会一直存在于内存中。如果这样的对象越来越多,超出了JVM中的内存总数,JVM就会抛出OutOfMemory错误。虽然垃圾回收的具体运行是由JVM来控制的,但是开发人员原创 2016-09-02 00:03:12 · 2609 阅读 · 1 评论 -
Java 集合框架源码分析(七)——HashSet
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例,对于HashMap的分析可以参见另外一篇博文Java 集合框架源码分析(三)——HashMap )支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。此类为基本操作提供了稳定性能,这些基本操作包括 add、remove、contains 和 size,假定哈希函数将这些元素正确地分布在桶中。todo原创 2016-08-23 15:20:13 · 642 阅读 · 0 评论 -
Java虚拟机(六)——内存溢出和内存泄露分析
内存溢出和内存泄露内存溢出:内存泄露:内存溢出场景内存泄露场景内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。Java内存泄漏的根本原因是什么呢?长生命周期的对象持有短生命周期对象的引用就很原创 2016-08-31 23:44:08 · 1780 阅读 · 0 评论