java高級

3.Object類

所有引用類型的父類,除了它自己以外

Object類是所有類的父類?? 如果有其他明顯正確的答案,不選它,如果沒有就選它。

基本數(shù)據(jù)類型 byte short int long float double char boolean

引用數(shù)據(jù)類型 Object

當編寫一個類的時候,如果沒有寫明繼承哪個類,這個類就會默認繼承Object類

在Object類中定義的方法都會被其他類繼承

重要方法

(了解)hashCode() 方法:返回對象的hash值

每個對象在內(nèi)存中都存在著一個hashcode作為編碼出現(xiàn)

如果兩個對象的hashcode不相等,這兩個對象一定不是同一個對象

如果兩個對象的hashcode相等,這兩個對象也不一定是同一個對象

x = 0ad12

y = 032aa

z = 0ad12

x != y

y != z

x ? z

equals()方法:比較兩個對象是否“相等”

Object o1 = new Object();

Object o2 = new Object();

o1 == o2? ?? ? ? ? false? 引用類型中 == 判斷的是內(nèi)存地址是否一致

o1.equals(o2)? ?? ? false? 相當于==

在Object類中 == 和 equals 方法是一回事

======================================================================

String str1 = new String("abc");

String str2 = new String("abc");

str1 == str2 ?? false? 比較的是str1和str2的內(nèi)存地址

toString() 方法:返回對象的字符串表達

返回對象的字符串表達


1.字符串類(重要)

String? 字符串常量

String str1 = "abc";

String str2 = new String("abc");

== 比較的是字符串的內(nèi)存地址

equals() 比較的是字符串的內(nèi)容? ? 參照圖片理解

String str1 = new String();? //空字符串

String str2 = "";? ? //空字符串

String str3 = null;? //空值 null值

空字符串與null值不是一回事

空字符串表達了一個沒有任何文字的字符串,它是一個對象,可以使用String類型屬性和方法

null表示沒有對象,它不能任何屬性和方法

常用方法

int length()

? ? ? ? ? 返回此字符串的長度。

String str1 = "abc";

String str2 = "";

String str3 = "哈哈";

String str4 = "abc哈哈xyz";

str1.length();? 3

str2.length();? 0

str3.length();? 2

str4.length();? 8

無論英文,數(shù)字,漢字。一個字符就是1個長度

String trim()

? ? ? ? ? 返回字符串的副本,忽略前導(dǎo)空白和尾部空白。

String str = "? ab c? d ";

String str1 = str.trim();? ==>? ab c? d 沒有前后的空格

char charAt(int index)?

返回index位置的字符。

在使用時index的值不能超過文字的index范圍,

否則會報錯java.lang.StringIndexOutOfBoundsException

String str = "abcdef";

char c = str.charAt(0);

boolean equalsIgnoreCase(String anotherString)

? ? ? ? ? 比較兩個字符串的內(nèi)容,不考慮大小寫。

String str1 = "abc";

String str2 = "ABC";

str1.equalsIgnoreCase(str2);? true

str1.equals(str2);? ? ? ? ? ? false

char[] toCharArray()

? ? ? ? ? 將此字符串轉(zhuǎn)換為一個新的字符數(shù)組。

String s = "abcxyz";

char[] c = s.toCharArray();

int indexOf(String str)

? ? ? ? ? 返回指定參數(shù)字符串在此字符串中第一次出現(xiàn)的位置。

int lastIndexOf(String str)

? ? ? ? ? 返回指定參數(shù)字符串在此字符串中最后一次出現(xiàn)的位置。

String s = "I LIKE GIRL";

int i = s.indexOf("I");? //字母I第一次出現(xiàn)的位置? ? ? ? ? ? ? ? 0

int j = s.lastIndexOf("I"); //字母I最后一次出現(xiàn)的位置? ? ? ? ? 8

int k = s.indexOf("LIKE");? //字符串LIKE第一次出現(xiàn)的位置? ? ? ? 2

