最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

API+IO+泛型+集合基礎(chǔ)

2023-02-12 00:22 作者:鹿是不是鹿  | 我要投稿

大家好,?我是鹿是不是鹿, 以下是關(guān)于API+IO+泛型+集合相關(guān)的一些基礎(chǔ)知識, 希望大家喜歡。

1.API

API:Application Programming Interface應(yīng)用編程接口,一切可以調(diào)用的東西都是API。

java.lang包,這個(gè)包會自動導(dǎo)入。

java.lang.Object

java.lang.String

java.lang.StringBuilder/StringBuffer

正則表達(dá)式

包裝類等

1.1??Object

1.1.1?????概念

所有對象的頂級父類

存在于java.lang包中,這個(gè)包不需要我們手動導(dǎo)包

1.1.2?????常用方法

boolean equals(Object obj)

??????????指示其他某個(gè)對象是否與此對象“相等”。

protected??void finalize()

??????????當(dāng)垃圾回收器確定不存在對該對象的更多引用時(shí),由對象的垃圾回收器調(diào)用此方法。

?int hashCode()

??????????返回該對象的哈希碼值。

?String toString()

??????????返回該對象的字符串表示。

1.1.3?????toString()?

默認(rèn)返回???類名@地址??的格式,來展示對象的地址值,如:a00000.Student@a0834e7。

如果想看屬性值我們可以重寫這個(gè)方法,重寫后返回的就是把屬性值拼接成一個(gè)字符串。

如:Student [name=蘇大強(qiáng), age=20, id=10001]

1.1.4?????equals(Object obj)?

1.1.5?????hashCode()

返回該對象的哈希碼值。

1.2??String

字符串對象

1.2.1?????特點(diǎn)

是一個(gè)封裝char[]數(shù)組的對象


字符串不可變

1.2.2?????創(chuàng)建String對象


1、?如果是第一次使用字符串,java會在字符串常量池創(chuàng)建一個(gè)對象。

2、?再次使用相同的內(nèi)容時(shí),會直接訪問常量池中存在的對象。

方式1:new String(char[])??????????????????????????????????????????????????????????

其實(shí)字符串底層維護(hù)了一個(gè)char[]

char[]?c?= {'a','b','c','d'};

String?s?=?new?String(c);//堆中分配新的內(nèi)存

System.out.println(s);

方式2:直接創(chuàng)建

常量池里直接創(chuàng)建對象(本質(zhì)還是char[]),再次使用相同內(nèi)容,會去常量池中找到已經(jīng)存在的對象,不會新建。

String?s2="abcd";//常量池中分配新的內(nèi)存

System.out.println(s2);

System.out.println(s==s2);//地址不同

System.out.println(s.equals(s2));//內(nèi)容相同

???????????????????????????

//如果使用過了就不再創(chuàng)建,引用存在的對象

String?s3="abcd";//訪問常量池中已經(jīng)存在的對象

System.out.println(s3==s2);//true

1.2.3?????字符串連接效率

利用String類,在做字符串拼接的過程效率極其低下。

1.2.4?????常用方法

length()

charAt()

lastIndexOf()

substring()

equals()

startsWith()

endsWith()

split()

trim()?去除字符串兩端的空格

1.2.5?????測試

1.3??StringBuilder/StringBuffer

1.3.1?????特點(diǎn)

1、??封裝了char[]數(shù)組

2、??是可變的字符序列

3、??提供了一組可以對字符內(nèi)容修改的方法

4、??常用append()來代替字符串做字符串連接

5、??內(nèi)部字符數(shù)組默認(rèn)初始容量是16:initial capacity of 16 characters

6、??如果大于16會嘗試將擴(kuò)容,新數(shù)組大小原來的變成2倍+2,容量如果還不夠,直接擴(kuò)充到需要的容量大小。int newCapacity = value.length * 2 + 2;

7、??StringBuffer 1.0出道線程安全,StringBuilder1.5出道線程不安全

1.3.2?????練習(xí):測試字符串連接

1.3.3?????方法

append()

charAt()

?

1.4??包裝類

1.4.1?????與基本類型的對應(yīng)關(guān)系


1.4.2?????Number

數(shù)字包裝類的抽象父類。

子類:

常用的方法:

提供了各種獲取值的方式,已經(jīng)完成了強(qiáng)轉(zhuǎn)。

1.4.3?????Integer

創(chuàng)建對象

new Integer(5);新建對象

Integer.valueOf(5);

在Integer類中,包含256個(gè)Integer緩存對象,范圍是?-128到127。

使用valueOf()時(shí),如果指定范圍內(nèi)的值,訪問緩存對象,而不新建;如果指定范圍外的值,直接新建對象。

Integer?a?=?new?Integer(5);//創(chuàng)建對象

Integer?b?= Integer.valueOf(5);//讀取緩存

Integer?c?= Integer.valueOf(5);//讀取緩存

System.out.println(b==c);//true

System.out.println(a==b);//false

System.out.println(a.equals(b));//true

方法

parseInt();字符串轉(zhuǎn)換成int

toBinaryString();把整數(shù)轉(zhuǎn)換成2進(jìn)制數(shù)據(jù)

toOctalString();把整數(shù)轉(zhuǎn)換成8進(jìn)制數(shù)據(jù)

toHexString();把整數(shù)轉(zhuǎn)換成16進(jìn)制數(shù)據(jù)

1.4.4?????Double

創(chuàng)建對象

new Double(3.14)

Double.valueOf(3.14)//和?new?沒有區(qū)別

方法

Double.parseDouble();

1.5??日期類Date

1.5.1?????概述

存在于java.util.Date包。

用來封裝一個(gè)毫秒值表示一個(gè)精確的時(shí)間點(diǎn)。

從1970-1-1??0點(diǎn)開始的毫秒值。

1.5.2?????創(chuàng)建對象

new Date():封裝的是系統(tǒng)當(dāng)前時(shí)間的毫秒值

new Date(900000000000L):封裝指定的時(shí)間點(diǎn)

1.5.3?????常用方法

getTime():取內(nèi)部毫秒值

setTime():存取內(nèi)部毫秒值

getMonth():獲取當(dāng)前月份

