随笔分类 -  JAVA基础

JAVA基础,主要包括“Thinking in Java” “effective Java”,JDK源码解析
摘要:在Java开发的时候经常会用到关键字synchronized来对代码进行同步,在使用的过程中,对于synchronized确不是很熟悉,最近在看Spring源码时,发现有不少地方都用到同步,因此,趁此机会,研究一下。 1.synchronized锁的对象 Java中的每一个对象都可以作... 阅读全文
posted @ 2014-05-10 17:27 chenfei0801 阅读(1330) 评论(1) 推荐(0)
摘要:注解作用 常见的作用有以下几种:生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return @author等。跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用了这种配置来减... 阅读全文
posted @ 2014-05-05 21:32 chenfei0801 阅读(331) 评论(0) 推荐(0)
摘要:在java中运行一下代码System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9再运行如下代码:System.out.println(2.00f-1.10f);输出结果:0.9又正确了,为什么会导致这种问题?程序中... 阅读全文
posted @ 2014-04-17 23:18 chenfei0801 阅读(2793) 评论(0) 推荐(0)
摘要:枚举类型其实归根结底也是普通的java类,因此在使用的时候也可以参考java类的一些处理方式,提高的代码的可复用性如 下面关于数值操作的枚举类 public enum Operate { PLUS, MINUS, TIMES, DIVIDE; public double app... 阅读全文
posted @ 2014-04-14 23:19 chenfei0801 阅读(286) 评论(0) 推荐(0)
摘要:一般情况下,泛型最通常应用于集合,如set和Map,以及单元素的容器,如ThreadLocal等。在这些语法中一般情况下,这些容器都被充当被参数化了的容器,意味着每个容器只能有一个或者多个固定数目的类型参数。如一个Set只有一个类型参数,用于表示元素类型。一个Map有两个类型参数,表示它的键和... 阅读全文
posted @ 2014-04-14 22:09 chenfei0801 阅读(642) 评论(0) 推荐(0)
摘要:什么是泛型? 声明中具有一个或者多个类型参数的类或者接口,就是泛型类或者接口。 如List 读做E的列表。E代表了元素类型请不要在新代码中使用原生态泛型 所谓原生态泛型,指的是不带任何实际类型参数的泛型名称。如List相对应的原生态类型为List。 原生态类型,不具有泛型... 阅读全文
posted @ 2014-04-08 22:38 chenfei0801 阅读(363) 评论(0) 推荐(0)
摘要:字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件,如图所示。下面以两个写文件的操作为主进行比较,但是在操作时字节流和字符流的操作完成之后都不关闭... 阅读全文
posted @ 2014-04-01 21:13 chenfei0801 阅读(249) 评论(0) 推荐(0)
摘要:虽然Inteface中默认常量就是static final 的。因此很多人就认为其实存放常量的最佳地方,effective java中就提过,不建议使用常量接口。其有一个原因就是:代码编译问题 好,我们来看一个简单的例子:有一个interface A,一个class B,代码如下://file A.javapublic interface A{ String name = "bright";}//file B.javapublic class B{ public static void main(String[] args){ System.out.println(&quo 阅读全文
posted @ 2014-03-16 22:25 chenfei0801 阅读(775) 评论(0) 推荐(0)
摘要:1:不能多次read2:read 与write操作必须一对一 阅读全文
posted @ 2014-03-02 23:20 chenfei0801 阅读(185) 评论(0) 推荐(0)
摘要:最近在做文件服务器的相关东西,在原有的磁盘存储的基础上,增加了Ftp的存储方式,客户端选用的是Apache的FtpClient。 今天在测试的时候,发现中文的路径后者文件名不支持,查阅了相关资料后终于找到了解决的方法。 使用类: org.apache.commons.net.ftp.FTPClient 问题描述: 创建中文目录、上传中文文件名时,目录名及文件名中的中文显示乱码 解决方法: 在网上Google了一些资料,FTP协议里面,规定文件名编码为iso-8859-1,所以目录名或文件名需要转码。 所以网上很多人的解决方法为: 将中文的... 阅读全文
posted @ 2013-11-16 23:11 chenfei0801 阅读(31051) 评论(3) 推荐(4)
摘要:在java多线程程序中,所有线程都不允许抛出未捕获的checked exception(比如sleep时的InterruptedException),也就是说各个线程需要自己把自己的checked exception处理掉。这一点是通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throw exception部分)进行了约束。但是线程依然有可能抛出unchecked exception(如运行时异常),当此类异常跑抛出时,线程就会终结,而对于主线程和其他线程完全不受影响,且完全感知不到某个线程抛出的异常(也是说完全无法catch到这个异常)。JVM的这种... 阅读全文
posted @ 2013-04-23 23:38 chenfei0801 阅读(8542) 评论(0) 推荐(4)
摘要:1)休眠 sleep sleep()可以使任务中止执行一段时间(这段时间是指定的)。但是要注意的是对sleep()的调用可以抛出InterruptedException异常,并且这个异常在run()方法中就得捕获,进行处理,这是因为异常不能跨线程传播,所以我们必须在本地处理所有任务内部产生的异常。 在旧版本中,sleep的用法是这样的,Thread.sleep(1000); 但是在Java SE5 之后引入了更加显示的sleep()版本,作为TimeUnit类的一部分。 TimeUtil.MILLISECONDS.sleep(100); 注意下面这个程序: Class Sl... 阅读全文
posted @ 2013-04-16 23:30 chenfei0801 阅读(2694) 评论(0) 推荐(0)
摘要:1)定义任务 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供(有的地方比如Swing2中经常将其叫做可运行对象)。要想定义任务,只需要实现Runnable接口并编写run()方法,使得该任务执行命令。 但是此时呢,这个run()方法跟一个普通方法一样,并没有什么特殊的地方,不会产生任何内在的线程能力。要实现线程行为,我们必须在使用的时候显示的将一个任务附着到现场上。2)Thread类 要想Runnable对象要想具有线程行为,传统的方式就是把它提交给一个Thread构造器。然后调用Thread类的start()方法为该线程执行必须的初始化操作,... 阅读全文
posted @ 2013-04-07 23:24 chenfei0801 阅读(676) 评论(0) 推荐(0)
摘要:transient(瞬时)关键字 当我们队序列化进行控制时,可能某个特定子对象不想让Java的序列化机制自动保存与恢复。如果子对象表示的是我们不希望将其序列化的敏感信息(如密码),通常就会面临这种情况。即使对象中的这些信息是private属性,一经序列化处理,人们就可以通过读取文件或者拦截网络传输的方式来访问它。 在Java对象序列化(二)——Externalizable中我们通过将类实现为Externalizable可以实现类的部分序列化。本文提供了另一种可以实现部分序列化的方式,即通过关键字——transient(瞬时)。如果我们正在操作的是一个Serializable对象,那么... 阅读全文
posted @ 2013-04-06 15:26 chenfei0801 阅读(1637) 评论(0) 推荐(1)
摘要:在Java对象序列化(一)——Serializable一文中我们可以看到,Java默认的序列化机制非常简单,而且序列化后的对象不需要再次调用构造器重新生成,但是在实际中,我们可以会希望对象的某一部分不需要被序列化,或者说一个对象被还原之后,其内部的某些子对象需要重新创建,从而不必将该子对象序列化。 在这些情况下,我们可以考虑实现Externalizable接口从而代替Serializable接口来对序列化过程进行控制(后面我们会讲到一个更简单的方式,通过transient的方式)。 Externalizable接口extendsSerializable接口,而且在其基础上增加了两个方法:... 阅读全文
posted @ 2013-04-06 12:31 chenfei0801 阅读(9138) 评论(0) 推荐(4)
摘要:Java的对象序列化是指将那些实现了Serializable接口的对象转换成一个字符序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。 只要对象实现了Serializable接口(记住,这个接口只是一个标记接口... 阅读全文
posted @ 2013-04-05 19:43 chenfei0801 阅读(71374) 评论(5) 推荐(8)
摘要:下面是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; } ... 阅读全文
posted @ 2013-04-05 17:50 chenfei0801 阅读(1211) 评论(0) 推荐(0)
摘要:今天写一个读写程序,运用到InputStream的reset方法是发现竟然失败了,然后查了一下JDK源码,发现BufferInputStream重写了父类FilterInputStream的mark和resetf方法,其有支持 mark 和 reset 方法的能力。而FileInputStream则没有重写父类InputStream的这两个方法,其不具有mark和reset方法的能力。在JDK源码中,写到 publicsynchronizedvoidmark(intreadlimit) 在该输入流中标记当前位置。后续调用reset方法重新将流定位于最后标记位置,以便后续读... 阅读全文
posted @ 2013-04-01 23:05 chenfei0801 阅读(18449) 评论(0) 推荐(1)
摘要:JDK1.4引入了文件加锁机制。它允许我们同步访问某个作为共享资源的文件。不过,竞争同一文件的两个线程可能在不同的Java虚拟机上,或者一个是Java线程,另一个是操作系统中的其他的某个本地线程。文件加锁对其他的操作系统进程是可见的,因为Java的文件加锁直接映射到了本地操作系统的枷锁工具。 通过对FileChannel调用tryLock()或者lock(),就可以获得整个文件的FileLock。其中tryLock()是非阻塞式的,它设法获得锁,如果不能获得(其他的一些进程已经持有相同的锁,并且不共享),它将直接从方法调用返回。lock()则是阻塞式的,它要阻塞进程直至锁可以获得,或... 阅读全文
posted @ 2013-03-31 21:15 chenfei0801 阅读(2750) 评论(0) 推荐(0)
摘要:Reader和Writer 首先,我们要明确一点,Reader和Writer不是为了取代InputStream和OutStream的,而且他们之间在代码上可以看到,也没有什么直接的关系。两者最大的区别呢,是Reader和Writer提供兼容Unicode与面向字符的I/O功能,而后两者则是提供面向字节形式的I/O操作。(1个字符=2个字节) 有的时候,我们需要将来自于字节层次结构中的类和来自于字符层次结构中的类结合起来使用,这时候,从应用场景上就可以看到,这是典型的适配器模式。。。适配器类,InputStreamReader可以把InputStream转化为Reader,而Ou... 阅读全文
posted @ 2013-03-31 20:31 chenfei0801 阅读(274) 评论(0) 推荐(0)