int m = s.lastIndexOf("LIKE");? //字符串LIKE最后一次出現(xiàn)的位置 2

int n = s.indexOf("HAHA");? //字符串HAHA第一次出現(xiàn)的位置? ? ? ? -1

boolean isEmpty()

? ? ? ? ? 當且僅當 length()=0 時返回 true。 (判斷字符串是否為空字符串)

等同于equals("")

等同于.length() == 0

String replaceAll(String regex, String replacement)

? ? ? ? ? 使用給定的 replacement 替換此字符串所有匹配給定的正則表達式的子字符串。

利用replacement字符串,替換原字符串中所有的regex內(nèi)容

String str = "abchahasdfjsdlkfjkalsdxixiasdklfjlkasdhahah";

String nstr = str.replace("haha", "****"); //使用****替代元字符串中的haha

String[] split(String regex)

? ? ? ? ? 根據(jù)給定正則表達式的匹配拆分此字符串。

根據(jù)參數(shù)來拆分原字符串,將元字符串變成一個數(shù)組

String s = "a,dx,s,xy,xaa,f,12,32,b,x";

String[] x = s.split(",");

得到{a,dx,s,xy,xaa,f,12,32,b,x}數(shù)組

String toUpperCase()

? ? ? ? ? 使用默認語言環(huán)境的規(guī)則將此 String 中的所有字符都轉(zhuǎn)換為大寫。

String toLowerCase()

? ? ? ? ? 使用默認語言環(huán)境的規(guī)則將此 String 中的所有字符都轉(zhuǎn)換為小寫。

String substring(int beginIndex)

截取字符串? 從begin位置起,截取到字符串的結(jié)尾

String substring(int beginIndex, int endIndex)

截取字符串? 從begin位置起,截取到end位置,不包括end? [begin,end)

String str = "I LIKE GIRL";

String s1 = str.substring(2);? //從下標2位置開始,截取到最后

System.out.println(s1);

String s2 = str.substring(2, 6); //[2,6)

System.out.println(s2);

------------------------------------------------------------

練習(xí):在控制臺上輸入一個郵箱地址,判斷郵箱地址是否合法

? ? ? 1.郵箱的首字母不能是@,最后一個字符不能是.

? ? ? 2.有且僅有一個@,有且僅有一個.

? ? ? 3.@必須在.之前,且兩者之間必須有其他字符

xxx@xx.xxx

StringBuffer? 字符串變量

StringBuilder? 字符串變量

字符串拼接操作時

? 效率

String? <? StringBuffer < StringBuilder

StringBuffer與StringBuilder字符串拼接

append(xxx);? ? 在字符串變量的結(jié)尾處拼接一個內(nèi)容

toString();? ? ? 將拼接后的字符串返回成String類型

StringBuffer sb = new StringBuffer();

for(int i = 0; i < 10; i++){

sb.append(i);

}

String str = sb.toString();

System.out.println(str);

面試題與筆試題(重點)

String與StringBuffer的區(qū)別?

? String是字符串常量,做字符串拼接時的效率很低

? StringBuffer是字符串變量,做字符串拼接時效率較高

StringBuffer與StringBuilder的區(qū)別?

? StringBuffer的方法是線程安全的,效率略低于StringBuilder

? StringBuilder的方法是線程不安全的,效率是最高的

? 系統(tǒng)中不存在多線程的情況下,使用StringBuilder

StringBuffer和StringBuilder主要用在字符串拼接的場合

2.日期時間類(重要)

java.util.Date類

java.sql.Date類? 它是java.util.Date類的子類,一般用于與數(shù)據(jù)庫中的Date類型進行交互

日期與字符串的轉(zhuǎn)換(常用)

SimpleDateFormat類

//練習(xí):

Student類

學(xué)號 sno

姓名 sname

生日 birthday? java.util.Date