getHours():獲取當(dāng)前小時(shí)

compareTo(Date):當(dāng)前對象與參數(shù)對象比較。當(dāng)前對象大返回正數(shù),小返回負(fù)數(shù),相同0。

1.5.4?????練習(xí)1:測試日期類的常用方法

1.6??日期工具SimpleDateFormat

1.6.1?????概述

日期格式化工具,可以把Date對象格式化成字符串,也可以日期字符串解析成Date對象。

1.6.2?????創(chuàng)建對象

new SimpleDateFormat(格式)

格式:yyyy-MM-dd HH:mm:ss

MM/dd/yyyy..

1.6.3?????常見方法

format(Date):把Date格式化成字符串

parse(String):把String解析成Date

1.6.4?????練習(xí)1?:計(jì)算存活天數(shù)

接收用戶輸入的出生日期,計(jì)算存活天數(shù)

1.7??拓展

1.7.1?????進(jìn)制

概念

進(jìn)制也就是進(jìn)位計(jì)數(shù)制,是人為定義的帶進(jìn)位的計(jì)數(shù)方法,類似于統(tǒng)計(jì)“正”字。

對于任何一種進(jìn)制---X進(jìn)制,就表示每一位置上的數(shù)運(yùn)算時(shí)都是逢X進(jìn)一位。

十進(jìn)制是逢十進(jìn)一,十六進(jìn)制是逢十六進(jìn)一,二進(jìn)制就是逢二進(jìn)一,以此類推。

通常情況下,1byte=8個(gè)二進(jìn)制位

所以表示一個(gè)數(shù)字用二進(jìn)制來表示的話就可以這樣表示:0000 0000

把這8個(gè)位進(jìn)行組合,每三位組合就形成了八進(jìn)制,每四位組合就形成了十六進(jìn)制。

特點(diǎn)

二進(jìn)制:0和1,逢二進(jìn)一,以0b開始

八進(jìn)制:0-7,逢八進(jìn)一,以0開始

十進(jìn)制:0-9,逢十進(jìn)一

16進(jìn)制:0-9,abcdef,逢16進(jìn)一,以0x開始

?

進(jìn)制的轉(zhuǎn)化:

十進(jìn)制轉(zhuǎn)二進(jìn)制:不斷除以2商0為止,取余,倒著寫。

把十進(jìn)制11轉(zhuǎn)成2進(jìn)制:1011。

二進(jìn)制轉(zhuǎn)十進(jìn)制:從低位次,每位乘以2的位次次冪??再求和。

計(jì)算二進(jìn)制數(shù)據(jù):0000 1101對應(yīng)的十進(jìn)制

計(jì)算二進(jìn)制數(shù)據(jù):0110 1110對應(yīng)的十進(jìn)制

二進(jìn)制轉(zhuǎn)八進(jìn)制:從低位次開始,每三位為一組,產(chǎn)生一個(gè)八進(jìn)制數(shù)字,最高位不足補(bǔ)零。

計(jì)算二進(jìn)制數(shù)據(jù)110 0111對應(yīng)的八進(jìn)制

八進(jìn)制轉(zhuǎn)二進(jìn)制:把一個(gè)數(shù)字轉(zhuǎn)為3個(gè)數(shù)字,不足三位的,最高位補(bǔ)零。

計(jì)算八進(jìn)制數(shù)據(jù):023 0653對應(yīng)的二進(jìn)制數(shù)據(jù)

1.7.2?????StringBuilder和StringBuffer的區(qū)別

1、?在線程安全上,

--StringBuffer是舊版本就提供的,線程安全的。@since???JDK1.0

--StringBuilder是jdk1.5后產(chǎn)生,線程不安全的。@since???????1.5

2、?在執(zhí)行效率上,StringBuilder > StringBuffer > String

3、?源碼體現(xiàn):本質(zhì)上都是在調(diào)用父類抽象類AbstractStringBuilder來干活,只不過Buffer把代碼加了同步關(guān)鍵字,使得程序可以保證線程安全問題。

