摘要:
import java.util.HashMap;public class Student { private String name ; private String id; public Student(String name , String id) { this.id = id; this.name = name; } public String getName() { return this.name; } public String getId() { ... 阅读全文
摘要:
1)自反性 对于任何非null的引用值x,x.equals(x)必须返回true。---这一点基本上不会有啥问题2)对称性 对于任何非null的引用值x和y,当且仅当x.equals(y)为true时,y.equals(x)也为true。 JDK中就有这样的错误。如java.sql.Timestamp对java.util.Date进行了扩展,并且增加了nanoseconds域。Timestamp的equals方法就违反了对称性。 下面我们来分析下这个方法 //Date.java public boolean equals(Object obj) { ... 阅读全文
摘要:
一般来说,最好能重用对象而不是每次需要的时候就创建一个相同功能的对象。 1) 对于同时提供了静态工厂方法和构造器的不可变类,通常可以使用静态工厂方法而不是使用构造器,以避免创建不必要的对象。比如说,静态方法Boolean.valueOf(String)几乎总是优先于构造器Boolen(String)。 2) 除了上述的不可变对象,也应该重用哪些已知不会变化的可变对象。比如说Date这个对象,其值一旦计算计算出来就不会变化的,那么如果在一个程序中,我们需要判断某人是否是80后(is80s()),我们没有必要再每个实例的is80s()这个方法里每次都生一个Date对象(这个Date对象就... 阅读全文
摘要:
在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked exception处理掉。这一点是通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throw exception部分)进行了约束。但是线程依然有可能抛出unchecked exception(如运行时异常),当此类异常跑抛出时,线程就会终结,而对于主线程和其他线程完全不受影响,且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常)。JVM的这种... 阅读全文
摘要:
1)休眠 sleep sleep()可以使任务中止执行一段时间(这段时间是指定的)。但是要注意的是对sleep()的调用可以抛出InterruptedException异常,并且这个异常在run()方法中就得捕获,进行处理,这是因为异常不能跨线程传播,所以我们必须在本地处理所有任务内部产生的异常。 在旧版本中,sleep的用法是这样的,Thread.sleep(1000); 但是在Java SE5 之后引入了更加显示的sleep()版本,作为TimeUnit类的一部分。 TimeUtil.MILLISECONDS.sleep(100); 注意下面这个程序: Class Sl... 阅读全文
摘要:
1)定义任务 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供(有的地方比如Swing2中经常将其叫做可运行对象)。要想定义任务,只需要实现Runnable接口并编写run()方法,使得该任务执行命令。 但是此时呢,这个run()方法跟一个普通方法一样,并没有什么特殊的地方,不会产生任何内在的线程能力。要实现线程行为,我们必须在使用的时候显示的将一个任务附着到现场上。2)Thread类 要想Runnable对象要想具有线程行为,传统的方式就是把它提交给一个Thread构造器。然后调用Thread类的start()方法为该线程执行必须的初始化操作,... 阅读全文
摘要:
transient(瞬时)关键字 当我们队序列化进行控制时,可能某个特定子对象不想让Java的序列化机制自动保存与恢复。如果子对象表示的是我们不希望将其序列化的敏感信息(如密码),通常就会面临这种情况。即使对象中的这些信息是private属性,一经序列化处理,人们就可以通过读取文件或者拦截网络传输的方式来访问它。 在Java对象序列化(二)——Externalizable中我们通过将类实现为Externalizable可以实现类的部分序列化。本文提供了另一种可以实现部分序列化的方式,即通过关键字——transient(瞬时)。如果我们正在操作的是一个Serializable对象,那么... 阅读全文
摘要:
在Java对象序列化(一)——Serializable一文中我们可以看到,Java默认的序列化机制非常简单,而且序列化后的对象不需要再次调用构造器重新生成,但是在实际中,我们可以会希望对象的某一部分不需要被序列化,或者说一个对象被还原之后,其内部的某些子对象需要重新创建,从而不必将该子对象序列化。 在这些情况下,我们可以考虑实现Externalizable接口从而代替Serializable接口来对序列化过程进行控制(后面我们会讲到一个更简单的方式,通过transient的方式)。 Externalizable接口extendsSerializable接口,而且在其基础上增加了两个方法:... 阅读全文
摘要:
Java的对象序列化是指将那些实现了Serializable接口的对象转换成一个字符序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。 只要对象实现了Serializable接口(记住,这个接口只是一个标记接口... 阅读全文
摘要:
下面是Java常见的反射机制的实现。/** * 用于反射的类*/public class Role { private String name = "默认的不带参数的构造函数"; private String type ="默认是public"; private static Role instance = null; //不带参数的 public Role() { } //带参数的 public Role(String name) { this.name = name; } ... 阅读全文