收藏 分享(赏)

总结java常用API.doc

上传人:精品资料 文档编号:11227086 上传时间:2020-02-21 格式:DOC 页数:27 大小:250.50KB
下载 相关 举报
总结java常用API.doc_第1页
第1页 / 共27页
总结java常用API.doc_第2页
第2页 / 共27页
总结java常用API.doc_第3页
第3页 / 共27页
总结java常用API.doc_第4页
第4页 / 共27页
总结java常用API.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、Java 常用 API的运用,效率及技巧1. Java面向对象基本概念2. System3. String, StringBuffer4. 数值,字符,布尔对象与简单类型的操作5. Class, ClassLoader6. Java IO系统7. Java集合类8. ResourceBundle, Properties9. Exceptions10. JDBC类库11. 常用设计模式1. Java面向对象基本概念Java基本上是面向对象的程序设计语言, 除了一些简单类型(primitive)的变量以外,一切都是对象, 程序是对象的组合, 每个对象都有自己的空间, 并且每个对象都有一种类型, 同

2、一类所有对象都能接受相同的消息。 下面只对 Java中对象的结构作简单的说明: 类(class): class 是定义类的关键字, 类中包含类变量, 方法, 内部类, 内部接口等。由 class可以生成类的实例, 即一个个对象。 如果一个类的成员被定义成 static的,则这个成员不专属于任何对象, 而是属于这个类, 所有的对象共享这个成员。 抽象类(abstract class): 抽象类不能直接生成一个实例, 抽象类中必需有方法是abstract的,抽象类的意思就是它实现了一部分的方法, 而定义为 abstract的方法则需要在它的子类中去实现。 接口(interface): 接口可以理解

3、为纯抽象的类, 它的每个方法都是未实现的, 它可以有成员变量, 但必须是 static的。 一个类如果从这个接口继承(implements)则它必须实现这个接口的所有方法。继承类用关键字:extends,继承接口用关键字:implements。 一个类只能从一个类继承下来,但可以从多个接口继承(类似于 C+的多重继承)。 子类可以覆盖父类的方法(method), 但不能覆盖父类的成员变量(field)。 如果父类的方法为 final或 static的则不能被覆盖。类的初始化顺序是, 如果有父类, 则先初始化父类的 field,然后执行父类的构造函数, 如果子类没有显式的去调父类的构造函数则缺省

4、的会去调父类的无参数构造函数。 然后是子类的field与构造函数的初始化。public interface SuperInterface public staitc String SOME_FLAG = “1”;public void someMethod();public Class SuperClass System.out.println(“init SuperClass field”);public SuperClass() System.out.println(“init SuperClass Constructor”); public void runMethod() System

5、.out.println(“run SuperClass runMethod()”); public Class SubClass extends SuperClass implements SuperInterface System.out.println(“init SubClass field”); public SubClass() System.out.println(“init SubClass Constructor”); public void someMethod() System.out.println(“run SubClass someMethod()”); publi

6、c void runMethod() System.out.println(“run SubClass runMethod()”); 有以下 test 代码:public class Test public void main(String args) SubClass sub = new SubClass();sub. runMethod();则会输出:init SuperClass fieldinit SuperClass Constructorinit SubClass fieldinit SubClass Constructorrun SubClass runMethod()以下章节所

7、讲述到的常用的 Java API 就是一些 Java 自带的一些 Class 或 Interface 的用法。2SystemSystem 类位于 package java.lang 下面, 凡是此 package 下面的类我们可以直接引用无需先import 进来, 因为 JVM 缺省就 load 了这下面的所有 class。System 包含了一些我们常用的方法与成员变量。 System 不能被实例化, 所有的方法都可以直接引用。 主要作用大致有: 输入输出流: (PrintStream) System.out (标准终端输出流), (PrintStream) System.err(标准错误输

8、出流), (InputStream) System.in(标准输入流)。 我们还可以重定向这些流, 比如将所有的 System.out 的输出全部重定向至一文件中去。System.setOut(PrintStream) 标准输出重定向System.setErr(PrintStream) 标准错误输出重定向System.setIn(InputStream) 标准输入重定向 取当前时间:System.currentTimeMillis() 所取到的时间是从 1970/01/01 以来 1/1000 秒计算的 long 型值。这个值可以转换至 Date 或 Timestamp 值。 它一般还可以用来