abstract class AbstractStringBuilder implements Appendable, CharSequence {

1.7.3?????自動裝箱和自動拆箱

自動裝箱:把基本類型包裝成一包裝類的對象

Integer a = 5;//a是引用類型,引用了包裝對象的地址。

編譯器會完成對象的自動裝箱:Integer a = Integer.valueOf(5);

自動拆箱:從包裝對象中,自動取出基本類型值

????int i = a;//a現(xiàn)在是包裝類型,沒法給變量賦值,需要把5取出來。

編譯器會完成自動拆箱:int i = a.intValue();


2.1??BigDecimal/BigInteger

2.1.1?????概述

BigDecimal:常用來解決精確的浮點(diǎn)數(shù)運(yùn)算。

BigInteger:常用來解決超大的整數(shù)運(yùn)算。

2.1.2?????創(chuàng)建對象

BigDecimal.valueOf(2);

2.1.3?????常用方法

add(BigDecimal bd): 做加法運(yùn)算

substract(BigDecimal bd)?: 做減法運(yùn)算

multiply(BigDecimal bd)?: 做乘法運(yùn)算

divide(BigDecimal bd)?: 做除法運(yùn)算

divide(BigDecimal bd,保留位數(shù),舍入方式):除不盡時(shí)使用

setScale(保留位數(shù),舍入方式):同上

pow(int n):求數(shù)據(jù)的幾次冪

2.1.4?????練習(xí)1:測試常用方法

接收用戶輸入的兩個(gè)數(shù)字,做運(yùn)算。

2.2??IO簡介

2.2.1?????繼承結(jié)構(gòu)

in/out相對于程序而言的輸入(讀取)和輸出(寫出)的過程。

在Java中,根據(jù)處理的數(shù)據(jù)單位不同,分為字節(jié)流和字符流

java.io包:

File

字節(jié)流:針對二進(jìn)制文件

InputStream

--FileInputStream

--BufferedInputStream

--ObjectInputStream

OutputStream

--FileOutputStream

--BufferedOutputStream

--ObjectOutputStream

字符流:針對文本文件。讀寫容易發(fā)生亂碼現(xiàn)象,在讀寫時(shí)最好指定編碼集為utf-8

Writer

--BufferedWriter

--OutputStreamWriter

Reader

--BufferedReader

--InputStreamReader

--PrintWriter/PrintStream

2.2.2?????流的概念

數(shù)據(jù)的讀寫抽象成數(shù)據(jù),在管道中流動。

???流只能單方向流動

???輸入流用來讀取in

???輸出流用來寫出Out

???數(shù)據(jù)只能從頭到尾順序的讀寫一次

2.3??File文件流

2.3.1?????概述

封裝一個(gè)磁盤路徑字符串,對這個(gè)路徑可以執(zhí)行一次操作。

可以用來封裝文件路徑、文件夾路徑、不存在的路徑。

2.3.2?????創(chuàng)建對象

File(String pathname)

??????????通過將給定路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建一個(gè)新?File?實(shí)例。

2.3.3?????常用方法

文件、文件夾屬性

length():文件的字節(jié)量

exists():是否存在,存在返回true

isFile():是否為文件,是文件返回true

isDirectory():是否為文件夾,是文件夾返回true

getName():獲取文件/文件夾名

getParent():獲取父文件夾的路徑

getAbsolutePath():獲取文件的完整路徑

創(chuàng)建、刪除

createNewFile():新建文件,文件夾不存在會異常,文件已經(jīng)存在返回false

mkdirs():新建多層不存在的文件夾\a\b\c

mkdir():新建單層不存在的文件夾\a

delete():刪除文件,刪除空文件夾

文件夾列表

???????list():返回String[],包含文件名

???????listFiles():返回File[],包含文件對象

2.3.4?????練習(xí)1:測試常用方法

創(chuàng)建day10工程

創(chuàng)建cn.tedu.io包

創(chuàng)建Test1.java

2.3.5?????練習(xí)2:遞歸求目錄總大小

遞歸:不斷的調(diào)用方法本身。

2.4??字節(jié)流讀取

字節(jié)流是由字節(jié)組成的,字符流是由字符組成的. Java里字符由兩個(gè)字節(jié)組成.字節(jié)流是最基本的,所有的InputStream和OutputStream的子類都是,主要用在處理二進(jìn)制數(shù)據(jù)。

流式傳輸主要指將整個(gè)音頻和視頻及三維媒體等多媒體文件經(jīng)過特定的壓縮方式解析成一個(gè)個(gè)壓縮包,由視頻服務(wù)器向用戶計(jì)算機(jī)順序或?qū)崟r(shí)傳送。在采用流式傳輸方式的系統(tǒng)中,用戶不必像采用下載方式那樣等到整個(gè)文件全部下載完畢,而是只需經(jīng)過幾秒或幾十秒的啟動延時(shí)即可在用戶的計(jì)算機(jī)上利用解壓設(shè)備對壓縮的A/V、3D等多媒體文件解壓后進(jìn)行播放和觀看。此時(shí)多媒體文件的剩余部分將在后臺的服務(wù)器內(nèi)繼續(xù)下載。

2.4.1?????InputStream抽象類

此抽象類是表示字節(jié)輸入流的所有類的超類/抽象類。

常用方法:

abstract??int read()

??????????從輸入流中讀取數(shù)據(jù)的下一個(gè)字節(jié)。

?int read(byte[] b)

??????????從輸入流中讀取一定數(shù)量的字節(jié),并將其存儲在緩沖區(qū)數(shù)組?b?中。

?int read(byte[] b, int off, int len)

??????????將輸入流中最多?len?個(gè)數(shù)據(jù)字節(jié)讀入?byte?數(shù)組。

void close()

??????????關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源。

2.4.2?????FileInputStream子類

直接插在文件上,直接讀取文件數(shù)據(jù)。

創(chuàng)建對象

FileInputStream(File file)

??????????通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建一個(gè)?FileInputStream,該文件通過文件系統(tǒng)中的?File?對象?file?指定。

FileInputStream(String pathname)

??????????通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建一個(gè)?FileInputStream,該文件通過文件系統(tǒng)中的路徑名?name?指定。

2.4.3?????BufferedInputStream子類

BufferedInputStream?為另一個(gè)輸入流添加一些功能,即緩沖輸入以及支持?mark?和?reset?方法的能力。在創(chuàng)建?BufferedInputStream?時(shí),會創(chuàng)建一個(gè)內(nèi)部緩沖區(qū)數(shù)組(默認(rèn)8M大小)。在讀取或跳過流中的字節(jié)時(shí),可根據(jù)需要從包含的輸入流再次填充該內(nèi)部緩沖區(qū),一次填充多個(gè)字節(jié)。

創(chuàng)建對象

BufferedInputStream(InputStream?in)
??????????創(chuàng)建一個(gè)?BufferedInputStream?并保存其參數(shù),即輸入流?in,以便將來使用。

?

2.5??字符流讀取

常用于處理純文本數(shù)據(jù)。

2.5.1?????Reader抽象類

用于讀取字符流的抽象類。

常用方法:

int read()

??????????讀取單個(gè)字符。

int read(char[] cbuf)

??????????將字符讀入數(shù)組。

abstract??int read(char[] cbuf, int off, int len)

??????????將字符讀入數(shù)組的某一部分。

?int read(CharBuffer target)

??????????試圖將字符讀入指定的字符緩沖區(qū)。

abstract??void close()

??????????關(guān)閉該流并釋放與之關(guān)聯(lián)的所有資源。

?

2.5.2?????InputStreamReader子類

InputStreamReader?是字節(jié)流通向字符流的橋梁:它使用指定的?charset?讀取字節(jié)并將其解碼為字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認(rèn)的字符集。

?

創(chuàng)建對象

InputStreamReader(InputStream in, String charsetName)

??????????創(chuàng)建使用指定字符集的?InputStreamReader。

InputStreamReader(InputStream in)

??????????創(chuàng)建一個(gè)使用默認(rèn)字符集的?InputStreamReader。

2.5.3?????FileReader子類

用來讀取字符文件的便捷類。此類的構(gòu)造方法假定默認(rèn)字符編碼和默認(rèn)字節(jié)緩沖區(qū)大小都是適當(dāng)?shù)摹R约褐付ㄟ@些值,可以先在?FileInputStream?上構(gòu)造一個(gè)?InputStreamReader。

