随笔分类 -  Java

摘要:Java中类型与C/C++中对应关系Java中的类的对应Sign签名, 用来识别对应各个方法。JDK下的javap.exe能输出签名。用法javap -s -p 完整类名 下面是几个例子程序:1、C++本地方法中获取Java中的变量以及调用Java中的方法 Java代码: 1 package com.test; 2 3 import java.util.Date; 4 5 public class TestNative { 6 public native void sayHello(); 7 private int a = 10; 8 public int fu... 阅读全文
posted @ 2013-12-22 22:18 残剑_ 阅读(2768) 评论(2) 推荐(1) 编辑
摘要:JNI是Java Native Interface的缩写,中文为JAVA本地调用。使用JNI可以很方便的用我们的Java程序调用C/C++程序。很多时候,某些功能用Java无法实现,比如说涉及到底层驱动的一些功能,这时候我们就可以利用JNI来调用C或者C++程序来实现,这就是JNI的强大之处。但是JNI也有它的缺点,使用java与本地已编译的代码交互,通常会丧失平台可移植性。 下面是一个JNI例子,调用C++输出"hello world":第一步:创建Java类,在里面定义一个本地方法(用native关键字修饰的方法) public native void sayHello 阅读全文
posted @ 2013-12-20 23:10 残剑_ 阅读(51622) 评论(3) 推荐(3) 编辑
摘要:题目:有A,B,C三个线程, A线程输出A, B线程输出B, C线程输出C,要求, 同时启动三个线程, 按顺序输出ABC, 循环10次。解题思路:要按顺序输出ABC, 循环10次,就要控制三个线程同步工作,也就是说要让三个线程轮流输出,直到10个ABC全部输出则结束线程。这里用一个Lock对象来控制三个线程的同步。用一个int型变量state标识由那个线程输出。 1 package com.thread; 2 3 import java.util.concurrent.locks.Lock; 4 import java.util.concurrent.locks.ReentrantLock;. 阅读全文
posted @ 2013-09-13 20:53 残剑_ 阅读(18370) 评论(6) 推荐(2) 编辑
摘要:无论是在平时的练习还是项目当中,HashMap用的是非常的广,真可谓无处不在。平时用的时候只知道HashMap是用来存储键值对的,却不知道它的底层是如何实现的。一、HashMap概述 HashMap基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了不同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 值得注意的是HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronize... 阅读全文
posted @ 2013-08-22 20:21 残剑_ 阅读(4737) 评论(4) 推荐(5) 编辑
摘要:在使用Iterator来迭代遍历List的时候如果修改该List对象,则会报java.util.ConcurrentModificationException异常,下面看一个例子演示: 1 package com.others; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 import java.util.concurrent.CopyOnWriteArrayList; 7 8 public class ArrayListTest { 9 10 p... 阅读全文
posted @ 2013-08-21 19:20 残剑_ 阅读(19806) 评论(3) 推荐(4) 编辑
摘要:Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁! ReentrantReadWriteLock会使用两把锁来解决问题,一个读锁,一个写锁线程进入读锁的前提条件: 没有其他线程的写... 阅读全文
posted @ 2013-08-21 11:12 残剑_ 阅读(52698) 评论(6) 推荐(4) 编辑
摘要:两个线程可以交换对象的同步点。每个线程都在进入 exchange 方法时给出某个对象,并接受其他线程返回时给出的对象。 用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据。构造方法摘要Exchanger() 创建一个新的 Exchanger。 方法摘要 Vexchange(V x) 等待另一个线程到达此交换点(除非它被中断),然后将给定的对象传送给该线程,并接收该线程的对象。 Vexchange(V x, long timeout, TimeUnit unit) 等待另一个线程到达此交换点(... 阅读全文
posted @ 2013-08-21 10:33 残剑_ 阅读(1303) 评论(0) 推荐(0) 编辑
摘要:CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 CyclicBarrier类似于CountDownLatch也是个计数器, 不同的是CyclicBarrier数的是调用了CyclicBarrier.await()进入等待的线程数, 当线程数达到了CyclicBarrier初始时规定的数目时,所有进入等待状态的线... 阅读全文
posted @ 2013-08-21 10:10 残剑_ 阅读(19530) 评论(4) 推荐(2) 编辑
摘要:Semaphore也是一个线程同步的辅助类,可以维护当前访问自身的线程个数,并提供了同步机制。使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数。Semaphore的主要方法摘要: void acquire():从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。 void release():释放一个许可,将其返回给信号量。 int availablePermits():返回此信号量中当前可用的许可数。 boolean hasQueuedThreads():查询是否有线程正在等待获取。下面是一个例子: 1 package ... 阅读全文
posted @ 2013-08-20 23:20 残剑_ 阅读(12794) 评论(1) 推荐(4) 编辑
摘要:CountDownLatch是一个同步辅助类,犹如倒计时计数器,创建对象时通过构造方法设置初始值,调用CountDownLatch对象的await()方法则处于等待状态,调用countDown()方法就将计数器减1,当计数到达0时,则所有等待者或单个等待者开始执行。 1 package com.thread; 2 import java.util.concurrent.CountDownLatch; 3 import java.util.concurrent.CyclicBarrier; 4 import java.util.concurrent.ExecutorService; 5 im.. 阅读全文
posted @ 2013-08-20 22:28 残剑_ 阅读(17750) 评论(1) 推荐(0) 编辑
摘要:本例介绍一个特殊的队列:BlockingQueue,如果BlockQueue是空的,从BlockingQueue取东西的操作将会被阻断进入等待状态,直到BlockingQueue进了东西才会被唤醒.同样,如果BlockingQueue是满的,任何试图往里存东西的操作也会被阻断进入等待状态,直到BlockingQueue里有空间才会被唤醒继续操作. 使用BlockingQueue的关键技术点如下: 1.BlockingQueue定义的常用方法如下: 1)add(anObject):把anObject加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,... 阅读全文
posted @ 2013-08-20 21:44 残剑_ 阅读(65741) 评论(0) 推荐(1) 编辑
摘要:下面列出一些在笔试中常出现的对字符串操作的题目,都是本人自己写的,如果哪里不对或者有更好的实现欢迎大家指出!如果有其他题目也欢迎大家贴出来!谢谢!一、实现字符串的反转,如输入"abc",返回"cba" 1 package com.others; 2 3 public class 字符串反转 { 4 5 public static void main(String[] args) { 6 System.out.println(inverse("liuling")); 7 } 8 9 public static String invers 阅读全文
posted @ 2013-08-11 17:00 残剑_ 阅读(6958) 评论(4) 推荐(3) 编辑
摘要:问题的提出在大部分情况下,需要多重继承往往意味着糟糕的设计。但在处理一些遗留项目的时候,多重继承可能是我们能做出的选择中代价最小的。由于 Java 语言本身不支持多重继承,这常常会给我们带来麻烦,最后的结果可能就是大量的重复代码。本文试图使用 ASM 框架来解决这一问题。在扩展类的功能的同时,不产生任何重复代码。考虑如下的实际情况:有一组类,名为 SubClass1、SubClass2、SubClass3 和 SubClass4,它们共同继承了同一个父类 SuperClass。现在,我们需要这组类中的一部分,例如 SubClass1 和 SubClass2,这两个类还要实现另外两个接口,它们分 阅读全文
posted @ 2013-05-31 21:50 残剑_ 阅读(3411) 评论(1) 推荐(2) 编辑
摘要:一、什么是ASM ASM是一个java字节码操纵框架,它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。 使用ASM框架需要导入asm的jar包,下载链接:asm-3.2.jar。 二、如何使用ASM ASM框架中的核心类有以下几个: ① Cl... 阅读全文
posted @ 2013-05-25 00:19 残剑_ 阅读(87272) 评论(8) 推荐(6) 编辑
摘要:前面写过:synchronize来实现生产者和消费者问题现在用Lock来实现它 1 package com.thread; 2 3 import java.util.LinkedList; 4 import java.util.concurrent.locks.Condition; 5 import java.util.concurrent.locks.Lock; 6 import java.util.concurrent.locks.ReentrantLock; 7 8 9 /** 10 * 使用Lock来实现生产者和消费者问题 11 * 12 * @auth... 阅读全文
posted @ 2013-05-18 17:55 残剑_ 阅读(3122) 评论(0) 推荐(1) 编辑
摘要:JDK6.0推出了动态编译的新功能,能够在程序中动态的写一个类,再对之进行编译。编译成class文件后就可以通过类加载方式把动态编译的类加载到内存中。当然也能通过RunTime类调用javac命令来动态编译。 动态编译类的主要步骤: ①、写一个字符串,这个字符串就是要编译的类的全部内容。 ②、通过输出流,把该字符串的内容写到工程下面指定的包中。 ③、对创建的java文件进行编译。 动态编译涉及的类有JavaCompiler、StandardJavaFileManager,具体如何编译看下面的例子。 ④、把编译后的字节码加载到内存,然后对其进行操作。 1 package co... 阅读全文
posted @ 2013-05-09 22:55 残剑_ 阅读(4885) 评论(1) 推荐(2) 编辑
摘要:Java中,反射是一种强大的工具。它使您能够创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代表链接。反射允许我们在编写与执行时,使我们的程序代码能够接入装载到JVM中的类的内部信息,而不是源代码中选定的类协作的代码。这使反射成为构建灵活的应用的主要工具。但需注意的是:如果使用不当,反射的成本很高。 Java的类反射所需要的类并不多,它们分别是:Field、Constructor、Method、Class、Object,下面我将对这些类做一个简单的说明。Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理... 阅读全文
posted @ 2013-05-09 12:16 残剑_ 阅读(1711) 评论(0) 推荐(1) 编辑
摘要:在java程序运行过程中,有许多的对象同时存在,但是程序结束运行或者JVM停止运行时这些对象都会消失。如何将这些对象保存起来以便下一次再将这些对象读入内存呢?或者如何将某些对象通过网络传到另一端的java程序?实施对象的这种操作叫做对象的序列化(或者叫做持久化),重新读入内存叫做反序列化。 基本数据类型的包装类和所有容器类都可以被序列化。用户自定义的类默认是不可以被序列化的。如果想要自己定义的类可以序列化就必须让这个类实现java.io.Serializable接口。下面看一个Demo: 1 package com.serializable; 2 3 import java.io.Fi... 阅读全文
posted @ 2013-05-08 21:26 残剑_ 阅读(861) 评论(0) 推荐(1) 编辑
摘要:java中字符流主要都是继承于Reader和Writer两个抽象类。用于对字符文本的读写操作。一、转换类流 1 package com.iotest; 2 3 import java.io.FileInputStream; 4 import java.io.FileNotFoundException; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.InputStreamReader; 8 import java.io.OutputStreamWriter; 9 10 pu... 阅读全文
posted @ 2013-05-08 20:48 残剑_ 阅读(4228) 评论(0) 推荐(0) 编辑
摘要:在I/O类库中,java.io.InputStream和java.io.OutputStream分别表示字节输入流和字节输出流,它们都是抽象类,不能实例化,数据流中的最小单位是字节,所以叫做字节流。 一、InputStream中的读取数据的方法如下: 1、int read() 功能:读取一个字节的数据,并且返回读到得数据,如果返回-1,则表示读到输入流的末尾。 2、int read(byte[] b) 功能:从输入流中读取一定量的字节,并将其存储在字节数组b中,返回实际读取的字节数,如果返回-1,则表示读到输入流的末尾。 3、int read(byte[] b, int off... 阅读全文
posted @ 2013-05-07 22:08 残剑_ 阅读(28959) 评论(2) 推荐(1) 编辑