博文
(转)Hashtable和HashMap(2008-07-13 04:14:00)
摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165770.html
Hashtable和HashMapHashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。也许最重要的不同是Hashtable的方法是同步的,而HashMap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。第三点不同是,只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。一些资料建议,当需要同步时,用Hashtable,反之用HashMap。但是,因为在需要时,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各种情况下,HashMap都优先于Hashtable。......
(转)JAVA中正则表达式的应用-java.util.regex篇(2008-07-13 04:04:00)
摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165734.html
现在JDK1.4里终于有了自己的正则表达式API包,JAVA程序员可以免去找第三方提供的正则表达式库的周折了,我们现在就马上来了解一下这个SUN提供的迟来恩物- -对我来说确实如此。 1.简介: java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。 它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。 以下我们就分别来看看这两个类: 2.Pattern类: Pattern的方法如下: static Pattern compile(String regex) 将给定的正则表达式编译并赋予给Pattern类 static Pattern compile(String regex, int flags) 同上,但增加flag参数的指定,可选的flag参数包括:CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE CASE, CANON EQ int flags() 返回当前Pattern的匹配flag参数. Matcher matcher(CharSequence input) 生成一个给定命名的Matcher对象 static boolean matches(String&......
(转)java.util包(2008-07-19 20:53:00)
摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165807.html
本章介绍Java的实用工具类库java.util包。在这个包中,Java提供了一些实用的方法和数据结构。例如,Java提供日期(Data)类、日历(Calendar)类来产生和获取日期及时间,提供随机数(Random)类产生各种类型的随机数,还提供了堆栈(Stack)、向量(Vector) 、位集合(Bitset)以及哈希表(Hashtable)等类来表示相应的数据结构。 图1.1给出了java.util包的基本层次结构图。下面我们将具体介绍其中几个重要的类。 ┌java.util.BitSet │java.util.Calendar │ └java.util.GregorianCalendar │java.util.Date │java.util.Dictionary │ └java.util.Hashtable │ └java.util.Properties │java.util.EventObject │java.util.ResourceBundle ┌普通类┤ ├java.util.ListResourceBundle │ │ └java.util.PropertyResourceBundle │ │java.util.Local │ │java.util.Observable │ │java.util.Random │ │java.util.StringTokenizer │ │java.util.Vector │ │ └java.util.Stack Java.util┤ └java.util.TimeZone │ └java.util.SimpleTimeZone │ ┌java.util.En......
(转)JAVA正则表达式4种常用功能(2008-07-19 20:58:00)
摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165801.html
JAVA正则表达式4种常用功能 正则表达式在字符串处理上有着强大的功能,sun在jdk1.4加入了对它的支持 下面简单的说下它的4种常用功能: 查询: 以下是代码片段:String str="abc efg ABC"; String regEx="a|f"; //表示a或f Pattern p=Pattern.compile(regEx); Matcher m=p.matcher(str); boolean rs=m.find(); 如果str中有regEx,那么rs为true,否则为flase。如果想在查找时忽略大小写,则可以写成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE); 提取:以下是代码片段: String regEx = ".+\\(.+)$";String str = "c:\\dir1\\dir2\\name.txt";Pattern p = Pattern.compile(regEx);Matcher m = p.matcher(str);boolean rs = m.find();for (int i = 1; i <= m.groupCount(); i++) { System.out.println(m.group(i));} 以上的执行结果为name.txt,提取的字符串储存在m.group(i)中,其中i最大值为m.groupCount(); 分割: 以下是代码片段:String&nbs......
(转)使用Java中的Date和Calendar类(2008-07-19 21:20:00)
摘要:摘自http://www.chinaitpower.com/A200507/2005-07-24/165787.html
Java 语言的Calendar(日历),Date(日期), 和DateFormat(日期格式)组成了Java标准的一个基本但是非常重要的部分. 日期是商业逻辑计算一个关键的部分. 所有的开发者都应该能够计算未来的日期, 定制日期的显示格式, 并将文本数据解析成日期对象. 我们写了两篇文章, 这是第一篇, 我们将大概的学习日期, 日期格式, 日期的解析和日期的计算.我们将讨论下面的类:1、具体类(和抽象类相对)java.util.Date 2、抽象类java.text.DateFormat 和它的一个具体子类,java.text.SimpleDateFormat 3、抽象类java.util.Calendar 和它的一个具体子类,java.util.GregorianCalendar 具体类可以被实例化, 但是抽象类却不能. 你首先必须实现抽象类的一个具体子类.Date 类从Java 开发包(JDK) 1.0 就开始进化, 当时它只包含了几个取得或者设置一个日期数据的各个部分的方法, 比如说月, 日, 和年. 这些方法现在遭到了批评并且已经被转移到了Calendar类里去了, 我们将在本文中进一步讨论它. 这种改进旨在更好的处理日期数据的国际化格式. 就象在JDK 1.1中一样, Date 类实际上只是一个包裹类, 它包含的是一个长整型数据, 表示的是从GMT(格林尼治标准时间)1970年, 1 月 1日00:00:00这一刻之前或者是之后经历的毫秒数.一、创建一个日期对象r让我们看一个使用系统的当前日期和时间创建一个日期对象并返回一个长整数的简单例子. 这个时间通常被称为Java 虚拟机(JVM)主机环境的系统时间.import java.......
(转)Java Security Notes(2008-07-13 03:15:00)
摘要:摘自 winnerineast 的 Blog
(1)
The book I get is 2nd version, so it's still fresh even author released it in 2001. The book consists of 15 chapters each of which focuses on one of JAVA security topics. In the following days, I will share my study notes with you guys. First of all, I list the chapter list here (actually, you could find them around internet easily):Chapter 1, Java Application SecurityChapter 2, The Default SandboxChapter 3, Java Language SecurityChapter 4, The Security ManagerChapter 5, The Access ControllerChapter 6, Java Class LoaderChapter 7, Introduction to CryptographyChapter 8, Security ProvidorsChapter 9, Keys and CertificatesChapter 10, Key ManagementChapter 11, Message DigestsChapter 12, Digital SignaturesChapter 13, Cipher-Based EncryptionChapter 14, SSL and HTTPSChapter 15, Authentication and AuthorizationIf you review above titiles of chapters carefully and are familiar with JAVA Application anatomy, author presents his view along with JAVA topograph......
(转)Java安全(2008-07-13 03:05:00)
摘要: 如果要用Java来开发安全程序,坦白地说,第一步(在学习了Java之后)就是要阅读两本有关Java安全的教材,即Gong [1999]和McGraw [1999](后一本特别要看第7.1节)。还应该看一下Sun发布的安全代码指南http://java.sun.com/security/seccodeguide.html。有一组描述Java安全模型的幻灯片可以从 http://www.dwheeler.com/javasec 免费获取。 下面是基于Gong [1999]、McGraw [1999]和Sun的指南的若干关键要点: 不要使用公共域或变量;把它们声明为私有的并提供访问函数以限制对它们的访问。 除非有很好的理由,把方法都设为私有的(如果确实没这样做,说清楚其理由)。这些非私有的方法必须保护自己,因为它们可能会接收到受污染的数据(除非已经用其它方式对它们进行了保护)。 避免使用静态域变量。这样的变量附着在类(而非类的实例)上,而类可以被其它类所定位。其结果就是静态域变量可以被其它类找到,因此很难保证它们的安全。 永远不要把可变对象返回给潜在有恶意的代码(因为代码可能会改变它)。注意,数组是可变的(即使数组的内容不可变),所以不要返回一个含有敏感数据的内部数组的引用。 永远不要直接保存用户给定的可变对象(包括对象的数组)。否则,用户可以把对象交给安全代码,让安全代码“检查”对象,并在安全代码试图使用数据时改变数据。应该在内部存储数组前复制它们,而且要小心(例如,警惕用户编写的复制例程)。 不要依赖于初始化。有好几种方法给未初始化的对象分配内存。 除非有很好的理由,应该使每件事都是确定的。如果某个类或方法不是确定的,攻击者就可以用某种危险而无法预知的方法来扩展它。注意,作为安全性的交换,这会带来可扩展性的丧失。 不要在安全性上依赖包的范围。若干类,如java.lang,缺省是关闭的,而且某些Java虚拟机(JVM)会让你关闭其它包。否则,Java类是没有关闭的。因此,攻击者可以向包中引入一个新类,并用此新类来访问你以为保护了的信息。 不要使用内部类。在内部类转换为字节代码时,内部类会转换为可以访问包中任意类的类。更糟的是,被封装类的私有域静悄悄地变成非私有的,允许内部类访问! 最小化特权。如果可能,完全不要请求任何特殊的许可。McGraw更......
(转)探讨 J2SE 1.4 发行版中的安全性变化(2008-07-19 21:29:00)
摘要: 安全性是当前程序设计工作中的一个重要方面。由于应用程序在网络上呈分散分布,因而每个部分都需要保护自己的基础框架部分,而这在以前是内置到主应用程序中的。随着这些情况的变化,作为基础的 JavaTM 2 平台发行版也进行了不断演变,并在 J2SE 1.4 发行版 中并入了越来越多的功能,从而提供了一个可以执行移动代码的安全环境。 在最新的 1.4 发行版中,您会发现在安全体系结构中实现了许多增强功能。以前单独提供的几个功能现已成为核心 API 集中的一部分。其中包括通过 Java Cryptography Extension (JCE) 支持加密和解密,通过 Java Secure Socket Extension (JSSE) 实现的对安全套接字层 (SSL) 和传输层安全性 (TLS) 协议的支持,以及通过使用 Java Authentication and Authorization Service (JAAS) 实现的对基于用户的身份鉴定和访问控制的支持。除了包含这些以前的可选软件包以外,您还会发现新增了通过使用 Java Certification Path API实现的对生成和检验证书链的支持以及对 Java GSS-API 和 JAAS 下的 Kerberos V5 机制的支持。此外,还改进了安全策略治理工具 policytool,并添加了对动态载入安全策略的支持。 以下各节将介绍并深入检查所有这些功能。 Java Cryptography Extension 在 Java Cryptography Extension (JCE) 库中,您会发现对加密、解密、密钥协议、信息鉴定代码 (MAC)以及其它加密法服务的支持。由于某些国家/地区的进口控制限制,Java 2 SDK 1.4 发行版附带的JCE 辖区政策文件答应使用强大但有限的加密法。而在其它国家/地区(占大多数),则可以使用这些文件的"完全"版本,从而充分利用其强大的加密法而不受任何限制。您可以下载此版本,并使用此不受限制的版本替换随 Java 2 SDK 1.4 发行版提供的字符串加密法版本。 JCE 库可以将无格式文本转换为密文或反向转换,在 javax.crypto 软件包中可以找到该库。这里的密钥类是 Cipher,它决定了用于加密和解密的加密算法。借助 Cip......
(转)Java的秘密:将应用程序的设定存在哪里(2008-07-13 02:25:00)
摘要:摘自http://www.knowsky.com/365398.html
我们经常需要将我们的程序中的设定,如窗口位置,开启过的文件,用户的选项设定等数据记录下来,以做便用户下一次开启程序能继续使用这些数据。以前我们通常的做法是使用Properties类,它提供以下方法: void load(InputStream inStream) void store(OutputStream out, String header) String getProperty(String key, String defaultValue) String getProperty(String key) 这些方法让我们很轻易的存取设定数据。另外的办法是使用ResourceBundle这个类来储存设定数据,甚至有些程序作者使用一个自定结构的文件来储存设定数据。但不管怎样,最让程序作者头痛的是:我该将这些数据保存在哪? 现在好了,JDK1.4为我们提供的Java.util.prefs包,里面有一个Preferences类,能让以上的工作变得极其轻松! 写VB程序的人经常用SaveSetting函数和getSettging来存取注册表中的用户设定数据。而Java的Preferences类也提供了类似的机制。 Preferences类在不同的平台中有不同的实现方式。而在Windows平台中,Preferences是将数据保存在注册表中的。 建立Preferences对象 为了区分不同的应用程序的参数项,在建立Preferences时要指定一个节点路径。Preferences是一个抽象类,提供了一系列静态方法和抽象方法来操作参数项: 抽象方法: Preferences userData = Preferences.userNodeForPackage(this); Preferences sysData = Preferences.systemNodeForPackage(this); 这两个方法是从指定的物件所在的包(package)返回一个节点路径,如this是javax.swing.JComponent,则返回/javax/swing 静态方法: Preferences userDa......