創(chuàng)建對象

FileReader(String?fileName)
??????????在給定從中讀取數(shù)據(jù)的文件名的情況下創(chuàng)建一個(gè)新?FileReader。

FileReader(File?file)
??????????在給定從中讀取數(shù)據(jù)的?File?的情況下創(chuàng)建一個(gè)新?FileReader

2.5.4?????BufferedReader子類

從字符輸入流中讀取文本,緩沖各個(gè)字符,從而實(shí)現(xiàn)字符、數(shù)組和行的高效讀取。

可以指定緩沖區(qū)的大小,或者可使用默認(rèn)的大小。大多數(shù)情況下,默認(rèn)值就足夠大了。

?

創(chuàng)建對象

BufferedReader(Reader in)

??????????創(chuàng)建一個(gè)使用默認(rèn)大小輸入緩沖區(qū)的緩沖字符輸入流。

2.6??練習(xí):文件的讀取

讀取指定文件

2.7??擴(kuò)展1

2.7.1?????字符流和字節(jié)流的區(qū)別

2.7.2?????字符流讀寫亂碼

new BufferedReader(new InputStreamReader(?,”utf-8”));

new BufferedWriter(new OutputStreamWriter(?,”utf-8”));

//默認(rèn)是系統(tǒng)的編碼,GBK寫出。

//如果打開和寫出的編碼用的表不一致,會造成亂碼。

OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("encode.txt"),"utf-8");

???????os.write("中國");

???????os.flush();

???

2.7.3?????常見字符編碼表

測試

@Test

????public?void?code()?throws?IOException {

???????String?s?=?"我愛你中國";

???????System.out.println(s.getBytes("utf-8").length);//15--unicode/u8一個(gè)漢字3字節(jié)存儲

???????System.out.println(s.getBytes("gbk").length);//10--中文雙字節(jié)

???????System.out.println(s.getBytes("unicode").length);//12--雙字節(jié)+2

???????System.out.println(s.getBytes("iso-8859-1").length);//5--單字節(jié)

????}

2.7.4?????JDK1.7新特性之IO關(guān)流

3.1??字節(jié)流寫出

3.1.1?????OutputStream抽象類

此抽象類是表示輸出字節(jié)流的所有類的超類。輸出流接受輸出字節(jié)并將這些字節(jié)發(fā)送到某個(gè)接收器。

常用方法:

void close()

??????????關(guān)閉此輸出流并釋放與此流有關(guān)的所有系統(tǒng)資源。

?void flush()

??????????刷新此輸出流并強(qiáng)制寫出所有緩沖的輸出字節(jié)。

?void write(byte[] b)

??????????將?b.length?個(gè)字節(jié)從指定的?byte?數(shù)組寫入此輸出流。

?void write(byte[] b, int off, int len)

??????????將指定?byte?數(shù)組中從偏移量?off?開始的?len?個(gè)字節(jié)寫入此輸出流。

abstract??void write(int b)

??????????將指定的字節(jié)寫入此輸出流。

3.1.2?????FileOutputStream子類

直接插在文件上,直接寫出文件數(shù)據(jù)

創(chuàng)建對象:

FileOutputStream(String name)

??????????創(chuàng)建一個(gè)向具有指定名稱的文件中寫入數(shù)據(jù)的輸出文件流。FileOutputStream(File file)

??????????創(chuàng)建一個(gè)向指定?File?對象表示的文件中寫入數(shù)據(jù)的文件輸出流。

FileOutputStream(File file,?boolean append) –追加

??????????創(chuàng)建一個(gè)向指定?File?對象表示的文件中寫入數(shù)據(jù)的文件輸出流。

3.1.3?????BufferedOutputStream子類

該類實(shí)現(xiàn)緩沖的輸出流。通過設(shè)置這種輸出流,應(yīng)用程序就可以將各個(gè)字節(jié)寫入底層輸出流中,而不必針對每次字節(jié)寫入調(diào)用底層系統(tǒng)。

創(chuàng)建對象

BufferedOutputStream(OutputStream?out)

創(chuàng)建一個(gè)新的緩沖輸出流,以將數(shù)據(jù)寫入指定的底層輸出流。

3.2??字符流寫出

3.2.1?????Writer抽象類

寫入字符流的抽象類。

常用方法:

void write(char[] cbuf)

??????????寫入字符數(shù)組。

abstract??void write(char[] cbuf, int off, int len)

??????????寫入字符數(shù)組的某一部分。

?void write(int c)

??????????寫入單個(gè)字符。

?void write(String str)

??????????寫入字符串。

?void write(String str, int off, int len)

??????????寫入字符串的某一部分。

abstract??void close()

??????????關(guān)閉此流,但要先刷新它。

?

3.2.2?????OutputStreamWriter子類

OutputStreamWriter?是字符流通向字節(jié)流的橋梁:可使用指定的?charset?將要寫入流中的字符編碼成字節(jié)。它使用的字符集可以由名稱指定或顯式給定,否則將接受平臺默認(rèn)的字符集。

?

創(chuàng)建對象

OutputStreamWriter(OutputStream out, String charsetName)

??????????創(chuàng)建使用指定字符集的?OutputStreamWriter。

?OutputStreamWriter(OutputStream out)

??????????創(chuàng)建使用默認(rèn)字符編碼的?OutputStreamWriter。

3.2.3?????FileWriter子類

用來寫入字符文件的便捷類。此類的構(gòu)造方法假定默認(rèn)字符編碼和默認(rèn)字節(jié)緩沖區(qū)大小都是可接受的。要自己指定這些值,可以先在?FileOutputStream?上構(gòu)造一個(gè)?OutputStreamWriter。

創(chuàng)建對象

?

FileWriter(String?fileName)
??????????根據(jù)給定的文件名構(gòu)造一個(gè)?FileWriter?對象。

FileWriter(String?fileName, boolean?append)
??????????根據(jù)給定的文件名以及指示是否附加寫入數(shù)據(jù)的?boolean?值來構(gòu)造?FileWriter?對象。

3.2.4?????BufferedWriter子類

