
java
文章平均质量分 73
qq838642798
这个作者很懒,什么都没留下…
展开
-
Eclipse切换JDK,JRE版本步骤总结
切换整个eclipse环境的版本1. 首先得明白,所谓的切换版本是分成两大块,JDK和JRE,这两者要切换一致2. Window-> Preferences—>Java—>Compiler右侧面板选择想要的版本3. Window-> Preferences—>Java—>Installed JREs右侧面板选择想要的版本--上面可以看到,两个步骤就可以原创 2017-12-26 17:17:07 · 5423 阅读 · 0 评论 -
jedis API接口批量处理包装(事务,管道,分布式锁,lua脚本,发布订阅)
import java.util.List;import java.util.Map;import java.util.Set;import redis.clients.jedis.Jedis;/** * * @author : zhengrf1* @date 创建时间:2017年7月11日 下午4:04:58 * @version 1.0 */原创 2017-07-12 17:13:55 · 679 阅读 · 0 评论 -
Java上帝类(Object类)源码总结(1)
追根溯源,所有的java类都是Oject的子类,那么要进一步了解java,那么去探索Object类的源码就是不可避免的。这个神秘的Oject类里面是什么东东呢?package java.lang; public class Object { private static native void registerNatives(); static {原创 2016-12-26 17:06:48 · 1748 阅读 · 0 评论 -
Java加载类(Class)文件过程
其实对于任何编程语言而言,编译和链接都是必不可少的环节,对于java而言编译这环节比较简单,就是按照JVM指定的规范生成字节码文件(Class文件),因为字节码是JVM能认识的,并且会把这些字节码翻译成本地机器的机器指令。至于链接这块,Java作为动态动态编译编程语言,链接这块相对静态链接语言而言要复杂很多。某种程度可以说java的Class文件加载处理的过程其实就是为了完成链接这个目标。链接这个原创 2017-07-10 19:29:39 · 550 阅读 · 0 评论 -
JNI转换通俗易懂的总结(Java调用C++篇)
相对C++调用java而言,使用JNI实现Java调用C++相对比较简单点,因为不用自己启动和管理一个JVM。最简单的流程:1. 编写一份简单的HelloWorld.javaclass HelloWorld {public native void displayHelloWorld(); static {System.loadLibrary("hello");原创 2017-06-29 17:12:16 · 536 阅读 · 0 评论 -
Kafka消息队列原理总结
最近在测试kafka的读写性能,所以借这个机会了解了kafka的一些设计原理,既然作为分布式系统,我们还是按照分布式的套路进行分析。 Kafka的逻辑数据模型:生产者发送数据给服务端时,构造的是ProducerRecord(String topic, Integer key,String value)对象并发送,从这个构造函数可以看到,kafka的表面逻辑数据模型是key-value。原创 2017-04-26 16:49:38 · 10699 阅读 · 0 评论 -
java中File类常用API总结
public class FileTest {/** * * @author : zhengrf1* @date 创建时间:2017年3月15日 下午5:01:09 */public static void main(String[] args) {// TODO Auto-generated method stubFile file = new File(原创 2017-03-15 18:08:27 · 720 阅读 · 0 评论 -
Java基本类型的一些总结
Java基本类型的长度以及和C++的对比Java(字节数) C++(字节数)Byte 1 C++没有字节类型,可以用unsigned char代替Short 2原创 2017-03-24 15:33:07 · 408 阅读 · 0 评论 -
ReenTrantLock可重入锁(和synchronized的区别)总结
ReenTrantLock可重入锁(和synchronized的区别)总结可重入性:从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。 锁的实现:Synchronized是依赖于JVM实现的原创 2017-03-23 11:31:29 · 50863 阅读 · 10 评论 -
Java锁性能提高(锁升级)机制总结
锁的使用很难避免,如何尽量提高锁的性能就显得比较重要了锁偏向所谓的偏向锁是指在对象实例的Mark Word(说白了就是对象内存中的开头几个字节保留的信息,如果把一个对象序列化后明显可以看见开头的这些信息),为了在线程竞争不激烈的情况下,减少加锁及解锁的性能损耗(轻量级锁涉及多次CAS操作)在Mark Word中有保存这上次使用这个对象锁的线程ID信息,如果这个线程再次请求这个对象锁,那么只原创 2017-03-21 11:38:37 · 7570 阅读 · 10 评论 -
线程类Thread的API接口分析系列之守护线程setDaemon
对于java中的守护线程的概念一直了解的比较少,有时还会跟linux中的守护进程搞混淆。简单来说,设置守护线程的使用非常简单,但是原理还是有点小晦涩。先看源码 /* Whether or not the thread is a daemon thread. */ private boolean daemon =false; public final void set原创 2017-03-07 18:47:02 · 414 阅读 · 0 评论 -
线程类Thread的API接口分析系列之interrupt()
一直对Thread.interrupt()接口不是太清楚,之前以为是直接中止指定线程的接口,后来仔细了解,发现并不是,而是只是在jvm中设置了指定线程的状态值为“中止”,但是并不主动去中止线程,如何处理的权限交给了写线程运行代码的用户。如下面例子public class ThreadApiTest implementsRunnable { Threadt原创 2017-03-07 18:02:13 · 971 阅读 · 0 评论 -
JNI转换通俗易懂的总结(C++调用java篇)
主要的内容分成以下三部分:1. 启动java虚拟机(JVM),C++和java接口的交互,实际上就是C++和JVM的交互。例子如下:JavaVMOption options[3];JNIEnv *env;JavaVM *jvm;JavaVMInitArgs vm_args;long status;char normalOpt[] ="-Djava.clas原创 2017-06-28 15:32:55 · 579 阅读 · 0 评论 -
Java字节码(class文件)解析
Java编译后生成的.class字节码文件里面的内容究竟是什么呢?一直比较困扰,现在终于看到了庐山真面目,比如对于test.class使用javap -p -verbose test可以查看生成的字节码里面的内容。用一个简单的test类来分析字节码里面的内容。test.java:/** * * @author :zhengrf1* @date 创建时间:2017年7月19日 上原创 2017-07-19 17:26:27 · 677 阅读 · 0 评论 -
Java与C++差异总结(1)
最近的工作是把几份C++代码翻译成java,不搞不知道,一搞吓一跳,真的很麻烦,C++和java的语法和其他细节差异太大了。下面就把遇到的一些差异整理总结一下:1. 一维数组的定义:C++:分为静态数组和动态数组,其中静态数组 int a[5],或int a[2]={1,2} 动态数组 int * a= new int[5],或 int * a = new原创 2017-07-07 19:15:11 · 357 阅读 · 0 评论 -
非web java项目部署到linux总结(非打包成jar,配置文件可以随时修改)
1. 首先要在eclipse中编译成功,并且运行没有问题。2. 上传项目目录下的子目录,可以根据需要上传,但是bin和lib目录是必不可少的。Lib目录里应包含所有用到的依赖外包。3. 编辑运行脚步,实际上是完成eclipse的工作。例子如下:start-coms.sh:#!/usr/bin/envshexportLANG=UTF-8HOME_原创 2017-12-20 17:15:07 · 1401 阅读 · 1 评论 -
日志控制log4j的使用总结
Log4j是个广泛使用的日志控制工具,并且使用起来相对方便,之前一直搞不大清楚如何使用。这两天稍微花时间简单使用和测试了一下。把使用过程和细节进行总结,以便以后忘记的时候进行翻阅。1.引入jar包首先准备引入log4j-1.2.16.jar包,还有说法说要同时引入commons-logging-1.1.1.jar包,姑且就两个包都引入。2.编写log4j.properties配置文件原创 2017-09-21 16:38:22 · 520 阅读 · 0 评论 -
Java NIO之文件监控机制
由于业务需要在主备切换时读取程序返回值文件,这样一来就涉及到了文件监控读取的问题,比较low的做法是程序备进程变主进程后每隔一段时间去轮询相关的文件,并读取里面的返回值。后来突然想到了socket相关有个NIO机制,于是觉得socket和文件对操作系统其实都是外设,应该有相关的NIO机制。后来发现java单独提供了一个很好用的NIO相关机制。例子比较简单,直接分析:WatchService原创 2017-09-28 11:27:11 · 983 阅读 · 0 评论 -
从字节码角度分析java泛型数组的问题
关于java的泛型数组这个问题,之前就有遇到过,不过当时以为是自己代码语法错误的问题,现在系统地对java的基础知识进行深入总结,才发现这个问题某种程度是和泛型的类型擦除机制有关,其实我觉得这个解释有它的道路但是还是比较勉强。下面我们从字节码角度试图去分析一下java某种意义上是不支持泛型数组原因比如源码:List[]list3 = new ArrayList[10];//错误定义格式原创 2017-07-24 15:50:46 · 668 阅读 · 0 评论 -
通过字节码扒一扒java编译器瞒着我们做了什么(3)
1. 数组和二维数组在字节码中的实现源码: int[] list1 = {1,2};int[][] list2 = {{1,2},{3,4}};字节码: int[] list1; descriptor: [I flags: int[][] list2; descriptor: [[Iflags:原创 2017-07-24 11:20:39 · 442 阅读 · 0 评论 -
从字节码角度分析泛型类,泛型方法,泛型接口的实现机制(类型擦除)
在java中泛型本质上是个语法糖,跟C++不一样,java根本不会创建泛型类,一切都只不过是编译器通过类型擦除机制实现的障眼法而已,比如源码:public classChildTest extends test { Ta = (T) "hello world"; public void fun(T t){ System.out.pri原创 2017-07-23 21:35:12 · 703 阅读 · 0 评论 -
从字节码角度分析接口中的成员域
在java中接口是可以有成员变量的,比如下面源码:public interfaceTestInterface { int a = 999; Stringstr="hello world";} 字节码: Last modified 2017-7-23; size 213 bytes MD5checksum 60dbee19d1d48536e214原创 2017-07-23 16:36:08 · 349 阅读 · 0 评论 -
通过字节码深入分析java的枚举类型enum
1. Java中的枚举究竟是什么鬼?如果从C++转java的话,会发现一个现象那就是在java中的枚举跟C++区别非常大,甚至可以说除了名字一样外,其他实现等都是非常不同的,在C++枚举更像个常数,而java的枚举更靠近正常的普通成员内部类。让我们从字节码角度看看java中的enum究竟是什么东西吧源码: public enum book{ BOO原创 2017-07-23 14:49:51 · 765 阅读 · 0 评论 -
通过字节码扒一扒java编译器瞒着我们做了什么(2)
1. Int[] a={}和int[] a=newint[]{}有何区别?定义数组时经常会产生一些以为,比如说上面两种数组定义格式是否在就JVM中的实现不同,是否前者没有new所以不会在堆中分配内存?如果不了解编译器私自做了什么,很容易被这个问题困扰住,那我们从编译后的字节码中看看这两种定义形式的实现吧。其实这两种定义的字节码是一样的。比如int[] list = {888,777,原创 2017-07-22 20:00:42 · 408 阅读 · 0 评论 -
从字节码角度深入分析内部类(局部内部类,成员内部类,静态内部类,匿名内部类)
1. 局部内部类源码:public void subscribeQueue(Jedis jedis,String[] channels) { // TODO Auto-generated method stub class MyJedisPubSub extendsJedisPubSub{原创 2017-07-22 16:02:50 · 726 阅读 · 0 评论 -
通过字节码扒一扒java编译器瞒着我们做了什么(1)
1. Foreach和泛型语法糖Map map = newHashMap();for(Entry iter:test.map.entrySet()){ Stringstr = iter.getValue(); }--看看字节码是什么内容: 8:aload_1 9: getfie原创 2017-07-20 17:38:03 · 433 阅读 · 0 评论 -
线程类Thread的API接口分析系列之线程组ThreadGroup
先看看整个java的线程组体系public static void main(String[] args) { //TODO Auto-generated method stub ThreadGrouptg = new ThreadGroup("新建线程组"); System原创 2017-03-09 18:25:06 · 406 阅读 · 0 评论 -
线程类Thread的API接口分析系列之定时器Timer
跟linux一样,java也提供类似crontable的定时器机制,如Timer,如果只是简单使用比较简单,直接上例子:public class TimerTest extends TimerTask { /*@author : zhengrf1 * @date 创建时间:2017年3月9日 下午3:37:47 * @se原创 2017-03-09 16:32:40 · 343 阅读 · 0 评论 -
线程类Thread的API接口分析系列之Condition
Java提供了wait和notify,notifyall来实现等待唤醒的生产者和消费者模式,ReenTrantLock也同样提供了类似的机制,而且比前者更加灵活,前者调用notify唤醒的是虚拟机随即选择的等待线程。而ReenTrantLock的condition则可以有选择地唤醒。上例子:java.lang.IllegalMonitorStateException --一般是没有获取到锁但原创 2017-03-09 11:48:05 · 269 阅读 · 0 评论 -
Java中IO体系字节流与字符流之适配器模式
在java 的IO体系中,除了常用到的装饰模式外,还有一个常用的设计模式:适配器设计模式,主要用来实现字节流和字符流类的适配转换工作。相比装饰模式而言,适配器模式就相对简单多了,完成一个适配器模式需要三个组件:目标接口(也就是最终要调用的对象的类型)Target,需要被适配的类(也就是真正需要调用能力拥有者的类)Adaptee,适配器者Adapter(就是把Adaptee的能力填充到Target接原创 2017-01-03 11:50:04 · 895 阅读 · 0 评论 -
Java开发随记IO之BufferedWriter以及IO知识点
最近发现一个问题,对某个地市全月的批价话单进行重批号码过滤时,把所有重批号码的话单多线程都用BufferedWriter写入一个文件Filter.txt,后来通过统计日志发现日志中打印的过滤话单总数和Filter.txt的总数不一致,虽然不影响生产结果,但是让我百思不得其解,又重新怀疑BufferedWriter的线程安全性。首先怀疑的是BufferedWriter.flush方法的线程安全性原创 2017-01-03 01:32:28 · 469 阅读 · 0 评论 -
Java异常机制总结
在java中,异常机制用的比C++频繁,但是一直没有比较系统完整地对java的异常机制作总结,使用异常的过程中总有点心里没底的感觉,这次进行一次相对完整的总结首先是java的异常机制继承体系:Java的异常机制分成两大类:error(错误)和exception(异常),这两大类都继承于一个父类Throwable。error(错误):一般是指虚拟机运行时关于虚拟机的报错,比较常见的是内存原创 2016-12-22 11:45:06 · 376 阅读 · 0 评论 -
Java实际应用中经常遇到的"装饰模式"总结
在java实际应用中,经常会遇到BufferedWriter FilterWriter = new BufferedWriter(newFileWriter("Filter.txt")); 类似的语句,尤其是在I/O操作类中,这种用新new的类包裹着旧new的类对象的形式很常见。这里用到的就是所谓的装饰模式。理论上来说,一个类A的方法能力上包含或者使用了另一个类B的方法能力,这种情况一原创 2016-12-16 09:18:32 · 1260 阅读 · 0 评论 -
java内部类的一些总结
一直对java内部类不大熟悉,代码中也很少用,有说法是,有很多公司觉得使用内部类会造成代码不够简明的问题,所以规范上禁止或要求少用内部类,个人看了内部类的一些知识后,觉得这个说法有它的实际道理,大部分正常非必需的情况下,确实不使用这玩意比较好,但是内部类又是java的一个重要模块内容,尤其是JDK中很多底层的类都用到内部类,所以还是需要去了解的,以免看源码时被卡住,但是实际开发应用中不是非常必要(原创 2016-12-19 17:18:03 · 374 阅读 · 0 评论 -
Java接口,抽象类一些注意事项的总结
由于以前学习的C++中没有接口Interface的概念,所以对接口的一些特性不是很清楚,现在做一些总结。首先从接口的定义开始首先接口的访问权限:必须是public,而且默认是public,同样,接口里面声明的方法访问权限也必须是public,而且默认是public。另外根据实践发现,实现接口的类中的方法也必须是public权限。其次是接口的定义里面的内容:接口里不能定义变量,只能定义常原创 2016-12-20 11:49:17 · 1066 阅读 · 0 评论 -
Java常用容器(数据结构)总结
一直对java的容器的继承体系不是太清楚,只是用的时候就去百度下,很少记忆。现在对常用的java容器做些总结:我们在学校时就知道常用的数据结构,顺序容器数组,链表,队列(先进先出),栈(先进后出),去重容器,关联容器,哈希表。所以就以这些作为切入java容器的入口,而且平常的代码编写中基本上也就用到这些容器而已这些容器在java中都有提供的标准容器类顺序容器数组 Lis原创 2016-12-16 09:20:11 · 1562 阅读 · 0 评论 -
对java多线程的线程安全性的一些总结
一直以来对java的线程安全都有点模糊,知道最近写程序时发现在处理大数据的时候,基本上都不可能离开多线程,而线程安全的忽略对数据的准确性产生比较严重的影响,在这里,对JAVA的线程安全做初步总结,以避免以后的代码中出现线程安全问题。线程安全主要出现在两个方面:1. 多线程,同时使用公共变量时,出现线程私自拷贝公共变量,导致公共变量出现不唯一的情况,线程为了提高效率,将原创 2016-12-16 09:13:20 · 563 阅读 · 0 评论 -
对java内存回收机制的一些总结
之前一直对java内存回收机制比较模糊,首先是对java的代际划分不大清楚,这两天有时间看了些文章,总结了下,其实代际划分死记硬背容易忘掉,融合java的回收设计思想比较容易理解和记忆,java的内存回收设计思想就是按对象被使用的时间价值或者说权重从小到大进行代际划分。Java为了更有效率利用内存,提升内存回收的效率,把对象按照生命周期分成了三大代际区:新生代:新生代分成两块,原创 2016-12-16 09:14:22 · 495 阅读 · 0 评论 -
Java内存布局和类加载的一些总结
Java内存布局和类加载的一些总结对C++程序的内存布局比较清楚,但是对java程序的内存一直比较模糊,原因是个人一直不大重视对java的深入学习,这可能也是一部分学习C++出身的人的傲慢与偏见的表现,这两天根据以前对C++内存模型和链接机制的经验,对java的内存布局和类加载机制(某种程度用动态链接的方式替代了C++静态链接的作用)做了些总结。Java程序从大的角度划分,分成原创 2016-12-16 09:15:56 · 471 阅读 · 0 评论 -
Java中Runtime运行时环境机制总结
最近由于在编码中需要在java代码中执行linux命令,使用到了Runtime类的一些方法,也出现几个小bug,所以趁这个机会对Runtime也就是运行时环境这个类进行总结。Runtime.getRuntime()能得到一个Runtime对象实例,也就是当前运行时环境实例,这个玩艺是什么东西?java中称为虚拟机的运行时环境,这个说法很抽象,我在网上百度了很久,没有确切的说法,我感觉这个Run原创 2016-12-31 22:52:06 · 2711 阅读 · 0 评论