-
java.lang.reflect.Array
java.lang.Array 类提供了动态创建和访问数组元素的各种静态方法。Array 允许在执行 get 或 set 操作期间进行扩展转换,但如果发生收缩转换,则抛出 IllegalArgumentException。
Array 为final的,没有实例,只有静态方法。
Array是java反射机制reflection的一种用法, 注意创建数组时的类型是动态的,在编译时并不知道其类型。
注意,其类中的方法都为native的,即一些和操作系统打交道的方法,真正的实现方法和原理据说由C/C++在java虚拟机中实现了。 Read More »3 条评论 -
Java中比较两个对象是否相等
这段代码来自于Lang包中的一个类,其中的思想可以学习学习!
/** * 判断两个对象是否相等。 这个函数用处是: *
-
*
- 可以容忍 null *
- 可以容忍不同类型的 Number *
- 对数组,集合, Map 会深层比较 *
-
Java设计模式之Singleton
Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。 singleton能够被状态化也能被无状态化,通常是用在工具类里,实现单线程的操作。
第一种:注册型的模式:
public class RegSingleton { static private HashMap m_registry = new HashMap(); static { RegSingleton x = new RegSingleton(); m_registry.put(x.getClass().getName(), x); } protected RegSingleton() { } static public RegSingleton getInstance(String name) { if (name == null) { name = "RegSingleton"; } if (m_registry.get(name) == null) { try { m_registry.put(name, Class.forName(name).newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return (RegSingleton) (m_registry.get(name)); } }第一种:饥渴型的模式:
public class EagerSingleton { private static final EagerSingleton m_instance = new EagerSingleton(); private EagerSingleton() { } public static EagerSingleton getInstance() { return m_instance; } }第一种:懒汉型的模式:
public class LazySingleton { private static LazySingleton m_instance = null; private LazySingleton() { } public static LazySingleton getInstance() { if (m_instance == null) { synchronized (LazySingleton.class) { if (m_instance == null) { m_instance = new LazySingleton(); } } } return m_instance; } }第一种方式很少有人使用,因为其没有考虑到多线程并发的情况;第二种方式,在自己内部定义自己一个实例,并提供了一个供外部访问本class的静态方法;第三种方式不用每次都进行生成对象,只是第一次使用时生成实例,提高了效率!仔细看第三种方式,其采用了双重验证m_instance是否为空的方式,并且在方法内部对对象加了同步方法。这种方式看清来万无一失,其实还是有欠妥的地方,深究下去,这就涉及到到double-checked locking (DCL)的讨论。具体讨论,可以参照以下文档:
Double-checked locking and the Singleton pattern
When is a singleton not a singleton?
从上面的文章,可以知道第三种方式并不能解决问题,在第三种方式的方法里设置临时变量也不能解决问题(因为虚拟机会进行优化操作),使用volatile 关键字也不是可靠的方法(因为不同虚拟机对其实现不一致),最可靠的的方法也是最初最容易想到和写出的方法也就是对方法加同步锁。虽然,对整个方法加同步锁,会耗很多资源,但是保证线程安全最可靠的方法了。
最可靠的方式:public class LazySingleton { private static LazySingleton m_instance = null; private LazySingleton() { } public synchronized static LazySingleton getInstance() { if (m_instance == null) { m_instance = new LazySingleton(); } return m_instance; } } -
优化java代码效率
最近在数据迁移的工作,代码的运行效率低是个很头疼的问题,遂在网上找了找总结优化java代码效率的一些方法,以提高自己的编码效率,养成良好的编程习惯.可供程序利用的资源(内存、CPU时间、网络带宽等)是有限的,优化的目的就是让程序用尽可能少的资源完成预定的任务。 Read More »
-
MyEclipse 反编译插件jad安装方法
这是在网上看到的一种方法,我按照下面的方法安装成功并试用,感觉很方便很实用很强大,我用的是MyEclipse 8.5 安装成功,你也可以试试!
准备工作
1. 下载jad.exe文件:http://www.varaneckas.com/sites/default/files/jad/jad158g.win.zip
2. 下载jadeclipse插件:http://prdownloads.sourceforge.net/jadclipse/net.sf.jadclipse_3.3.0.jar?download
3. JadClipse 官网:http://jadclipse.sourceforge.net/wiki/index.php/Main_Page安装
1. 将jad.exe解压到指定目录。如:c:\java\jad
2. 将jadeclipse插件net.sf.jadclipse_3.3.0.jar 拷贝到myeclipse安装目录\Genuitec\Common\plugins\目录下。
3. 在myeclipse安装目录下dropins/创建eclipse文件夹,然后在eclipse文件夹中分别创建features、plugins文件夹,将net.sf.jadclipse_3.3.0.jar 分别拷贝到features和plugins文件夹中。
4. 重新启动myeclipse后,配置jadeclipse插件
5. 在eclipse窗口下,点击Window > Preferences > Java > JadClipse > Path to Decompiler。(设置jad的绝对路径,如 C:\java\Jad\jad.exe)。Use Eclipse code formatter(overrides Jad formatting instructions)选项打勾,与格式化出来的代码样式一致。
6. 在eclipse窗口下,点击Window > Preferences > Java > JadClipse > Misc,将Convert Unicode strings into ANSI strings选项打勾,避免反编译后可能出现的中文乱码。 -
Java within Hypertext Markup Language
今天在看一个开源blog的代码时候,看到一个jsp页面动态引入了一个jhtml页面,myeclipse8.5提示页面有错误,但一直不知道为何会提示错误,也不知道jhtml是啥东西,百度查阅一下才知道jhtml是超文本标记语言中的Java程序。看在网上找找关于jhtml的例子,可是却没有找到,只找到下面的一段对于它的介绍,为什么网上没有关于它的详细介绍呢?难道这种语言在实际项目中很少用到?最后,在搜索PageCompileServlet 和jhtml这两个关键字的情况下,终于找到了一篇介绍文档:Using WebLogic JHTML
For future HTTP servlet projects, we recommend you use JSP instead of the older JHTML standard.
貌似jhtml语言在当今社会已经被jsp替代了!
-
Java中的两类异常
Java提供了两类主要的异常:runtime exception和checked exception。checked 异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。
但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过 NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。
Read More » -
Java Enumeration
Enumeration为接口,位于java.util包中,它生成一系列元素,一次生成一个。连续调用 nextElement 方法将返回一系列的连续元素。
例如,要输出 Vector v 的所有元素,可使用以下方法:
for (Enumeration e = v.elements(); e.hasMoreElements();){ System.out.println(e.nextElement()); }