將文本寫入字符輸出流,緩沖各個(gè)字符,從而提供單個(gè)字符、數(shù)組和字符串的高效寫入。 可以指定緩沖區(qū)的大小,或者接受默認(rèn)的大小。在大多數(shù)情況下,默認(rèn)值就足夠大了。

?

創(chuàng)建對象

BufferedWriter(Writer out)

??????????創(chuàng)建一個(gè)使用默認(rèn)大小輸出緩沖區(qū)的緩沖字符輸出流。

?

3.3??練習(xí):文件的寫出

把數(shù)據(jù)寫出到指定文件中。如果文件不存在會自動創(chuàng)建,文件夾不存在會報(bào)錯(cuò)。

3.4??IO綜合練習(xí)

3.4.1?????練習(xí)1:文件復(fù)制

from,to。讀取from的數(shù)據(jù)。寫出到to文件里

3.4.2?????練習(xí)2:批量讀寫

3.5??序列化?/?反序列化

3.5.1?????概述

序列化?(Serialization)是將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。

在序列化期間,對象將其當(dāng)前狀態(tài)寫入到臨時(shí)或持久性存儲區(qū)。以后,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。

序列化:利用ObjectOutputStream,對象的信息,按固定格式轉(zhuǎn)成一串字節(jié)值輸出并持久保存到磁盤化。

反序列化:利用ObjectInputStream,讀取磁盤中序列化數(shù)據(jù),重新恢復(fù)對象。

3.5.2?????特點(diǎn)/應(yīng)用場景

1、?需要序列化的文件必須實(shí)現(xiàn)Serializable接口以啟用其序列化功能。

2、?不需要序列化的數(shù)據(jù)可以被修飾為static的,由于static屬于類,不隨對象被序列化輸出。

3、?不需要序列化的數(shù)據(jù)也可以被修飾為transient臨時(shí)的,只在程序運(yùn)行期間,在內(nèi)存中存在不會被序列化持久保存。

4、?在反序列化時(shí),如果和序列化的版本號不一致時(shí),無法完成反序列化。

5、?每個(gè)被序列化的文件都有一個(gè)唯一id,如果沒有添加編譯器會根據(jù)類的定義信息計(jì)算產(chǎn)生一個(gè)版本號。

6、?常用于服務(wù)器之間的數(shù)據(jù)傳輸,序列化成文件,反序列化讀取數(shù)據(jù)。

7、?常用于使用套接字流在主機(jī)之間傳遞對象。

3.5.3?????ObjectOutputStream

ObjectOutputStream?將?Java?對象的基本數(shù)據(jù)類型和圖形寫入?OutputStream??梢允褂?ObjectInputStream?讀取(重構(gòu))對象。通過在流中使用文件可以實(shí)現(xiàn)對象的持久存儲。

ObjectOutputStream(OutputStream?out)
??????????創(chuàng)建寫入指定?OutputStream?的?ObjectOutputStream。

void?writeObject(Object obj)

??????????將指定的對象寫入?ObjectOutputStream。

3.5.4?????ObjectInputStream

ObjectInputStream?對以前使用?ObjectOutputStream?寫入的基本數(shù)據(jù)和對象進(jìn)行反序列化。

ObjectInputStream(InputStream in)

??????????創(chuàng)建從指定?InputStream?讀取的?ObjectInputStream。

Object?readObject()

??????從?ObjectInputStream?讀取對象,讀取序列化數(shù)據(jù)。

3.5.5?????練習(xí)1:將學(xué)生信息序列化至磁盤【序列化】

3.6??編碼轉(zhuǎn)換流

用來作為橋梁,把字節(jié)流轉(zhuǎn)成字符流的橋梁。

用來解決字符流讀寫亂碼問題。

3.6.1???工具類

OutputStreamWriter是字節(jié)流通向字符流的橋梁

--OutputStreamWriter(OutputStream out, String charsetName)

--OutputStreamWriter(OutputStream out)?????

?

InputStreamReader:是字節(jié)流通向字符流的橋梁

--InputStreamReader(InputStream in)

--InputStreamReader(InputStream in, String charsetName)

?

3.6.2???常見字符編碼表

3.6.3???測試

3.7??擴(kuò)展

3.7.1?????IO中flush()和close()的區(qū)別

3.7.2?????封裝釋放資源的close()

public static void close(Closeable io) {

???????if (io != null) {

???????????try {

??????????????io.close();

???????????} catch (IOException e) {

??????????????e.printStackTrace();

???????????}

???????}

????}

3.7.3?????BIO、NIO、AIO的區(qū)別

阻塞IO,BIO?就是傳統(tǒng)的?java.io?包,它是基于流模型實(shí)現(xiàn)的,交互的方式是同步、阻塞方式,也就是說在讀入輸入流或者輸出流時(shí),在讀寫動作完成之前,線程會一直阻塞在那里,它們之間的調(diào)用時(shí)可靠的線性順序。它的有點(diǎn)就是代碼比較簡單、直觀;缺點(diǎn)就是?IO?的效率和擴(kuò)展性很低,容易成為應(yīng)用性能瓶頸。

非阻塞IO,NIO?是?Java 1.4?引入的?java.nio?包,提供了?Channel、Selector、Buffer?等新的抽象,可以構(gòu)建多路復(fù)用的、同步非阻塞?IO?程序,同時(shí)提供了更接近操作系統(tǒng)底層高性能的數(shù)據(jù)操作方式。

異步IO,AIO?是?Java 1.7?之后引入的包,是?NIO?的升級版本,提供了異步非堵塞的?IO?操作方式,所以人們叫它?AIO(Asynchronous IO),異步?IO?是基于事件和回調(diào)機(jī)制實(shí)現(xiàn)的,也就是應(yīng)用操作之后會直接返回,不會堵塞在那里,當(dāng)后臺處理完成,操作系統(tǒng)會通知相應(yīng)的線程進(jìn)行后續(xù)的操作。但目前還不夠成熟,應(yīng)用不多。

3.7.4?????數(shù)組和鏈表區(qū)別

List是一個(gè)接口,它有兩個(gè)常用的子類,ArrayList和LinkedList,看名字就可以看得出一種是基于數(shù)組實(shí)現(xiàn)另一個(gè)是基于鏈表實(shí)現(xiàn)的。

