
java基础
文章平均质量分 75
iteye_8208
这个作者很懒,什么都没留下…
展开
-
Java并发编程: 使用CountDownLatch协调子线程
1. CountDownLatch工具类介绍 CountDownLatch是一个同步工具类,它允许一个或多个线程处于等待状态直到在其它线程中运行的一组操作完成为止。CountDownLatch用一个给定的计数来实现初始化。Await方法会一直处于阻塞状态,直到countDown方法调用而使当前计数达到零。当计数为零之后,所有处于等待的线程将被释放,await的任何后续调用将立即返回。这种现象只出...原创 2017-02-13 12:39:11 · 155 阅读 · 0 评论 -
移位操作符
移位操作符:<<、>>和>>>。移位长度总是介于0 到31 之间,如果左操作数是long 类型的,则介于 0 到63 之间。 移位长度总是对32取余得到,如果左操作数是long 类型的,则对64 取余。 如果试图对一个int 数值移位32 位,或者是对一个long 数值移位64 位,都只能返回这个数值自身的值。 ...原创 2016-10-07 13:19:05 · 154 阅读 · 0 评论 -
复合赋值操作符
复合赋值操作符包括*=、/=、%=、+=、-=、<<=、>>=、>>>=、 &=、^=和|= 在运算时提升到int, 赋值时它们可能会自动地执行窄化原始类型转换。 short i = -1; while (i != 0) { i >>>= 1; } 死循环解析:(sh...原创 2016-10-07 13:16:20 · 208 阅读 · 0 评论 -
String.intern 示例
//字符串常量池 String str1 = "str"; String str2 = "ing"; String str3 = "str" + "ing"; String str4 = str1 + str2; System.out.println(str3 == str4); //false String str5 = "string"; Sy...原创 2016-10-07 13:15:07 · 104 阅读 · 0 评论 -
"失效"的private修饰符
在Java编程中,使用private关键字修饰了某个成员,只有这个成员所在的类和这个类的方法可以使用,其他的类都无法访问到这个private成员。上面描述了private修饰符的基本职能,今天来研究一下private功能失效的情况。Java内部类在Java中相信很多人都用过内部类,Java允许在一个类里面定义另一个类,类里面的类就是内部类,也叫做嵌套类。一个简单的内部类实现可以如下...原创 2016-10-06 13:13:04 · 147 阅读 · 0 评论 -
Java中的堆和栈的区别
当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先出(Last In First Out)的顺序的数据结构,这就是java.util.Stack。这种情况下,不免让很多人更加费解前面的问题。事实上,堆和栈都是内存中的一部分,有着不同的作用,而且一...原创 2016-10-06 13:12:48 · 87 阅读 · 0 评论 -
理解Java中的ThreadLocal
提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和认识,希望让大家理解ThreadLocal更加透彻一些。ThreadLocal是什么 ThreadLocal是一个关于创建线程局部变量的类。通常情况下,我们创建的变量是可以被任何一...原创 2016-10-06 13:10:35 · 90 阅读 · 0 评论 -
详解Java中的注解
在Java中,注解(Annotation)引入始于Java5,用来描述Java代码的元信息,通常情况下注解不会直接影响代码的执行,尽管有些注解可以用来做到影响代码执行。注解可以做什么Java中的注解通常扮演以下角色编译器指令构建时指令运行时指令其中Java内置了三种编译器指令,本文后面部分会重点介绍Java注解可以应用在构建时,即当你构建你的项目时。构建过...原创 2016-10-05 17:38:55 · 88 阅读 · 0 评论 -
Java中的字符串常量池
Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式。然而这两种实现其实存在着一些性能和内存占用的差别。这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,...原创 2016-10-04 13:44:20 · 84 阅读 · 0 评论 -
java字符串的拼接
不可变的String对象在Java中,String对象是不可变的(Immutable)。在代码中,可以创建多个某一个String对象的别名。但是这些别名都是的引用是相同的。比如s1和s2都是”droidyue.com”对象的别名,别名保存着到真实对象的引用。所以s1 = s2fileos:false123String s1 = "droidyue....原创 2016-10-04 13:02:30 · 155 阅读 · 0 评论 -
Java中的自动装箱与拆箱
自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象。自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接。如果你在Java1.5下进行过编程的话,你一定不会陌生这一点,你不能直接地向集合(Collections)中放入原始类型值,因为集合只接收对象。通常这种情况下你的做法是,将这些原始类型的值转换成对象...原创 2016-10-04 12:46:26 · 104 阅读 · 0 评论 -
Java多线程理解:线程安全的集合对象
1、概念介绍线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,多线程先后更改数据会产生数据不一致或者数据污染的情况。一般使用synchronized关键字加锁同步控制,来解决线程不安全问题。2、线程安全的集合对象A...原创 2016-10-04 01:35:45 · 255 阅读 · 0 评论 -
Java内存溢出和内存泄露
一、为什么要了解内存泄露和内存溢出? 1、内存泄露一般是代码设计存在缺陷导致的,通过了解内存泄露的场景,可以避免不必要的内存溢出和提高自己的代码编写水平;2、通过了解内存溢出的几种常见情况,可以在出现内存溢出的时候快速的定位问题的位置,缩短解决故障的时间。 二、基本概念 内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配...原创 2016-10-10 14:05:36 · 134 阅读 · 0 评论 -
Java 内存模型及GC原理
一个优秀Java程序员,必须了解Java内存模型、GC工作原理,以及如何优化GC的性能、与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统、实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能。本文将从JVM内存模型、GC工作原理,以及GC的几个关键问题进行探讨,从GC角度提高Java程序的性能。 一、Java内存模型 按照官方的说法:Java ...原创 2016-10-10 14:09:29 · 88 阅读 · 0 评论 -
JVM 基础知识
一、基础概念数据类型 Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte、short、int、long、char、float、double、Boolean、returnAdd...原创 2016-10-10 14:22:41 · 105 阅读 · 0 评论 -
Java SE7新特性之泛型实例创建时的类型推断
只要编译器从上下文中能够推断出类型参数,你就可以使用一个空的类型参数集合 (<>)代替调用一个泛型类的构造器所需要的类型参数。 这对尖括号通常叫做 diamond.举个例子, 考虑下面的变量声明:Map<String, List<String>> myMap = new HashMap<String, List<String>>...原创 2017-02-05 21:47:43 · 176 阅读 · 0 评论 -
Java的可见性和原子性
1. 工作内存和主内存2. 可见性和共享变量3. 约束4. 共享变量可见性的原理4.1 可见性的步骤4.2 保证可见性的必要条件synchronized实现可见性5.1 synchronized实现的内容5.2 JMM关于synchronized 的规定5.3 synchronized互斥代码的过程6 volatile实现可见性...原创 2016-12-12 15:19:28 · 176 阅读 · 0 评论 -
Java实现单例的难点
有简单又高效的方法可以实现单例模式,但没有一种方式能在任何情况下都确保单例的完整性。单例模式是指某个类只被实例化一次,用来表示全局或系统范围的组件。单例模式常用于日志记录、工厂、窗口管理器和平台组件管理等。我认为要尽量避免使用单例模式,因为一旦实现就很难改变或重载,而且会造成编写测试用例困难、代码结构糟糕等问题。另外,下面文章中的单例模式是不安全的。人们花大量的精力研究怎样更好地实现单...原创 2016-12-10 08:50:00 · 127 阅读 · 0 评论 -
threadLocal遇上线程池导致局部变量变化
这两天一直在查无线app一个诡异的问题,表象是stg的接口返回数据,和线上接口的返回数据不一致。 1、初步判断:有缓存,查看代码后发现缓存时间直邮6分钟,而且同一个接口,其他调用方的返回数据,stg和线上是保持一致的。 2、确认版本后,把线上版本和stg环境的版本号,进行多次check,发现版本是一致的。 3、线上和stg接口的返回数据,来源于我依赖的接口,现在接口stg...原创 2016-11-26 16:16:20 · 229 阅读 · 0 评论 -
java -classpath
jar cvf xx.jar ./* Java执行jar包中的class 命令为: java -classpath xxx.jar package.HelloWorld java命令引入jar时可以-cp参数,但时-cp不能用通配符(多个jar时什么烦要一个个写,不能*.jar),面通常的jar都在同一目录,且多于1个。前些日子找到(发现)-Dj...原创 2016-11-15 15:10:41 · 97 阅读 · 0 评论 -
一个Java对象到底占用多大内存?
一个Java对象到底占用多大内存? 最近在读《深入理解Java虚拟机》,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存?在网上搜到了一篇博客讲的非常好:http://yueyemaitian.iteye.com/blog/2033046,里面提供的这个类也非常实用:import java.l...原创 2016-11-12 20:26:21 · 103 阅读 · 0 评论 -
Java:Double Brace Initialization
在我刚刚接触现在这个产品的时候,我就在我们的代码中接触到了对Double Brace Initialization的使用。那段代码用来初始化一个集合:1 final Set<String> exclusions = new HashSet<String>() {{2 add(‘Alice’);3 add(‘Bob’);4 ...原创 2016-10-18 12:27:23 · 267 阅读 · 0 评论 -
Google Java编程风格指南
作者:Hawstein出处:http://hawstein.com/posts/google-java-style.html声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。目录前言源文件基础源文件结构格式命名约定编程实践Javadoc后记前言...原创 2016-10-17 21:50:09 · 85 阅读 · 0 评论 -
java语言编码规范(华为)
Table of Contents 目录1.范围2.规范性引用文件3.术语和定义4.排版规范4.1.规则4.2.建议5.注释规范5.1.规则5.2.建议6.命名规范6.1.规则6.2.建议7.编码规范7.1.规则7.2.建议8.JTEST规范8.1.规则8.2.建议 1.范围本规范规定了使用Java语言编...原创 2016-10-14 12:05:59 · 3949 阅读 · 0 评论 -
压栈思想计算Java运算表达式
栈的规则是先进后出。利用压栈的思想来计算四则运算表达式是这样的:我们给定两个栈,一个用来存放数字、一个用来存放对应的操作符。假定我们有一个给定的四则运算表达式a+b+c/d*(e+f)-d*a,那我们先把这个表达式拆分成一个个的数字或者是运算符、或者就是括号了。然后我们从左至右遍历每一个元素,遍历过程中遵循步骤和原则如下: (1)遇到数字则直接压到数字栈顶。 ...原创 2016-10-13 22:52:29 · 203 阅读 · 0 评论 -
java socket
对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket。服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了。首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会accept该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信。这样就有两个Socket...原创 2016-10-13 22:35:42 · 103 阅读 · 0 评论 -
Java常量池理解与总结
一.相关概念什么是常量用final修饰的成员变量表示常量,值一旦给定就无法改变!final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。Class文件中的常量池在Class文件结构中,最头的4个字节用于存储魔数Magic Number,用于确定一个文件是否能被JVM接受,再接着4个字节用于存储版本号,前2个字节存储次版本号,后2个存储主版本号,...原创 2016-10-04 01:14:16 · 95 阅读 · 0 评论 -
java 类型扩展和移位运算
byte b = -1;System.out.println((int)(char) b); //65535System.out.println(b & 0xFF); //255 char c = 65535;System.out.println((int) c); //65535System.out.printl...原创 2016-10-03 21:56:57 · 144 阅读 · 0 评论 -
finally的一些特性
public class FinallyTest { public static void main(String[] args) { System.out.println("test1:" + testFinal1()); System.out.println("test2:" + testFinal2()); System.out.println("test3:" +...原创 2016-03-31 12:45:12 · 227 阅读 · 0 评论 -
java 内部类
public class InnerTest { public static void main(String[] args) { //必须先有外部类的对象才能生成内部类的对象,因为内部类的作用就是为了访问外部类中的成员变量 Outer.Inner in = new Outer().new Inner(); //out.new Inner() in.show...原创 2016-03-30 14:01:56 · 86 阅读 · 0 评论 -
java Reflection反射
import java.lang.reflect.*;public class Reflection { public static void main(String[] args) { ReflectPerson p = new ReflectPerson("chenzq", 20); Class<? extends ReflectPerson> ...原创 2016-03-30 14:01:45 · 70 阅读 · 0 评论 -
java 多线程编程(生产者和消费者)
public class ProducerAndConsumer { public static void main(String[] args) { Storage storage = new Storage(); Thread producer1 = new Thread(new Producer(storage, "producer1")); Th...原创 2016-03-30 14:00:57 · 186 阅读 · 0 评论 -
java类成员初始化顺序
public class InitialOderExtends extends Parent { // 静态变量 public static String s_StaticField = "subclass--static variable"; // 变量 public String s_Field = "subclass--variable"; // 静态初...原创 2016-03-29 13:39:46 · 68 阅读 · 0 评论 -
java Annotation注解
import java.lang.annotation.*;import java.lang.reflect.*;public class Annotation { public static void main(String[] args) { int tests = 0; int passed = 0; Class<?> testClass...原创 2016-03-29 13:38:59 · 66 阅读 · 0 评论 -
java for循环使用标签以及switch
public class LabeledLoop { public static void main(String[] args) { int i = 0; outer: // Can't have statements here for(; true ;) { inner: // Can't have statements here for(; i ...原创 2016-03-29 13:37:27 · 453 阅读 · 0 评论 -
java基本数据类型缺省值
public class DefaultInitValue { private int iValue; //0 private long lValue; //0 private boolean bValue; //false private char cValue; //(short)0 || '\u0000' private float fValue; /...原创 2016-03-27 16:43:26 · 1381 阅读 · 0 评论 -
java初始化陷阱
import java.util.Iterator;import java.util.NoSuchElementException;public class InitOrder { public static void main(String[] args) { //错误的初始化 new RoundGlyph(5); for (Iterator<...原创 2016-03-27 16:29:13 · 99 阅读 · 0 评论 -
java重载之基本类型
public class PrimitiveOverload { static void prt(String s) { System.out.println(s); } void f1(char x) { prt("f1(char)"); } void f1(byte x) { prt("f1(byte)"); } void f1(short x) { p...原创 2016-03-27 16:15:25 · 147 阅读 · 0 评论 -
java对象复制之Serializable
import java.io.*;@SuppressWarnings("all")public class CloneBySerializable implements Serializable { private int j; private Thing thing; public CloneBySerializable(int j) { this.j = j;...原创 2016-03-27 16:09:12 · 221 阅读 · 0 评论 -
java运算符
public class TypeCast { public static void main(String[] args) { short i1 = 10; short i2 = 20; i1 = (short) (i1 + i2); //必须显式cast 回short,否则编译错误 i1 = (short) (i1 >> 2); i1 +=...原创 2016-04-01 13:13:33 · 81 阅读 · 0 评论