Java学习笔记 (二)
泛型
泛型可以解决数据类型的安全问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。
如果一个类中有多个属性需要使用不同的泛型声明,则可以在声明类时指定多个泛型类型。
在泛型操作中也可以通过通配符接收任意指定泛型类型的对象。
声明泛型类和泛型接口的语法类似,也是在接口名称后面加<T>
。
在引用传递中,在泛型操作中也可以设置一个泛型对象的范围上限和范围下限。范围上限使用extends
关键字声明,表示参数化的类型可能是所指定的类型或者是此类型的子类,而范围下限使用super
关键字声明,表示参数化的类型可能是所指定的类型,或者此类型的父类型,或是Object
类。
内存流
ByteArrayInputStream : 将内容写到内存中
ByteArrayOutputStream : 将内存中数据输出
内存操作一般在生成一些临时信息时才会使用,而这些信息如果要保存在文件中,则代码执行完后肯定还要删除这个临时文件,此时使用内存操作流最合适的。
管道流
PipedOutputStream : 管道输出流
PipedInputStream : 管道输入流
管道流主要作用是可以进行两个线程间的通信,使用时需要用connect
连接管道。
打印流
PrintStream是OutputStream的子类。
PrintStream : 字节打印流
PrintWrite : 字符打印流
System类中的对IO的支持
# | 类 名 | 说 明 | 重定向方法 |
---|---|---|---|
1 | system.out | 对应系统标准输出,一般是显示器 | setOut |
2 | system.err | 错误信息输出 | setErr |
3 | system.in | 对应着标准输入,一般是键盘 | setIn |
输出中文字符时候如果使用字节流输出有可能是乱码,因为一个汉字是俩个字节,分两次读取,造成了乱码。使用'BufferedReader'类可以一次性从内存中读取全部数据。
BufferedReader类
用于从缓冲区中读取内容。BufferedReader
类中定义的构造方法只能接收字符输入流的实例,所以必须使用字符输入流和字节输入流的转换类InputStreamReader
将字节输入流system.in
变为字符流。
BufferedReader buf = null;
buf = new BufferedReader (new InputStreamReader(System.in));
管道流
管道输出流(PipedOutputStream)
和管道输入流(PipedInputStream)
可以进行两个线程间的通信,使用connect
连接上。
打印流
格式化输出
字 符 |
描 述 |
---|---|
%s |
表示内容为字符串 |
%d |
表示内容为整数 |
%f |
表示内容为小数 |
%c |
表示内容为字符 |
import java.io.* ;
public class PrintDemo02{
public static void main(String arg[]) throws Exception{
PrintStream ps = null ; // 声明打印流对象
// 如果现在是使用FileOuputStream实例化,意味着所有的输出是向文件之中
ps = new PrintStream(new FileOutputStream(new File("d:" + File.separator + "test.txt"))) ;
String name = "李四" ; // 定义字符串
int age = 30 ; // 定义整数
float score = 990.356f ; // 定义小数
char sex = 'M' ; // 定义字符
ps.printf("姓名:%s;年龄:%d;成绩:%f;性别:%c",name,age,score,sex) ;
ps.close() ;
}
};
if(str.matches("^\\d{4}-\\d{2}-\\d{2}$")){ // 判断是否由数字组成
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd") ;
try{
temp = sdf.parse(str) ; // 将字符串变为Date型数据
}catch(Exception e){}
flag = false ; // 结束循环
}else{System.out.println(err); // 打印错误信息
}
正则:
if (str.matches("^\\d+$")); // 判断是否是数字
if(str.matches("^\\d{4}-\\d{2}-\\d{2}$"));//判断是否是日期
if(str.matches("^\\d+.?\\d+$")); // 判断是否由小数组成
Scanner类接收输入数据
在Scanner类中提供了一个可以接收InputStream类型的构造方法,这就表示只要是字节输入流的子类都可以通过scanner类进行方便的读取,也可对输入数据进行验证。
数据操作流
数据输出流DataOutputStream是OutputStream的子类
数据输入流DataInputStream是InputStream的子类,专门负责读取DataOutputStream 输出的数据。
文字编码
String
类中的getBytes(String charset)
可以设置指定的编码,实现编码转换。
public Byte[] getBytes(String charset);
// 例:
public class CharSetDemo02{
public static void main(String args[]) throws Exception {
File f = new File("D:" + File.separator + "test.txt") ; // 实例化File类
OutputStream out = new FileOutputStream(f) ; // 实例化输出流
byte b[] = "中国,你好!".getBytes("ISO8859-1") ; // 转码操作
out.write(b) ; // 保存
out.close() ; // 关闭
}
};
对象序列化
对象序列化就是把一个对象变为二进制的数据流的一种方法,方便实现对象的传输和存储。
需要实现java.io.Serializable接口。
输入输出流
主要分为字节流(OutputStream,InputStream)和字符流(Writer,Reader)两种,但是在传输中以字节流操作较多,字符流在操作时使用到缓冲区,而字节流没有。
在IO包中可以使用OutputStreamWriter和InputStreamReader完成字符流与字节流之间的转换操作。
使用ByteArrayInputStream和ByteArrayOutputStream类可以对内存进行输入输出操作。
在线程之间进行输入输出通信,主要使用PipedOutputStream和PipedInputStream类。
在IO中输出时最好使用打印流(PrintStream,PrintWriter)这样方便输出各种类型的数据。
使用BufferedReader可以直接从缓冲区中读取数据。
使用Scanner类可以方便进行输入流操作。
用合并流(SequenceInputStream)可以将两个文件的内容进行合并。
如果数据流过大可以使用压缩流压缩数据,在java中支持zip,jar,gzip 3种压缩格式。
使用回退流可以将不需要的数据回退到数据缓冲区以待重新读取。
造成字符乱码的根本原因在于程序编码与本地编码的不统一。
对象序列化可以将内存中的对象转化为二进制数据,但对象所在的类必须实现Serializable接口,一个类中的属性如果使用transient关键字声明,则此属性的内容将不会被序列化。
对象的输入输出主要使用ObjectInputStream和ObjectOutputStream两个类完成。
- OutputStream
- FileOutputStream
- ByteArrayOutputStream
- PipedOutputStream
- FilterOutputStream
- PrintStream
- DataOutputStream
- DeflaterOutputStream
- ZipOutputStream
- ObjectOutputStream
- InputStream
- FileInputStream
- ByteArrayInputStream
- PipedInputStream
- FilterInputStream
- PushbackInputStream
- DataInputStream
- InflaterStream
- ZipInputStream
- ObjectInputStream
-
Write
- OutputStreamWriter
- FileWriter
- PrintWriter
- OutputStreamWriter
-
Reader
- InputStreamReader
- FileReader
- BufferedReader
- FileReader
- PushbackReader
- InputStreamReader
java 类集
类集作用:
类集实际上就是一个动态的对象数组,与一般的对象数组不同,类集的对象内容可以任意扩充。
类集的特征:
- 这种框架是高性能的
- 框架必须允许不同类型的类集以相同的方式和高度互操作方式工作
- 类集必须是容易扩展和修改的
对象数组中包含一组对象,但对象数组使用的时候存在一个长度限制,那么类集是专门解决这种限制的,使用类集可以方便的向数组增加任意多个数据。
对象数组的操作中基本上都要保证对象类型的一致性,对于类集而言本身其内部的元素也应该保持一致,不管是何种类型的数据,所有的操作方式都应该是一样的。
类集框架主要接口
No. | 接口 | 描述 |
---|---|---|
1 | Collection | 是存放一组单值的最大接口,所谓的单值是指集合中的每个元素都是一个对象,一般会很少直接使用此接口直接操作。 |
2 | List | 是Collection接口的子接口,也是最常用的接口,此接口对Collection进行了大量的扩充,里面的内容是允许重复的。 |
3 | Set | 是Collection接口的子接口,没有对Collection接口进行扩充,里面不允许存放重复内容。 |
4 | Map | Map是存放一对值的最大接口,即接口中的每个元素都是一对,以key->value的形式保存。 |
5 | Iterator | 集合的输出接口,用于输出集合中的内容,只能进行从前到后的单向输出。 |
6 | ListIterator | 是Iterator的子接口,可以进行双向输出。 |
7 | Enumeration | 是最早的输出接口,用于输出集合中指定的内容。 |
8 | SortedSet | 单值的排序接口,实现此接口的集合类,里面的内容可以使用比较器排序。 |
9 | SortedMap | 存放一对值的排序接口,实现此接口的集合类,里面的内容按照key排序,使用比较器排序。 |
10 | Queue | 队列接口,此接口的子类可以实现队列操作(FIFO, First-In-First-Out) |
11 | Map.Entry | Map.Entry的内部接口,每个Map.Entry对象都保存着一对key->value的内容,每个Map接口中都保存多个Map.Entry接口实例。 |
以上的接口必须全部掌握,并且掌握各个接口的主要特点。
接口的继承关系
Collection接口:
Collection
List Set Queue SortedSet
Map接口:
Map SortedMap
Collection接口的定义
Collection是保存单值集合的最大父接口。
Collection接口定义:
public interface Collection<E> extends Iterable<E>
JDK1.5之后为Collection接口增加了泛型声明
所有的类集操作都存放在java.util包中。
Collection接口的方法定义。
No. | 方法 | 类型 | 描述 |
---|---|---|---|
1 | public boolean add(E o) | 普通 | 向集合中插入对象 |
2 | public boolean addAll(Collection<? extend E?> c) | 普通 | 将一个集合的内容插入进来 |
3 | public void clear() | 普通 | 清除此集合中的所有元素 |
4 | public boolean contains(Object o) | 普通 | 判断某一个对象是否在集合中存在 |
5 | public boolean containsAll(Collection<?> c) | 普通 | 判断一组对象是否在集合中存在 |
6 | public boolean equals(Object o) | 普通 | 对象比较 |
7 | public int hashCode() | 普通 | 哈希码 |
8 | public boolean isEmpty() | 普通 | 集合是否为空 |
9 | public Iterator<E> iterator() | 普通 | 为Iterator接口实例化 |
10 | public boolean remove(Object o) | 普通 | 删除指定对象 |
11 | public boolean removeAll(Collection<?> c) | 普通 | 删除一组对象 |
12 | public boolean retainAll(Collection<?> c) | 普通 | 保存指定内容 |
13 | public int size() | 普通 | 求出集合的大小 |
14 | public Object[] toArray() | 普通 | 将一个集合变为对象数组 |
15 | public <T> T[] toArray(T[] a) | 普通 | 指定好返回的对象数组类型 |
Collection在EJB2.x中大量使用了Collection接口,但是随着发展,sun公司开始将这些标准逐步的规范化,所以在sun一个开源——宠物商店,基本上就不再直接使用Collection,而使用List或Set,这样来说可以更加清楚的表示出操作的类型。
Collection子接口的定义
Collection接口虽然是集合的最大接口,但是如果直接使用Collection接口进行操作的话,则表示的操作意义不明确,所以在java开发中已经不提倡直接使用Collection接口了,主要的以子接口下:
List接口:可以存放重复内容
Set接口:不能存放重复内容,所有重复内容靠hashCode()和equals()两个方法区分的。
SortedSet接口:可以对集合中的数据进行排序
Queue列队接口(FIFO):堆栈列队