數(shù)組ArrayList遍歷快,因?yàn)榇鎯臻g連續(xù);鏈表LinkedList遍歷慢,因?yàn)榇鎯臻g不連續(xù),要去通過指針定位下一個(gè)元素,所以鏈表遍歷慢。

數(shù)組插入元素和刪除元素需要重新申請內(nèi)存,然后將拼接結(jié)果保存進(jìn)去,成本很高。例如有100個(gè)值,中間插入一個(gè)元素,需要數(shù)組重新拷貝。而這個(gè)動作對鏈表來說,太輕松了,改變一下相鄰兩個(gè)元素的指針即可。所以鏈表的插入和修改元素時(shí)性能非常高。

實(shí)際開發(fā)就根據(jù)它們各自不同的特點(diǎn)來匹配對應(yīng)業(yè)務(wù)的特點(diǎn)。業(yè)務(wù)一次賦值,不會改變,順序遍歷,就采用數(shù)組;業(yè)務(wù)頻繁變化,有新增,有刪除,則鏈表更加適合。

3.7.5?????讀一行寫一行

4.1??泛型

4.1.1?????概念

public class LinkedList<E>

????extends AbstractSequentialList<E>

????implements?List<E>, Deque<E>, Cloneable, java.io.Serializable{}

public interface Deque<E>?extends?Queue<E> {}

public interface Queue<E>?extends?Collection<E> {}

public interface Collection<E>?extends?Iterable<E> {}

我們上面的代碼中出現(xiàn)的<?>是什么東西呢?它叫泛型,常用來和集合對象一同使用,所以我們在開始學(xué)習(xí)集合之前,必須先了解下什么是泛型。而且泛型概念非常重要,它是程序的增強(qiáng)器,它是目前主流的開發(fā)方式。

泛型是(Generics)是JDK1.5?的一個(gè)新特性,其實(shí)就是一個(gè)『語法糖』,本質(zhì)上就是編譯器為了提供更好的可讀性而提供的一種小手段,小技巧,虛擬機(jī)層面是不存在所謂『泛型』的概念的。

4.1.2?????作用

l??通過泛型的語法定義,約束集合元素的類型,進(jìn)行安全檢查,把錯(cuò)誤顯示在編譯期

l??代碼通用性更強(qiáng),后面有案例

l??泛型可以提升程序代碼的可讀性,但它只是一個(gè)語法糖(編譯后這樣的東西就被刪除,不出現(xiàn)在最終的源代碼中),對于JVM運(yùn)行時(shí)的性能是沒有任何影響的。

4.1.3?????泛型示例

我們創(chuàng)建一個(gè)ArrayList,上面看到eclipse提示有個(gè)黃線,什么意思呢?

ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized.

ArrayList使用了泛型,在聲明時(shí)需指定具體的類型<E>。

那我們把這個(gè)<>里的方式就稱為泛型。上面的泛型有什么作用呢?就是在編譯階段就檢查我們傳入的參數(shù)類型是否正確。

有了泛型,我們可以看到人家要求存放String,而我故意存放的整數(shù)100,所以eclipse提示我們錯(cuò)誤:

The method add(int, String) in the type List<String> is not applicable for the arguments (int)。

類型List<String>的add方法要求增加的類型為String類型,不正確不能存入。

4.1.4?????泛型聲明

泛型可以在接口、方法、返回值上使用:

java.util.List泛型接口/類:

public interface Collection<E> {}

泛型方法的聲明:

public <E> void print(E e) {}

在方法返回值前聲明了一個(gè)<E>表示后面出現(xiàn)的E是泛型,而不是普通的java變量。

4.1.5?????常用名稱

l??E - Element (在集合中使用,因?yàn)榧现写娣诺氖窃?

l??T - Type(Java?類)

l??K - Key(鍵)

l??V - Value(值)

l??N - Number(數(shù)值類型)

l??? -?表示不確定的java類型

?

4.1.6?????用途:編譯時(shí)類型檢查

4.1.7?????用途:代碼通用性更強(qiáng)

傳統(tǒng)方式通過重載多態(tài)實(shí)現(xiàn),方法同名,參數(shù)類型不同。

泛型方式

4.1.8?????類型擦除

泛型只是在編譯期間生存,編譯后就被干掉了,真正運(yùn)行時(shí),大多情況下取而代之的是Object。

下面的代碼利用了jdk提供的強(qiáng)大的反射功能,后續(xù)會專門詳細(xì)講解,今天先初體驗(yàn)下其強(qiáng)大的功能。

4.2??Collection接口

4.2.1?????概述

英文名稱Collection,是用來存放對象的數(shù)據(jù)結(jié)構(gòu)。其中長度可變,而且集合中可以存放不同類型的對象。并提供了一組操作成批對象的方法。

數(shù)組的缺點(diǎn):長度是固定不可變的,訪問方式單一,插入、刪除等操作繁瑣。

4.2.2?????集合的繼承結(jié)構(gòu)


Collection接口

-- List接口??: 數(shù)據(jù)有序,可以重復(fù)。

???-- ArrayList子類

???-- LinkedList子類

-- Set接口??: 數(shù)據(jù)無序,不可以存重復(fù)值

???-- HashSet子類

-- Map接口??: 鍵值對存數(shù)據(jù)

-- HashMap

Collections工具類

4.2.3?????常用方法

boolean add(E e):添加元素。

boolean addAll(Collection??c):把小集合添加到大集合中 。

boolean contains(Object o)?: 如果此?collection?包含指定的元素,則返回?true。

boolean isEmpty()?:如果此?collection?沒有元素,則返回?true。

Iterator<E> iterator():返回在此?collection?的元素上進(jìn)行迭代的迭代器。

boolean remove(Object o)?:從此?collection?中移除指定元素的單個(gè)實(shí)例。

int size()?:返回此?collection?中的元素?cái)?shù)。

Objec[] toArray():返回對象數(shù)組

4.2.4?????練習(xí)1:測試常用方法

4.3??List接口

4.3.1?????概述

有序的?collection(也稱為序列)。此接口的用戶可以對列表中每個(gè)元素的插入位置進(jìn)行精確地控制。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素。

