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
  • Reader

    • InputStreamReader
      • FileReader
    • BufferedReader
    • FileReader
      • PushbackReader
java 类集

类集作用:
类集实际上就是一个动态的对象数组,与一般的对象数组不同,类集的对象内容可以任意扩充。
类集的特征:

  1. 这种框架是高性能的
  2. 框架必须允许不同类型的类集以相同的方式和高度互操作方式工作
  3. 类集必须是容易扩展和修改的

对象数组中包含一组对象,但对象数组使用的时候存在一个长度限制,那么类集是专门解决这种限制的,使用类集可以方便的向数组增加任意多个数据。
对象数组的操作中基本上都要保证对象类型的一致性,对于类集而言本身其内部的元素也应该保持一致,不管是何种类型的数据,所有的操作方式都应该是一样的。

类集框架主要接口

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):堆栈列队

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,621评论 18 399
  • 1.十进制-->二进制:十进制转为二进制主要是对十进制数进行除2运算 2.二进制-->十进制:二进制乘以2的过程 ...
    晨星资源阅读 391评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,649评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,949评论 6 13
  • 今早去吃了煎饼果子,里面的薄脆很好吃,由于中午不知道点什么外卖就早上又多吃了两个包子来顶饿。早饭对我来说实在是很重...
    云时之间阅读 136评论 0 3