Posts
xzoO.Org
Cancel

Java 7开始有一个有意思的功能,就是结合了自动关闭资源和异常处理的try-with-resources语句。按照旧式的处理方式,关闭资源一般放在try-catch的finally块中,需要显式地关闭。比如关闭文件句柄、数据库中的连接、语句和记录集等。而try-with-resources不需要显式声明关闭,它会自动调用close()方法,防止程序员忘记关闭资源而引起内存可能的泄漏。因此这...

仔细研究(类与成员变量的初始化),可以解释很多疑问。这里顺便分析一下Java界一直存在的疑惑。 为什么对super的调用必须是当前类构造器函数中的第一个语句? 先说明一下JLS语言规范对super调用的规则 如果父类存在默认构造函数(就是无参构造函数),子类的构造函数中,Java会隐式地在第一行语句前填入 super(); 用户也可以显式地调用 super(); 且必须保...

之前研究过变量(类变量与实例变量的内存存储),顺便这次分析一下类变量的初始化问题,也能从另外一个角度来证明类变量的内存分配的共享性质。 假设我定义一个ClassA,含有一个实例变量s,一个默认构造函数(无参构造器),一个有参构造函数,还有一个实例方法check(String)。 public class ClassA { String s; public ClassA(){ s ...

在Oracle Agile的代码中有一段非常不好的设计,就是关闭FTP连接释放socket资源的过程被定义在封装类的finalize()方法中。比如下面的代码。 private void disconnect() throws IOException { // Disconnect from FTP site if (this.m_connected) { this.m...

变量有类变量、实例变量和局部变量。局部变量比较好区别。类变量与实例变量的区别就在于前者在类中被定义时有static修饰符。 类变量属于类级别,因此在多个线程中引用时是共享的,因此只存在于一个内存区域。而实例变量仅仅属于类定义的具体实例,多个实例之间不共享实例变量,因此他们使用不同的内存地址。 这里就出现了一个问题。实例都是类的具体定义,都是保存在heap堆中,因为堆都是保存具体的对象,所以...

创建String变量的时候,对象的产生和内存分配会因为创建方式不同而有显著的差别。 直接赋值 String a1 = "hello"; String a2 = "hello"; String a3 = "hello"; System.out.println("a1=a2?" + (a1==a2)); System.out.println("a1=a3?" + (a1==a3)); 创...

Tomcat如果以命令行的方式启动,JVM以及程序参数的设置非常简单,只要修改命令文件中的参数就可以了。偶尔接触到Tomcat在Windows上以Service的形式启动,找到JVM设置的位置,花了不少的冤枉时间,因为Tomcat文档几乎没有提到。 JVM以及程序参数 Tomcat被注册为Service之后,相应的所有启动参数全部写到注册表中,具体的路径就是: HKEY_LOCAL_M...

前面提到了Java推荐的串行化ObjectInputStream/ObjectOutputStream 缺点比较明显(生成的数据大;人和其他语言无法阅读),所以已经不再适用了。相反的,JSON或者XML格式处理串行化已经是主流,优点自然显而易见: 数据小,快速传输 人能直接阅读,各语言都能解析 可以构造字符串,反串行化生成实例对象 这里举个Google的开源Gson,用于...

PipedInputStream和PipedOutputStream通过pipe使得同一个JVM进程中的不同线程下的两个输入输出流可以交换数据。Pipe流设计时有下面的限制。 输入流不能比输出流先关闭 输入流必须完整无缺地读到全部的输出流数据,不能只读一部分 输出流和输出流必须显式地调用close()关闭 PipedInputStream的读处于阻塞状态,即等待Piped...

PushbackInputStream可以让程序试探性地读取字节流的前若干个字节来判断是否该流是自己期望的。如果是,可以处理后续流数据。如果不是,可以回退读取的字节,把流交给其他人。 这个例子演示一个简单的场景,读取Java Class文件,判断是否是合法的Class 魔数是否为合法的”CAFEBABE” Major Version是否是期望的版本 首先查阅Java规范,可...