4.3.2?????特點(diǎn)

1、?數(shù)據(jù)有序

2、?允許存放重復(fù)元素

3、?元素都有索引

4.3.3?????常用方法

ListIterator<E>?listIterator()

??????????返回此列表元素的列表迭代器(按適當(dāng)順序)。

?ListIterator<E>?listIterator(int?index)

??????????返回列表中元素的列表迭代器(按適當(dāng)順序),從列表的指定位置開始。

?void?add(int?index, E element)

??????????在列表的指定位置插入指定元素(可選操作)。

?boolean?addAll(int?index, Collection<? extends E> c)

??????????將指定?collection?中的所有元素都插入到列表中的指定位置(可選操作)。

?List<E>?subList(int?fromIndex,?int?toIndex)

?????返回列表中指定的?fromIndex(包括?)和?toIndex(不包括)之間的部分視圖。

E?get(int?index)

??????????返回列表中指定位置的元素。??

int?indexOf(Object o)

??????????返回此列表中第一次出現(xiàn)的指定元素的索引;如果此列表不包含該元素,則返回?-1。

4.3.4?????練習(xí)1:測試常用方法

創(chuàng)建day12工程

創(chuàng)建cn.tedu.list包

創(chuàng)建Test1_List.java

4.4??ArrayList

4.4.1?????概述

1)?????存在于java.util包中。

2)?????內(nèi)部用數(shù)組存放數(shù)據(jù),封裝了數(shù)組的操作,每個(gè)對象都有下標(biāo)。

3)?????內(nèi)部數(shù)組默認(rèn)初始容量是10。如果不夠會以1.5倍容量增長。

4)?????查詢快,增刪數(shù)據(jù)效率會降低。

4.4.2?????創(chuàng)建對象

new ArrayList():初始容量是10

4.4.3?????練習(xí)1:測試常用方法

常用API,包括下標(biāo)遍歷,迭代器遍歷

4.5??LinkedList

4.5.1?????概述

雙向鏈表,兩端效率高。底層就是數(shù)組和鏈表實(shí)現(xiàn)的。

4.5.2?????常用方法

add()

get()

size()

remove(i)

remove(數(shù)據(jù))

iterator()

addFirst()??addLast()

getFirst()??getLast()

removeFirst()??removeLast()

4.5.3?????練習(xí)1:測試迭代器遍歷

雙向鏈表:下標(biāo)遍歷效率低,迭代器遍歷效率高

4.6??擴(kuò)展

4.6.1?????ArrayList擴(kuò)容

ArrayList相當(dāng)于在沒指定initialCapacity時(shí)就是會使用延遲分配對象數(shù)組空間,當(dāng)?shù)谝淮尾迦朐貢r(shí)才分配10(默認(rèn))個(gè)對象空間。假如有20個(gè)數(shù)據(jù)需要添加,那么會分別在第一次的時(shí)候,將ArrayList的容量變?yōu)?0 (如下圖一);之后擴(kuò)容會按照1.5倍增長。也就是當(dāng)添加第11個(gè)數(shù)據(jù)的時(shí)候,Arraylist繼續(xù)擴(kuò)容變?yōu)?0*1.5=15(如下圖二);當(dāng)添加第16個(gè)數(shù)據(jù)時(shí),繼續(xù)擴(kuò)容變?yōu)?5 * 1.5 =22個(gè)

ArrayList沒有對外暴露其容量個(gè)數(shù),查看源碼我們可以知道,實(shí)際其值存放在elementData對象數(shù)組中,那我們只需拿到這個(gè)數(shù)組的長度,觀察其值變化了幾次就知道其擴(kuò)容了多少次。怎么獲取呢?只能用反射技術(shù)了。


4.6.2?????HashMap擴(kuò)容

成長因子:

前面的講述已經(jīng)發(fā)現(xiàn),當(dāng)你空間只有僅僅為10的時(shí)候是很容易造成2個(gè)對象的hashcode?所對應(yīng)的地址是一個(gè)位置的情況。這樣就造成?2個(gè)?對象會形成散列桶(鏈表)。這時(shí)就有一個(gè)加載因子的參數(shù),值默認(rèn)為0.75?,如果你hashmap的?空間有?100那么當(dāng)你插入了75個(gè)元素的時(shí)候?hashmap就需要擴(kuò)容了,不然的話會形成很長的散列桶結(jié)構(gòu),對于查詢和插入都會增加時(shí)間,因?yàn)樗粋€(gè)一個(gè)的equals比較。但又不能讓加載因子很小,如0.01,這樣顯然是不合適的,頻繁擴(kuò)容會大大消耗你的內(nèi)存。這時(shí)就存在著一個(gè)平衡,jdk中默認(rèn)是0.75,當(dāng)然負(fù)載因子可以根據(jù)自己的實(shí)際情況進(jìn)行調(diào)整。


5.1??Set接口

5.1.1?????概述

一個(gè)不包含重復(fù)元素的?collection。

數(shù)據(jù)無序(因?yàn)閟et集合沒有下標(biāo))。

由于集合中的元素不可以重復(fù)。常用于給數(shù)據(jù)去重。

5.1.2?????特點(diǎn)

???HashSet:底層是哈希表,包裝了HashMap,相當(dāng)于向HashSet中存入數(shù)據(jù)時(shí),會把數(shù)據(jù)作為K,存入內(nèi)部的HashMap中。當(dāng)然K仍然不許重復(fù)。

???TreeSet:底層就是TreeMap,也是紅黑樹的形式,便于查找數(shù)據(jù)。

???HashMap實(shí)現(xiàn)中,當(dāng)哈希值相同的對象,會在同一個(gè)hash值的位置存儲不同屬性的數(shù)據(jù)。

5.1.3?????常用方法

boolean add(E e):添加元素。

boolean addAll(Collection??c):把小集合添加到大集合中 。

boolean contains(Object o)?: 如果此?collection?包含指定的元素,則返回?true。

boolean isEmpty()?:如果此?collection?沒有元素,則返回?true。

Iterator<E> iterator():返回在此?collection?的元素上進(jìn)行迭代的迭代器。