在控制臺上提示用戶依次輸入sno,sname和birthday,并將用戶輸入的內(nèi)容存入一個Student對象中

重寫Student的toString

輸出的格式? 學(xué)號:1001,姓名:張三,生日:1999年12月12日

Calendar? 日歷類

提供各種日期和時間的計算,用于聲明日期對象

日歷類是一個抽象類,它的構(gòu)造方法是protected權(quán)限,程序開發(fā)者編寫的類是無法直接調(diào)用該構(gòu)造方法的

//獲得了一個表示系統(tǒng)當前時間的日歷對象

Calendar cal = Calendar.getInstance();

Date getTime()

得到日歷類表示時間對應(yīng)的一個java.util.Date對象

將Calendar轉(zhuǎn)換成表示同一時間的Date對象

void setTime(Date date)

設(shè)置日歷類為某個日期

long getTimeInMillis()

得到時間的毫秒數(shù)

void setTimeInMillis(long l)

設(shè)置時間的毫秒數(shù)

int get(int field)? (重要)

根據(jù)field表示的字段,得到時間對應(yīng)位置的值

Calendar cal = Calendar.getInstance();

int year? = cal.get(1);? ? ? ? ? ? ? ? ? ==> 2018

? ? cal.get(Calendar.YEAR)

int month = cal.get(Calendar.MONTH)? ==>? 0

field字段

Calendar.YEAR -- 年

Calendar.MONTH -- 月

Calendar.DAY_OF_MONTH? -- 日

Calendar.DAY_OF_WEEK? -- 星期

Calendar.DAY_OF_YEAR -- 年中的第幾天

Calendar.HOUR

Calendar.HOUR_OF_DAY? 小時

Calendar.MINUTE? ? 分鐘

Calendar.SECOND? 秒

Calendar.MILLISECOND 毫秒

? ? ? void set(int field, int value) (重要)

為某個field字段 設(shè)置值

Calendar cal = Calendar.getInstance();

cal.set(Calendar.YEAR, 1998); //設(shè)置cal的年份為1998年

cal.set(Calendar.MONTH, 5); //設(shè)置cal的月份為6月

? ? ? void set(int year, int month, int date)

直接設(shè)置年月日

? ? ? void set(int year, int month, int date, int hourOfDay, int minute)

直接設(shè)置年月日小時分鐘

? ? ? void set(int year, int month, int date, int hourOfDay, int minute, int second)

直接設(shè)置年月日時分秒

3.數(shù)學(xué)類

Math

E? 自然對數(shù)的底數(shù)

PI? 圓周率

abs(double|float|int|long a)? 返回參數(shù)的絕對值

double d1 = Math.abs(8.0);? 8.0

double d2 = Math.abs(-8.0);? 8.0

cbrt(double a)? 返回參數(shù)的立方根

double d1 = Math.cbrt(8.0);? 2.0

sqrt(double a)? 返回參數(shù)的平方根

double d1 = Math.sqrt(4.0);? 2.0

ceil(double a)? 進一法

double d1 = Math.ceil(8.1);? 9

double d2 = Math.ceil(8.9);? 9

floor(double a) 退一法

double d1 = Math.floor(8.1);? 8

double d2 = Math.floor(8.9);? 8

round(double a) 四舍五入

double d1 = Math.round(8.1);? 8

double d2 = Math.round(8.9);? 9

pow(double a, double b)

返回a的b次冪

double d1 = Math.pow(3,3);? 27

double d2 = Math.pow(2,10);? 1024

random()

返回[0,1)區(qū)間的隨機浮點數(shù)

偽隨機數(shù):計算機生成的隨機數(shù)都是偽隨機數(shù)

有規(guī)律可循

Random

專門提供隨機數(shù)生成的類

int nextInt(int n)?

隨機生成[0,n)區(qū)間的隨機整數(shù)

隨機生成一個[3,10]區(qū)間的隨機整數(shù)