9、计算程序执行的时间。例:long beginTime = System. currentTimeMillis();System.out.println(“run time = ” + (System. currentTimeMillis() beginTime); 数组拷贝:System.arraycopy(Object src, int src_position, Object dst, int dst_position, int length)src: 源数组。src_position: 源数组拷贝的起始位置。dst: 目标数组dst_position: 拷贝至目标数组的起始位置lengt

10、h: 拷贝元素的长度利用 System.arraycopy进行数组的拷贝效率是最高的, 一般情况下我们自己很少直接用到这个方法,但在集合类的内部中都大量使用了这个方法。 例:int array1 = 1, 2, 3, 4, 5;int array2 = 4, 5, 6, 7, 8;int array3 = new int8;System.arraycopy(array1, 0, array3, 0, 5);System.arraycopy(array2, 2, array3, 5, 3);此时 array3 = 1, 2, 3, 4, 5, 6, 7, 8这比用 for循环来进行赋值效率要高。

11、 存取系统的 Properties:System.getProperties():取得当前所有的 Properties, Properties 将在后面的集合一节进行详细的论述。System.setProperties(Properties props):设置系统的 Properties。System.getProperty(String key): 根据一个键值来取得一个 Property。System.setProperty(String key, String value): 设置系统的一个 Property。JVM起动的时候将会有一些缺省的 Properties值, 例如:java.v

12、ersion Java运行环境版本java.home Java主目录 installation directoryjava.class.path Java 的 class pathjava.ext.dirs Java的扩展目录路径file.separator 文件分隔符(“/“ on UNIX)path.separator 路径分隔符(“:“ on UNIX)line.separator 行分隔符 (“n“ on UNIX)user.name 用户名user.home 用户主目录user.dir 用户当前工作目录更详细的信息请参照 Java API。 另外在起动一个 java程序的时候可以通过

13、-D 来设置系统的 Property, 比如 java Dejb.file=ejb_Test PrintTest 在 PrintTest里面就可以通过 System.getProperty(“ejb.file”)来取得值 ejb_Test。 其它System. loadLibrary(String libname): 加载 native 的动态库。 可以用 C 写 JNI 的库,然后在 java 中通过 native 方法来调用。System.setSecurityManager(SecurityManager s)System.getSecurityManager(): 设置与取得系统的 s

14、ecurity class。3String, StringBuffer3.1 基本用法String 可以说是我们最常用的一个类, 熟练掌握它的一些基本用法是很有用的。String 是由一组字符组成的字符串, 下标由 0 开始。 一旦有必要改变原来的内容, 每个 String方法都有返回了一个新的 String 对象。 char charAt(int index) 返回指定位置的字符。 int compareTo(Object o) int compareTo(String anotherString) 与另外一个对象进行比较。 int compareToIgnoreCase(String st

15、r) 与另一个 String 进行比较, 不区分大小写 String concat(String str) 连接两字符串, 可以直接用+, 因为 Java 给 String 覆盖了+ static String copyValueOf(char data) static String copyValueOf(char data, int offset, int count) 将 data 数组转换至 String boolean endsWith(String suffix) 测试此 String 是否以 suffix 结尾。 boolean startsWith(String prefix)

16、 测试此 String 是否以 prefix 开头。 boolean equals(Object anObject) boolean equalsIgnoreCase(String anotherString) 比较两字符串的值。 不相等则返回 false byte getBytes() 根据缺省的字符编码将 String 转换成字节数组。byte getBytes(String enc) 根据指定的编码将 String 转换万字节数组。 void getChars(int srcBegin, int srcEnd, char dst, int dstBegin) 拷贝字符至一数组中 int

17、indexOf(int ch) 从字串的起始位置查找字符 ch 第一次出现的位置int indexOf(int ch, int fromIndex) 从指定的 fromIndex 位置向后查找第一次出现 ch的位置,int indexOf(String str) int indexOf(String str, int fromIndex) 如果不存在 ch 或 str 都返回-1 int lastIndexOf(int ch) 从字串的最终位置往前查找第一次出现 ch 的位置int lastIndexOf(int ch, int fromIndex) 从指定的位置往前查找第一次出现 ch 的位

18、置,int lastIndexOf(String str) int lastIndexOf(String str, int fromIndex) 如果不存在则返回-1 int length() 该字符串的字符长度(一个全角的汉字长度为 1) String replace(char oldChar, char newChar) 将字符 oldChar 全部替换为 newChar,返回一个新的字符串。 String substring(int beginIndex) 返回从 beginIndex 开始的字符串子集String substring(int beginIndex, int endInd

19、ex) 返回从 beginIndex 至 endIndex 结束的字符串的子集。 其中 endIndex beginIndex 等于子集的字符串长度 char toCharArray() 返回该字符串的内部字符数组 String toLowerCase() 转换至小写字母的字符串String toLowerCase(Locale locale) String toUpperCase() 转换至大写字母的字符串String toUpperCase(Locale locale) String toString() 覆盖了 Object 的 toString 方法, 返回本身。 String tri

20、m() 将字符串两边的半角空白字符去掉, 如果需要去掉全角的空白字符得要自己写。 static String valueOf(primitive p) 将其它的简单类型的值转换为一个 StringStingBuffer 是一个可变的字符串,它可以被更改。同时 StringBuffer 是 Thread safe 的, 你可以放心的使用, 常用的方法如下: StringBuffer append(param) 在 StringBuffer 对象之后追加 param(可以为所有的简单类型和 Object) 返回追加后的 StringBuffer, 与原来的对象是同一份。 char charAt(i

21、nt index) 返回指定位置 index 的字符。 StringBuffer delete(int start, int end) 删除指定区域 startend 的字符。 StringBuffer deleteCharAt(int index) 删除指定位置 index 的字符。 void getChars(int srcBegin, int srcEnd, char dst, int dstBegin) 同 String 的 getChars方法 StringBuffer insert(int offset, boolean b) 在指定位置 offset 插入 param(为所有的简

22、单类型与 Object) int length() 同 String 的 length() StringBuffer replace(int start, int end, String str) 将指定区域 startend 的字符串替换为 str StringBuffer reverse() 反转字符的顺序 void setCharAt(int index, char ch) 设置字符 ch 至 index 位置。 String substring(int start) String substring(int start, int end) 同 String 的 subString St

23、ring toString() 返回一个 String大家可能已经注意到很多方法都返回了一个 StringBuffer 对象, 但返回的这个对象与 String 的方法返回的 String 不一样, 返回的 StringBuffer 对象与被操作的 StringBuffer 对象是同一份,而 String 的方法返回的 String 则肯定是重新生成的一个 String。3.2性能对比因为 String 被设计成一种安全的字符串, 避免了 C/C+中的尴尬。因此在内部操作的时候会频繁的进行对象的交换, 因此它的效率不如 StringBuffer。 如果需要频繁的进行字符串的增删操作的话最好用

24、StringBuffer。 比如拼 SQL 文, 写共函。 另: 编绎器对 String 的+操作进行了一定的优化。x = “a“ + 4 + “c“会被编绎成x = new StringBuffer().append(“a“).append(4).append(“c“).toString()但:x = “a”;x = x + 4;x = x + “c”;则不会被优化。 可以看出如果在一个表达式里面进行 String 的多次+操作会被优化, 而多个表达式的+操作不会被优化。3.3技巧1. 在 Servlet2.3 与 JSP1.1 以前画面 post 到后台的数据是通过 ISO88591 格式

25、进行编码的, 则当遇到全角日文字的时候, 在后台 request 得到的数据可能就是乱码, 这个时候就得自己进行编码转换, 通过 String.getBytes(String enc)方法得到一个字节流 , 然后通过 String(byte bytes, String enc)这个构造函数得到一个用新的编码生成的字符串. 例如将 ISO88591 的字符串转换成 Shift_JIS 的字符串, 方法如下:public static String convertString(String str) if (str = null) return null; try byte buf = str.g

26、etBytes(“ISO8859_1“);return new String(buf, “Shift_JIS“); catch (Exception ex) ex.printStackTrace();return null; 不过在最新的 Servlet2.3 与 Jsp1.2 中可以通过 request.setCharacterEncoding 来进行设置取值的码制, 不需要自己再做转换。2因为 Java 在计算 String 的长度是以字符为单位的, 因此一个全角与半角的字符长度是一样的, 但是 DB 中往往是根据字节来计算长度的, 因此我们在做 Check 的时候得要判断 String

27、的字节长, 可以用以下的方法:public static String length(String str) if (str = null) return 0; return str.getBytes().length;4数值,字符,布尔对象与简单类型的操作简单的对照表如下:Object Primitive 范围Long long -9223372036854775808 to 9223372036854775807Integer int -2147483648 to 2147483647Short short -32768 to 32767Byte byte -128 to 127Doubl

28、e doubleNumberFloat floatCharacter char u0000 to uffffBoolean boolean false and true与 C 等其它语言不同的是数值的范围不随平台的改变而改变, 这就保证了平台之间的统一性,提高了可移植性。Number: Number 本身是个抽象类, 不能直接使用, 所有直接从 Number 继承下来的子类都有以下几种方法: byte byteValue() 返回字节值 double doubleValue() 返回 double 值 float floatValue() 返回 float 值 int intValue() 返

29、回 float 值 long longValue() 返回 long 值 short shortValue() 返回 short 值在需要通过 Object 来取得简单数据类型的值的时候就得用到以上的方法, 不过我不推荐不同类型之间的取值, 比如 Long 型的 Object 不要直接去调用 intValue(),精度可能会丢失。如果想通过 String 来得到一个数值类型的简单类型值, 一般在每个 Number 的类里面都有一个parseXXX(String)的静态方法, 如下: byte Byte.parseByte(String s) double Double.parseDouble(

30、String s) float Float.parseFloat(String s) int Integer.parseInt(String s) long Long.parseLong(String s) short Short.parseShort(String s)如果想直接从 String 得到一个 Number 型的 Object,则每个 Number 类里面都有 valueOf(String s)这个静态方法。如: Byte Byte.valueOf(String s) Double Double.valueOf(String s) Float Float.valueOf(Stri

31、ng s) Integer Integer.valueOf(String s) Long Long.valueOf(String s) Short Short.valueOf(String s)一般的在构造一个 Number 的时候都可以通过一个 String 来完成, 比如:Long longObject = new Long(“1234567890”);等价于Long longObject = Long.valueOf(“1234567890”);因为每个 Number 的子类都实现了 Object 的 toString()方法, 所以, 如果想得到一个 String 型的数值, 直接调用

32、 XXX.toString()就可以了。 如果想得到一个简单类型的 String, 方法很多总结如下: 首先生成对应的 Number Object 类型, 然后调用 toString() 调用 Number 子类 .toString(type t) 其中 t 就是简单类型的数据。 调用 String.valueOf(type t) (推荐使用这种方法)大家可以看出, 往往一种结果可以用多种方法实现, 总的原则就是深度最少优先。比如由一个String 得到一个简单类型的值可以有以下两种方法:Integer.parseInt(“12345”);或(new Integer(s).intValue(“

33、12345”);当然应该使用第一种方法。Character: Character 对应着 char 类型, Character 类里面有很多静态的方法来对 char 进行判断操作, 详细的操作请参照 JDK API。 Java 对字符的判断操作基本都是以 Unicode 进行的, 比如 Character.isDigit(char ch)这个方法, 不光半角的 0-9 符合要求, 全角的日文 0-9 也是符合要求的。Boolean: Boolean 对应着 boolean 类型, boolean 只有 true 和 false 两个值, 不能与其它数值类型互换, 可以通过字符串”true”以及

34、”false”来得到 Object 的 Boolean, 也可以通过简单类型的boolean 得到 Boolean, 常用方法如下: Boolean(boolean value) 通过简单类型的 boolean 构造 Boolean Boolean(String s) 通过 String(“true”, “false”)构造 Boolean boolean booleanValue() 由 Object 的 Boolean 得到简单类型的 boolean 值 boolean equals(Object obj) 覆盖了 Object 的.equals 方法, Object 值比较 static

35、 Boolean valueOf(String s) 功能与构造函数 Boolean(String s)一样5Class, ClassLoaderJava 是一种介于解释与编绎之间的语言, Java 代码首先编绎成字节码, 在运行的时候再翻译成机器码。 这样在运行的时候我们就可以通过 Java 提供的反射方法 (reflect)来得到一个 Object的 Class 的额外信息, 灵活性很大,可以简化很多操作。Class: 任何一个 Object 都能通过 getClass()这个方法得到它在运行期间的 Class。 得到这个 Class之后可做的事情就多了, 比如动态得到它的构造函数, 成员

36、变量, 方法等等。 还可以再生成一份新的实例, 下面只给出几个我们常用的方法, 更详细的用法参照 Java API Class Class.forName(String className) throws ClassNotFoundException: 这是个静态方法, 通过一个 Class 的全称来得到这个 Class。 String getName() 取得这个 Class 的全称, 包括 package 名。 Object newInstance() 得到一个实例, 调用缺省的构造函数。例如我们有一个类: com.some.util.MyClass 如果得到它的一个实例呢? 可能有以下两

37、种方法:MyClass myClass = new MyClass(), 直接通过操作符 new 生成;或者:MyClass myClass = (MyClass) Class.forName(“com.some.util.MyClass”).newInstance();也许有人就会怀疑第二种方法实际意义, 能够直接 new 出来干嘛绕弯。 但实际上它的用处却很大, 举个例子: 用过 struts 的人都知道, 在 action-config.xml 当中定义了一系列的formBean 与 actionBean, 当然每个 form 与 action 都具有同类型, 这样在一个 request

38、 过来的时候我可以动态的生成一个 form 与 action 的实例进行具体的操作, 但在编码的时候我并不知道具体是何种的 form 与 action, 我只调用它们父类的方法。 你如果要用第一种方法的话, 你得在编码的时候通过一个标志来判断每一次 request 需要具体生成的 form 与 action, 代码的灵活性大大降低。 总的来说在面向接口的编程当中经常使用这种方法, 比如不同数据库厂家的JDBC Driver 都是从标准的 JDBC 接口继承下去的, 我们在写程序的时候用不着管最终是何种的 Driver, 只有在运行的时候确定。 还有 XML 的 Parser 也是, 我们使用的

39、只是标准的接口,最后到底是谁来实现它的, 我们用不着去管。ClassLoader: ClassLoader 是一个抽象类,一般的系统有一个缺省的 ClassLoader 用来装载Class, 用 ClassLoader.getSystemClassLoader()可以得到。不过有时候为了安全或有其它的特殊需要我们可以自定义自己的 ClassLoader 来进行 loader 一些我们需要的 Class, 比如有的产品它用了自己的 ClassLoader 可以指定 Class 只从它指定的特定的 JAR 文件里面来 loader,如果你想通过覆盖 ClassPath 方法来想让它用你的 Clas

40、s 是行不通的。 有兴趣的可以参照 Java API 的更详细的用法说6. Java IO系统JDK1.0 输入流InputStreamByteArrayInputStreamFileInputStreamFilterInputStreamObjectInputStreamPipedInputStreamSequenceInputStreamBufferedInputStreamDataInputStreamPushbackInputStreamLineNumberInputStreamJDK1.1 输入流ReaderBufferedReaderFilterReaderPipedReaderS

41、tringReaderInputStreamReaderCharArrayReaderFileReaderPushbackReaderLineNumberReaderJDK1.0 输出流OutputStreamBufferedOutputStreamDataOutputStreamPrintStreamByteArrayOutputStreamFileOutputStreamFilterOutputStreamObjectOutputStreamPipedOutputStreamJDK1.1 输出流WriterBufferedWriterFilterWriterPipedWriterStrin

42、gWriterFileWriterPrintWriterOutputStreamWriterCharArrayWriter如果你刚刚接触 Java 的 IO 部分, 你可能会感觉无从入手, 确实 Java 提供了过多的类,反而让人感到很乱。可将 Java 库的 IO 类分为输入与输出两个部分, 在 1.0 版本中提供了两个抽象基类, 所有输入的类都从 InputStream 继承, 所有输出的类都从 OutputStream 继承, 1.1 提供了两个新的基类,负责输入的 Reader 与输出的 Writer, 但它们并不是用来替换原来老的 InputStream 与OutputStream,

43、 它们主要是让 Java 能更好的支持国际化的需求。 原来老的 IO 流层只支持 8 位字节流, 不能很好地控制 16 位 Unicode 字符。 Java 内含的 char 是 16 位的 Unicode, 所以添加了 Reader 和 Writer 层次以提供对所有 IO 操作中的 Unicode 的支持。 除此之外新库也对速度进行了优化, 可比旧库更快地运行。InputStream 的类型:1 字节数组2 String 对象3 文件4 管道, 可以从另外一个输出流得到一个输入流5 一系列的其他流, 可以将这些流统一收集到单独的一个流内。6 其他起源(如 socket 流等)还有一个是 F

44、ile 类, Java 中一个目录也是一个文件,可以用 file.isFile()和 file.isDirectory()来进行判断是文件还是目录。 File 对象可能作为参数转换为文件流进行操作。 具体操作参照 Java IO API。常用方法:/* 拼文件名, 在 windows()跟 unix(/)上的文件分割符是不一样的* 可以通过 File 类的静态成员变量 separator 取得*/public static String concatFileName(String dir, String fileName) String fullFileName = “;if (dir.end

45、sWith(File.separator) fullFileName = dir + fileName; else fullFileName = dir + File.separator + fileName;return fullFileName; /* 从控制台读取输入的数据, System.in (InputStream) 先转换至 InputStreamReader 再用* BufferedReader 进行读取.*/BufferedReader in = new BufferedReader(new InputStreamReader(System.in);String str =

46、“;while (str != null) str = in.readLine();/ process(str); /* 从文件中按行进行读取数据处理*/BufferedReader in = new BufferedReader(new FileReader(“infilename“);String str;while (str = in.readLine() != null) / process(str); in.close();/* 写数据至一个新的文件中去.*/BufferedWriter out = new BufferedWriter(new FileWriter(“outfile

47、name“);out.write(“a String“);out.close();/* 追加新的数据到一个文件中去, 如果原文件不存在* 则新建这个文件.*/BufferedWriter out = new BufferedWriter(new FileWriter(“filename“, true);out.write(“aString“);out.close();/* 将一个可序列化的 Java 的 object 以流方式写到一个文件中去中.*/ObjectOutput out = new ObjectOutputStream(new FileOutputStream(“filename.

48、ser“);out.writeObject(object);out.close();/* 从文件中恢复序列化过的 Java Object*/ObjectInputStream in = new ObjectInputStream(new FileInputStream(“filename.ser“);Object object = (Object) in.readObject();in.close();/* 以指定的编码方式从文件中读取数据*/BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(“infilename“), “UTF8“);String str = in.readLine();/* 以指定的编码方式写数据到文件中*/Writer

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报