boolean remove(Object o)?:從此?collection?中移除指定元素的單個(gè)實(shí)例。

int size()?:返回此?collection?中的元素?cái)?shù)。

Objec[] toArray():返回對象數(shù)組

5.1.4?????練習(xí)1:測試常用方法

5.2??HashSet

5.2.1?????概述

此類實(shí)現(xiàn)?Set?接口,由哈希表(實(shí)際上是一個(gè)?HashMap?實(shí)例)支持。它不保證?set?的迭代順序;特別是它不保證該順序恒久不變。此類允許使用?null?元素。

5.2.2?????練習(xí)1:獲取HashSet里的元素

5.2.3?????練習(xí)2:Set存儲屬性值相同的對象

需求:我們?nèi)匀患僭O(shè)相同屬性的兩個(gè)人是同一個(gè)人

1、按照以前的經(jīng)驗(yàn),這種需求只需要重寫equals()方法就可以實(shí)現(xiàn)。

2、但是我們提供以后,equals()根本就沒有執(zhí)行。問題出現(xiàn)在新增功能。

3、查找新增的源碼發(fā)現(xiàn),其實(shí)在添加時(shí)只是計(jì)算對象的hash值。

4、由于每次創(chuàng)建對象時(shí)hash值都不一樣,所以每次都會當(dāng)做新對象存起來。

5、所以,現(xiàn)在我們必須保證兩個(gè)對象的hash值相同,重寫hashCode()。

5.3??Map接口

5.3.1?????概述

java.util接口?Map<K,V>

類型參數(shù):?K -?此映射所維護(hù)的鍵的類型V -?映射值的類型。

也叫哈希表、散列表。常用于存?鍵值對?結(jié)構(gòu)的數(shù)據(jù)。其中的鍵不能重復(fù),值可以重復(fù).

5.3.2?????特點(diǎn)

???可以根據(jù)鍵 提取對應(yīng)的值

???鍵不允許重復(fù),如果重復(fù)值會被覆蓋

???存放的都是無序數(shù)據(jù)

???初始容量是16,默認(rèn)的加載因子是0.75

5.3.3?????繼承結(jié)構(gòu)

5.3.4?????常用方法

void clear()

??????????從此映射中移除所有映射關(guān)系(可選操作)。

?boolean containsKey(Object key)

??????????如果此映射包含指定鍵的映射關(guān)系,則返回?true。

?boolean containsValue(Object value)

??????????如果此映射將一個(gè)或多個(gè)鍵映射到指定值,則返回?true。

?V get(Object key)

??????????返回指定鍵所映射的值;如果此映射不包含該鍵的映射關(guān)系,則返回?null。

?boolean isEmpty()

??????????如果此映射未包含鍵-值映射關(guān)系,則返回?true。

?V put(K key, V value)

??????????將指定的值與此映射中的指定鍵關(guān)聯(lián)(可選操作)。

?void putAll(Map<? extends K,? extends V> m)

??????????從指定映射中將所有映射關(guān)系復(fù)制到此映射中(可選操作)。

?V remove(Object key)

??????????如果存在一個(gè)鍵的映射關(guān)系,則將其從此映射中移除(可選操作)。

?int size()

??????????返回此映射中的鍵-值映射關(guān)系數(shù)。

Set<Map.Entry<K,V>> entrySet()

??????????返回此映射所包含的映射關(guān)系的?Set?視圖。

5.3.5?????練習(xí)1:測試常用方法

5.4??HashMap

???HashMap的鍵要同時(shí)重寫hashCode()和equals()

hashCode()用來判斷確定hash值是否相同

equals()用來判斷屬性的值是否相同

-- equals()判斷數(shù)據(jù)如果相等,hashCode()必須相同

-- equals()判斷數(shù)據(jù)如果不等,hashCode()盡量不同

5.4.1?????概述

基于哈希表的?Map?接口的實(shí)現(xiàn)。此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用?null?值和?null?鍵。

HashMap底層是一個(gè)Entry數(shù)組,當(dāng)存放數(shù)據(jù)時(shí)會根據(jù)hash算法計(jì)算數(shù)據(jù)的存放位置。算法:hash(key)%n,n就是數(shù)組的長度。

當(dāng)計(jì)算的位置沒有數(shù)據(jù)時(shí),就直接存放,當(dāng)計(jì)算的位置有數(shù)據(jù)時(shí)也就是發(fā)生hash沖突的時(shí)候/hash碰撞時(shí),采用鏈表的方式來解決的,在對應(yīng)的數(shù)組位置存放鏈表的頭結(jié)點(diǎn)。對鏈表而言,新加入的節(jié)點(diǎn)會從頭結(jié)點(diǎn)加入。

5.4.2?????練習(xí)1:讀取HashMap的數(shù)據(jù)

5.4.3?????練習(xí)2:字符串中的字符統(tǒng)計(jì)

接收用戶輸入的一串字符串,統(tǒng)計(jì)出現(xiàn)的每個(gè)字符的個(gè)數(shù)

5.5??Collections工具類

5.5.1?????常用方法

Collections.sort(List<> list):根據(jù)元素的自然順序?對指定列表按升序進(jìn)行排序。

Collections.max():根據(jù)元素的自然順序,返回給定?collection?的最大元素。

Collections.min():根據(jù)元素的自然順序?返回給定?collection?的最小元素。

Collections.swap(List,i,j):在指定列表的指定位置處交換元素。

Collections.addAll():

5.5.2?????測試


API+IO+泛型+集合基礎(chǔ)的評論 (共 條)

分享到微博請遵守國家法律
永春县| 连州市| 加查县| 弋阳县| 宜阳县| 会宁县| 正镶白旗| 苗栗市| 合江县| 大渡口区| 荆门市| 连江县| 鄂托克旗| 富平县| 江口县| 仙居县| 同心县| 博乐市| 黎川县| 淮阳县| 阿坝| 胶南市| 乌鲁木齐县| 满洲里市| 阿瓦提县| 行唐县| 井冈山市| 佳木斯市| 南部县| 三都| 水富县| 安顺市| 莲花县| 龙井市| 光山县| 印江| 三亚市| 巴青县| 濮阳县| 南昌县| 神木县|