[0,8)+3? => [3,10]

隨機生成一個[a,b]區(qū)間的隨機整數(shù)

[0,b-a+1)+a? = > [a,b]

-----------------------------------------------------------------------------

練習(xí): 紙上寫個4位不重復(fù)數(shù)字(0-9且不能出現(xiàn)重復(fù))

1234? ?

猜: 3574? ? ? 回答:1A1B? ? A表示猜中數(shù)字且位置正確? ? B表示猜中數(shù)字但位置不正確

猜: 9034? ? ? 回答:2A0B

編寫程序:

計算機隨機生成1個4位不重復(fù)數(shù)字

循環(huán)以下內(nèi)容,直到用戶猜中,或者用戶打出GG放棄(計算機要給出生成的數(shù)字)

控制臺上提示用戶輸入數(shù)字

計算機根據(jù)用戶輸入的數(shù)字? 反饋出回答

4.System類

System

System.out.println();? 在控制臺上輸出內(nèi)容,并在結(jié)尾處添加一個換行

System.out.print();? 在控制臺上輸出內(nèi)容, 結(jié)尾沒有換行

System.arraycopy();? 數(shù)組拷貝方法

System.currentTimeMillis();? 得到當前系統(tǒng)時間的毫秒數(shù)

System.exit(int status); 關(guān)閉Java虛擬機,退出Java運行程序

0? -- 正常退出

-1 -- 異常退出

System.gc();? 垃圾回收

Properties p = System.getProperties();

獲得系統(tǒng)的一些屬性信息

參照 API 文檔

5.包裝類

包裝類的主要作用是體現(xiàn)基本數(shù)據(jù)類型在引用數(shù)據(jù)類型體系中的一種映射

某些場合只能使用引用數(shù)據(jù)類型(比如:泛型),如果程序邏輯上必須使用基本數(shù)據(jù)類型(比如:整數(shù)int)

這個時候我們需要使用int類型的包裝類

byte? ? ? Byte

short? ? ? Short

int ? Integer? ? (常用)

MAX_VALUE? int值的最大值

MIN_VALUE? int值的最小值

static int parseInt(String s)

將字符串s轉(zhuǎn)換為整數(shù),如果轉(zhuǎn)換失敗,則報出異常

long? ? ? Long? ? ? (常用)

float? ? ? Float

double? ? Double? ? (常用)

static double parseDouble(String s)

將字符串轉(zhuǎn)換為浮點數(shù)

char ? Character

boolean? ? Boolean

在JDK1.5版本后(含1.5)可以像使用基本數(shù)據(jù)類型一樣,使用包裝類

int i = 5;

Integer i = 5;

標準

? Integer i = new Integer(5);? ? 使用包裝類包裝整數(shù)數(shù)值5

自動裝箱(JDK1.5之后引入的概念)

? Integer i = 5;

自動拆箱(JDK1.5之后引入的概念)

? int j = 0;

? Integer i = 5;

? j = i;? //自動拆箱

類型轉(zhuǎn)換

數(shù)字-字符串(掌握)

? int n = 35;

? String s = n+"";

字符串-數(shù)字(掌握)

? int i = Integer.parseInt("35");

日期-字符串(掌握)

? Date date = new Date();

? SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");

? String str = sdf.format(date);

字符串-日期(掌握)

? SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

? Date birthday = null;

? try {

birthday = sdf.parse(b);

? } catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

? }

數(shù)字-日期(不常用)

? long l1 = 1234567

? Date d = new Date();

? ? ? ? ? d.setTime(l1);

日期-數(shù)字(不常用)

? Date d = new Date();

? long l1 = d.getTime();


集合(十分重要) 集合與數(shù)組的比較(為什么選擇集合使用?)數(shù)組的特點:數(shù)組中的數(shù)據(jù),類型必須統(tǒng)一數(shù)組是定長的,在創(chuàng)建數(shù)組對象時要給定長度,長度給定后不能再改。數(shù)組不能擴容(數(shù)組裝滿后,不能自動擴展長度,不能繼續(xù)添加內(nèi)容)集合的特點:集合中的數(shù)據(jù),類型不必統(tǒng)一(集合中只能放引用數(shù)據(jù)類型(基本數(shù)據(jù)類型使用包裝類)的數(shù)據(jù)) 一般會強制集合中的類型統(tǒng)一(泛型),方便集合的管理集合是變長的,一般集合在初始創(chuàng)建時不指名長度。 集合的長度是隨著內(nèi)容數(shù)量的變化而變化提供了大量的方法,處理集合內(nèi)容的訪問,追加,刪除等基礎(chǔ)操作真實的商業(yè)化項目中,使用頻率集合 >> 數(shù)組 集合的分類線性集合:Collection接口(重要)List接口:有序(序號)可重復(fù):可以通過下標訪問元素,集合中可以出現(xiàn)重復(fù)的元素ArrayList實現(xiàn)類: 底層實現(xiàn)是基于數(shù)組 (日常編程中使用最多的)void add(Object o) 將元素o在集合的結(jié)尾處進行添加void add(int index, Object o) 將元素o在index位置進行添加Object get(int index) 得到集合中,index位置的元素void set(int index, Object o) 將元素o在index位置上替換原有元素boolean remove(int index) 移除index位置上的元素boolean remove(Object o) 移除集合中元素o(如有重復(fù),只移除第1個)當index與o沖突時,優(yōu)先移除index位置比如 remove(2) 如果有元素2,則優(yōu)先移除下標2位置boolean contains(Object o) 查找元素o在集合中是否存在boolean isEmpty() 判斷集合是否為空 等同于 size() == 0void clear() 清空集合創(chuàng)建new ArrayList(); 在內(nèi)存中創(chuàng)建了一個長度是10的數(shù)組內(nèi)容接近容量警戒時,數(shù)組x2擴容LinkedList實現(xiàn)類 底層實現(xiàn)基于鏈表擁有ArrayList實現(xiàn)類中上述方法,結(jié)果與ArrayList操作基本一致Vector實現(xiàn)類 底層實現(xiàn)基于數(shù)組擁有ArrayList實現(xiàn)類中上述方法,結(jié)果與ArrayList操作基本一致(重要)數(shù)組與鏈表的區(qū)別數(shù)組在內(nèi)存中是連續(xù)分配的,其查找元素速度快,插入和刪除元素速度慢鏈表在內(nèi)存中是分散存儲的,其查找元素速度慢,插入和刪除元素速度快(重要)ArrayList與LinkedList的區(qū)別ArrayList是基于數(shù)組實現(xiàn)的,LinkedList是基于鏈表實現(xiàn)的數(shù)組與鏈表的區(qū)別ArrayList與Vector的區(qū)別ArrayList是線程不安全的,效率較高。Vector是線程安全的,效率較低-----------------------------------------------------------------------練習(xí):創(chuàng)建Student對象學(xué)號 sno姓名 sname生日 birthday控制臺上顯示***************1-新增學(xué)生2-刪除學(xué)生3-修改學(xué)生4-顯示所有學(xué)生5-退出***************所有產(chǎn)生的學(xué)生對象,放入到List的集合中刪除和修改 根據(jù)學(xué)號Set接口:無序(序號)不重復(fù):不能通過下標訪問元素,集合中不允許出現(xiàn)重的元素存放順序:不是由程序開發(fā)者決定的,由具體實現(xiàn)類的算法實現(xiàn)的基于Hash表來維護順序HashSet和LinkedHashSet基于二叉樹維護順序TreeSet迭代器: Iterator 迭代集合中的數(shù)據(jù),尤其是用于Set集合和Map集合中不要求順序的去重復(fù)List接口與Set接口的比較List接口:有序(序號)可重復(fù):可以通過下標訪問元素,集合中可以出現(xiàn)重復(fù)的元素主要實現(xiàn)類:ArrayList,LinkedList,VectorSet接口:無序(序號)不重復(fù):不能通過下標訪問元素,集合中不允許出現(xiàn)重的元素主要實現(xiàn)類:HashSet,LinkedHashSet,TreeSet Set集合的訪問方式:迭代器鍵值集合:Map接口(重要)key和value兩部分組成map.put(key,value): 向集合中存放一個鍵值對 如果key已經(jīng)存在,則覆蓋原有數(shù)據(jù)Object value = map.get(key): 根據(jù)key值取得對應(yīng)的value Object value = map.remove(key): 根據(jù)key值移除對應(yīng)的鍵值對,并返回它boolean containsKey(Object key) 某個key是否在集合中存在boolean containsValue(Object value) 某個value是否在集合中存在 boolean isEmpty() 是否為空集合int size() 集合的長度 Set keySet() 得到所有key值組成的set集合: 用于遍歷map集合

主要實現(xiàn)類

HashMap,Hashtable,TreeMap

HashMap和TreeMap的區(qū)別:key值的存放順序(與Set中的定義是一樣)

面試問題:

Map接口與List接口(Collection接口)的區(qū)別

List接口:線性結(jié)構(gòu),一個節(jié)點存放一個數(shù)據(jù)

Map接口:鍵值對結(jié)構(gòu),一個節(jié)點可以存放key-value兩個數(shù)據(jù)

HashMap與HashTable的區(qū)別

HashMap是線程不安全的,效率稍高

HashTable是線程安全的,效率稍低

? ? 泛型

約束集合中的數(shù)據(jù)類型,保證集合中數(shù)據(jù)類型是一致

泛型帶來的優(yōu)勢:

(1)保證數(shù)據(jù)類型一致,方便后續(xù)程序的處理和邏輯編寫

(2)向集合中添加數(shù)據(jù)時,強力約束數(shù)據(jù)類型,保證數(shù)據(jù)準確和安全

(3)遍歷或取得數(shù)據(jù)時,省略O(shè)bject類型強制轉(zhuǎn)換,提升效率

(4)可以使用for...each句式快速遍歷集合

在聲明集合時,在類名后的<>中寫出泛型

=======================================================================================

周四的練習(xí)? 改寫為使用Map集合實現(xiàn)

key是學(xué)號

value是學(xué)生對象

要求使用泛型


文件與流

java.io包中提供了關(guān)于文件和流的大部分的類

文件類? java.io.File

操作系統(tǒng)中的文件和文件夾(不包括文件中內(nèi)容)

? 文件

主要方法

boolean exist();? 測試文件或文件夾是否存在

boolean createNewFile(); 創(chuàng)建新的空文件

boolean delete();? 刪除文件

String getAbsolutePath();? 得到文件的絕對路徑

File getAbsoluteFile();? 得到文件的絕對路徑? 使用File對象表示該路徑

String getPath();? 得到文件的路徑(一般都是絕對路徑)

String getName();? 得到文件名(不包含目錄)

String getParent() 得到完整目錄(不包括文件名)

File getParentFile() 得到完整目錄的File對象(不包括文件名)

long length();? ? 得到文件的大小(單位是Byte字節(jié))

輔助方法

boolean canExecute()? 是否為可執(zhí)行文件

boolean canRead()? ? ? 文件是否可讀

boolean canWrite()? ? 文件是否可寫

boolean setWritable(boolean writable)? 設(shè)置文件是否為可寫

練習(xí):

c://1.gif.jpg? 編寫一個程序,得到該文件的擴展名

? 文件夾

f.mkdir();? 創(chuàng)建空的文件夾(只能創(chuàng)建最后一級目錄,當出現(xiàn)多級目錄(父級目錄不存在)時,方法無效)

f.mkdirs();? 創(chuàng)建空的文件夾,包含多級目錄? 推薦使用!!

在特定文件夾中創(chuàng)建文件的方法請參照com.demo.les03.Test3類

輔助方法

boolean isDirectory()? 文件對象是否是一個文件夾

boolean isFile()? ? 文件對象是否是一個文件

String[] list()? ? 返回文件夾下包含的子文件和子文件夾? 返回字符串數(shù)組

File[] listFiles()? 返回文件夾下包含的子文件和子文件夾? File數(shù)組

-----------------------------------------------------------------------------------

在控制臺上實現(xiàn)cmd的以下功能

dir? 查看子目錄和子文件

cd xxx? 進入某個子目錄

cd..? 返回上一級目錄

cd\? ? 返回根目錄

create xxx.jpg? ? 在當前目錄中新建xxx.jpg文件

delete xxx.jpg? ? 在當前目錄中刪除xxx.jpg文件

流(Stream)類:在兩種不同介質(zhì)之間數(shù)據(jù)交互的一種形式。有人稱之為“管道”?

流向分類:針對的目標是:內(nèi)存(程序)

輸入流

輸出流

單位分類:

字節(jié)流:最小單位:byte

字符流:最小單位:char(2byte)

功能分類

原始流:基礎(chǔ)的功能流

處理流:對原始流進行加強

類名的后綴

? ? 輸入流? ? ? ? 輸出流

字節(jié)流? ? InputStream? ? OutputStream

字符流? ? Reader? ? ? ? Writer

字節(jié)輸入流的父類:InputStream? 它的所有的子類命名都是XXXXXInputStream

其余的類似

字符流可以操作純文本文件 txt

----------------------------------------------------------------

練習(xí):

在C://1.txt文檔中有一些英文字母(大小寫都有)

找到其中出現(xiàn)次數(shù)最多的字母(a,A算一個字母)

asdklfjalLKDSAFJOISDJLjlksdjflkajoiwjlfkALKASDLFJLK

例子:利用程序 操作文件內(nèi)容

原始流-提供了文件操作的相關(guān)方法

FileInputStream

FileOutputStream

FileReader

FileWriter

文件的復(fù)制

1.將被復(fù)制的文件一次性讀取至內(nèi)存,內(nèi)存中向外輸出。

文件過大,內(nèi)存可能裝不下

2.一邊讀,一邊寫(推薦)

保證使用較小內(nèi)存,就可以復(fù)制較大的文件

功能分類

原始流:基礎(chǔ)的功能流

處理流:對原始流進行加強

類名的前綴

Buffered? ? 緩沖流? 提供了緩沖區(qū)能夠提升流的讀寫效率

Data? ? ? ? 數(shù)據(jù)流? 提供了從流中提取各種數(shù)據(jù)類型的方法

Object? ? ? 序列化? 提供了將對象直接序列化的相關(guān)方法

處理輸出流

需要將內(nèi)容從緩沖區(qū)中刷入實際位置

將之前控制臺輸入學(xué)生信息的練習(xí)

將學(xué)生信息保存到一個文本文件中? 1.txt

1001,張三,1999-9-9

1002,趙四,1997-7-7

序列化與反序列化

將內(nèi)存中的對象直接傳輸?shù)狡渌橘|(zhì)中

ObjectInputStream? 將對象從其他介質(zhì)中讀入到內(nèi)存中? (反序列化)

ObjectOuputStream? 將對象從內(nèi)存?zhèn)鬏數(shù)狡渌橘|(zhì)中? ? (序列化)?

被序列化對象的類必須實現(xiàn)接口java.io.Serializable

系統(tǒng)中常用的類基本都實現(xiàn)了該接口:

String,包裝類,Date,集合....

使用了集合裝對象,將集合序列化的辦法,可以解決存放多個數(shù)據(jù)的問題

前提:集合中的對象必須實現(xiàn)java.io.Serializable接口

transient關(guān)鍵字,修飾屬性

被該關(guān)鍵字修飾的屬性,不參與序列化操作

------------------------------------------------------------

練習(xí):昨天練習(xí)改寫為使用序列化的方式,保存數(shù)據(jù)

-----------------------------------------------------------

多線程

單核CPU在同一時間只能處理一個進程

CPU的輪轉(zhuǎn)時間片:

時間片:一小段時間

由于輪轉(zhuǎn)的速度非??欤鄠€程序看起來就是同時運行的

進程:程序在系統(tǒng)中運行時的一個體現(xiàn)

線程:一個進程中“同時”執(zhí)行的程序分支

Java中如何實現(xiàn)多線程?

兩種

1.繼承java.lang.Thread類,重寫這個類的run方法

2.實現(xiàn)java.lang.Runnable接口, 并實現(xiàn)接口中的run方法

線程的啟動方式

直接創(chuàng)建對象調(diào)用run方法,這種方式不是多線程的啟動方式,與常規(guī)的方法調(diào)用一致

如果某個類繼承了Thread類,通過start方法進行啟動

如果某個類實現(xiàn)了Runnable接口,將對象交給一個啟動線程Thread對象,啟動Thread對象的start

MyThread2 mt2 = new MyThread2();

Thread t = new Thread(mt2);

t.start();

線程安全

當多個線程訪問同一個資源時,有可能某個線程執(zhí)行一半的情況下,讓出了CPU的執(zhí)行權(quán),

下一輪時間片被其他線程搶走,造成了數(shù)據(jù)的不準確

synchronized:保證線程安全

同步方法? 修飾方法,將方法變?yōu)橥椒椒ǎ褐荒鼙WC類內(nèi)部資源的安全

同步塊? ? 在塊中的代碼,對于塊聲明的資源,進行鎖定,保證線程安全

面試問題

線程實現(xiàn)的方式

1.繼承java.lang.Thread類,重寫這個類的run方法

2.實現(xiàn)java.lang.Runnable接口, 并實現(xiàn)接口中的run方法

應(yīng)該使用哪種方式創(chuàng)建一個線程?

推薦使用第2種方式來創(chuàng)建線程,將繼承的父類的位置留出來以防萬一。

使用Runnable來創(chuàng)建線程,的啟動方式?

MyRunnable m = new MyRunnable();

Thread t = new Thread(m);

t.start();

同步:線程安全,在同步塊中的代碼必須是一個線程完整執(zhí)行后,才能繼續(xù)下一次競爭。

同步:加鎖。? ? 理解為:線程鎖定了CPU

死鎖:多個共享資源A,B

? ? ? 多個線程T1和T2

T1獲得了A資源,請求B資源

T2獲得了B資源,請求A資源

--------------------------------------------------------------------------

(選做)模擬三個面包師制作面包,面包的總數(shù)要求為30? (售票反過來做)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • Java 語言支持的類型分為兩類:基本類型和引用類型。整型(byte 1, short 2, int 4, lon...
    xiaogmail閱讀 1,450評論 0 10
  • 看著內(nèi)容很簡單,寫起來卻難難難。本來就很慢,現(xiàn)在因為監(jiān)考又耽誤了進度,使得本來就不近的山這下子更遠了。 要是有哪吒...
    悠悠99閱讀 346評論 0 0
  • 這首歌我聽了很多遍,發(fā)現(xiàn)如果一個人在我眼里都是好說明這是喜歡,都是差這是陌路人,好壞交割才是愛。 那天朋友給我拉來...
    銀色的光芒閱讀 160評論 0 0
  • 心里在單獨念叨摶扶搖羊角而上者九萬里,然后就開始心生向往飄飄然,頗有種“做人也當如此”的感覺,然后,就放飛了字體…...
    抽煙喝酒看書閱讀 281評論 0 0

友情鏈接更多精彩內(nèi)容