3.Object類
所有引用類型的父類沈贝,除了它自己以外
Object類是所有類的父類杠人?? 如果有其他明顯正確的答案,不選它宋下,如果沒有就選它嗡善。
基本數(shù)據(jù)類型 byte short int long float double char boolean
引用數(shù)據(jù)類型 Object
當(dāng)編寫一個(gè)類的時(shí)候,如果沒有寫明繼承哪個(gè)類学歧,這個(gè)類就會(huì)默認(rèn)繼承Object類
在Object類中定義的方法都會(huì)被其他類繼承
重要方法
(了解)hashCode() 方法:返回對(duì)象的hash值
每個(gè)對(duì)象在內(nèi)存中都存在著一個(gè)hashcode作為編碼出現(xiàn)
如果兩個(gè)對(duì)象的hashcode不相等罩引,這兩個(gè)對(duì)象一定不是同一個(gè)對(duì)象
如果兩個(gè)對(duì)象的hashcode相等,這兩個(gè)對(duì)象也不一定是同一個(gè)對(duì)象
x = 0ad12
y = 032aa
z = 0ad12
x != y
y != z
x ? z
equals()方法:比較兩個(gè)對(duì)象是否“相等”
Object o1 = new Object();
Object o2 = new Object();
o1 == o2? ?? ? ? ? false? 引用類型中 == 判斷的是內(nèi)存地址是否一致
o1.equals(o2)? ?? ? false? 相當(dāng)于==
在Object類中 == 和 equals 方法是一回事
======================================================================
String str1 = new String("abc");
String str2 = new String("abc");
str1 == str2 ?? false? 比較的是str1和str2的內(nèi)存地址
toString() 方法:返回對(duì)象的字符串表達(dá)
返回對(duì)象的字符串表達(dá)
1.字符串類(重要)
String? 字符串常量
String str1 = "abc";
String str2 = new String("abc");
== 比較的是字符串的內(nèi)存地址
equals() 比較的是字符串的內(nèi)容? ? 參照?qǐng)D片理解
String str1 = new String();? //空字符串
String str2 = "";? ? //空字符串
String str3 = null;? //空值 null值
空字符串與null值不是一回事
空字符串表達(dá)了一個(gè)沒有任何文字的字符串枝笨,它是一個(gè)對(duì)象袁铐,可以使用String類型屬性和方法
null表示沒有對(duì)象揭蜒,它不能任何屬性和方法
常用方法
int length()
? ? ? ? ? 返回此字符串的長(zhǎng)度。
String str1 = "abc";
String str2 = "";
String str3 = "哈哈";
String str4 = "abc哈哈xyz";
str1.length();? 3
str2.length();? 0
str3.length();? 2
str4.length();? 8
無論英文昭躺,數(shù)字忌锯,漢字。一個(gè)字符就是1個(gè)長(zhǎng)度
String trim()
? ? ? ? ? 返回字符串的副本领炫,忽略前導(dǎo)空白和尾部空白偶垮。
String str = "? ab c? d ";
String str1 = str.trim();? ==>? ab c? d 沒有前后的空格
char charAt(int index)?
返回index位置的字符。
在使用時(shí)index的值不能超過文字的index范圍帝洪,
否則會(huì)報(bào)錯(cuò)java.lang.StringIndexOutOfBoundsException
String str = "abcdef";
char c = str.charAt(0);
boolean equalsIgnoreCase(String anotherString)
? ? ? ? ? 比較兩個(gè)字符串的內(nèi)容似舵,不考慮大小寫。
String str1 = "abc";
String str2 = "ABC";
str1.equalsIgnoreCase(str2);? true
str1.equals(str2);? ? ? ? ? ? false
char[] toCharArray()
? ? ? ? ? 將此字符串轉(zhuǎn)換為一個(gè)新的字符數(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()
? ? ? ? ? 當(dāng)且僅當(dāng) length()=0 時(shí)返回 true砰奕。 (判斷字符串是否為空字符串)
等同于equals("")
等同于.length() == 0
String replaceAll(String regex, String replacement)
? ? ? ? ? 使用給定的 replacement 替換此字符串所有匹配給定的正則表達(dá)式的子字符串蛛芥。
利用replacement字符串,替換原字符串中所有的regex內(nèi)容
String str = "abchahasdfjsdlkfjkalsdxixiasdklfjlkasdhahah";
String nstr = str.replace("haha", "****"); //使用****替代元字符串中的haha
String[] split(String regex)
? ? ? ? ? 根據(jù)給定正則表達(dá)式的匹配拆分此字符串军援。
根據(jù)參數(shù)來拆分原字符串仅淑,將元字符串變成一個(gè)數(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()
? ? ? ? ? 使用默認(rèn)語言環(huán)境的規(guī)則將此 String 中的所有字符都轉(zhuǎn)換為大寫。
String toLowerCase()
? ? ? ? ? 使用默認(rèn)語言環(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);? //從下標(biāo)2位置開始庐船,截取到最后
System.out.println(s1);
String s2 = str.substring(2, 6); //[2,6)
System.out.println(s2);
------------------------------------------------------------
練習(xí):在控制臺(tái)上輸入一個(gè)郵箱地址,判斷郵箱地址是否合法
? ? ? 1.郵箱的首字母不能是@嘲更,最后一個(gè)字符不能是.
? ? ? 2.有且僅有一個(gè)@筐钟,有且僅有一個(gè).
? ? ? 3.@必須在.之前,且兩者之間必須有其他字符
xxx@xx.xxx
StringBuffer? 字符串變量
StringBuilder? 字符串變量
字符串拼接操作時(shí)
? 效率
String? <? StringBuffer < StringBuilder
StringBuffer與StringBuilder字符串拼接
append(xxx);? ? 在字符串變量的結(jié)尾處拼接一個(gè)內(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);
面試題與筆試題(重點(diǎn))
String與StringBuffer的區(qū)別赋朦?
? String是字符串常量篓冲,做字符串拼接時(shí)的效率很低
? StringBuffer是字符串變量,做字符串拼接時(shí)效率較高
StringBuffer與StringBuilder的區(qū)別北发?
? StringBuffer的方法是線程安全的,效率略低于StringBuilder
? StringBuilder的方法是線程不安全的喷屋,效率是最高的
? 系統(tǒng)中不存在多線程的情況下琳拨,使用StringBuilder
StringBuffer和StringBuilder主要用在字符串拼接的場(chǎng)合
2.日期時(shí)間類(重要)
java.util.Date類
java.sql.Date類? 它是java.util.Date類的子類,一般用于與數(shù)據(jù)庫中的Date類型進(jìn)行交互
日期與字符串的轉(zhuǎn)換(常用)
SimpleDateFormat類
//練習(xí):
Student類
學(xué)號(hào) sno
姓名 sname
生日 birthday? java.util.Date
在控制臺(tái)上提示用戶依次輸入sno屯曹,sname和birthday狱庇,并將用戶輸入的內(nèi)容存入一個(gè)Student對(duì)象中
重寫Student的toString
輸出的格式? 學(xué)號(hào):1001惊畏,姓名:張三,生日:1999年12月12日
Calendar? 日歷類
提供各種日期和時(shí)間的計(jì)算密任,用于聲明日期對(duì)象
日歷類是一個(gè)抽象類颜启,它的構(gòu)造方法是protected權(quán)限,程序開發(fā)者編寫的類是無法直接調(diào)用該構(gòu)造方法的
//獲得了一個(gè)表示系統(tǒng)當(dāng)前時(shí)間的日歷對(duì)象
Calendar cal = Calendar.getInstance();
Date getTime()
得到日歷類表示時(shí)間對(duì)應(yīng)的一個(gè)java.util.Date對(duì)象
將Calendar轉(zhuǎn)換成表示同一時(shí)間的Date對(duì)象
void setTime(Date date)
設(shè)置日歷類為某個(gè)日期
long getTimeInMillis()
得到時(shí)間的毫秒數(shù)
void setTimeInMillis(long l)
設(shè)置時(shí)間的毫秒數(shù)
int get(int field)? (重要)
根據(jù)field表示的字段浪讳,得到時(shí)間對(duì)應(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? 小時(shí)
Calendar.MINUTE? ? 分鐘
Calendar.SECOND? 秒
Calendar.MILLISECOND 毫秒
? ? ? void set(int field, int value) (重要)
為某個(gè)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è)置年月日小時(shí)分鐘
? ? ? void set(int year, int month, int date, int hourOfDay, int minute, int second)
直接設(shè)置年月日時(shí)分秒
3.數(shù)學(xué)類
Math
E? 自然對(duì)數(shù)的底數(shù)
PI? 圓周率
abs(double|float|int|long a)? 返回參數(shù)的絕對(duì)值
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)? 進(jìn)一法
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ū)間的隨機(jī)浮點(diǎn)數(shù)
偽隨機(jī)數(shù):計(jì)算機(jī)生成的隨機(jī)數(shù)都是偽隨機(jī)數(shù)
有規(guī)律可循
Random
專門提供隨機(jī)數(shù)生成的類
int nextInt(int n)?
隨機(jī)生成[0,n)區(qū)間的隨機(jī)整數(shù)
隨機(jī)生成一個(gè)[3,10]區(qū)間的隨機(jī)整數(shù)
[0,8)+3? => [3,10]
隨機(jī)生成一個(gè)[a,b]區(qū)間的隨機(jī)整數(shù)
[0,b-a+1)+a? = > [a,b]
-----------------------------------------------------------------------------
練習(xí): 紙上寫個(gè)4位不重復(fù)數(shù)字(0-9且不能出現(xiàn)重復(fù))
1234? ?
猜: 3574? ? ? 回答:1A1B? ? A表示猜中數(shù)字且位置正確? ? B表示猜中數(shù)字但位置不正確
猜: 9034? ? ? 回答:2A0B
編寫程序:
計(jì)算機(jī)隨機(jī)生成1個(gè)4位不重復(fù)數(shù)字
循環(huán)以下內(nèi)容缰盏,直到用戶猜中,或者用戶打出GG放棄(計(jì)算機(jī)要給出生成的數(shù)字)
控制臺(tái)上提示用戶輸入數(shù)字
計(jì)算機(jī)根據(jù)用戶輸入的數(shù)字? 反饋出回答
4.System類
System
System.out.println();? 在控制臺(tái)上輸出內(nèi)容淹遵,并在結(jié)尾處添加一個(gè)換行
System.out.print();? 在控制臺(tái)上輸出內(nèi)容, 結(jié)尾沒有換行
System.arraycopy();? 數(shù)組拷貝方法
System.currentTimeMillis();? 得到當(dāng)前系統(tǒng)時(shí)間的毫秒數(shù)
System.exit(int status); 關(guān)閉Java虛擬機(jī)口猜,退出Java運(yùn)行程序
0? -- 正常退出
-1 -- 異常退出
System.gc();? 垃圾回收
Properties p = System.getProperties();
獲得系統(tǒng)的一些屬性信息
參照 API 文檔
5.包裝類
包裝類的主要作用是體現(xiàn)基本數(shù)據(jù)類型在引用數(shù)據(jù)類型體系中的一種映射
某些場(chǎng)合只能使用引用數(shù)據(jù)類型(比如:泛型),如果程序邏輯上必須使用基本數(shù)據(jù)類型(比如:整數(shù)int)
這個(gè)時(shí)候我們需要使用int類型的包裝類
byte? ? ? Byte
short? ? ? Short
int ? Integer? ? (常用)
MAX_VALUE? int值的最大值
MIN_VALUE? int值的最小值
static int parseInt(String s)
將字符串s轉(zhuǎn)換為整數(shù)透揣,如果轉(zhuǎn)換失敗济炎,則報(bào)出異常
long? ? ? Long? ? ? (常用)
float? ? ? Float
double? ? Double? ? (常用)
static double parseDouble(String s)
將字符串轉(zhuǎn)換為浮點(diǎn)數(shù)
char ? Character
boolean? ? Boolean
在JDK1.5版本后(含1.5)可以像使用基本數(shù)據(jù)類型一樣,使用包裝類
int i = 5;
Integer i = 5;
標(biāo)準(zhǔn)
? Integer i = new Integer(5);? ? 使用包裝類包裝整數(shù)數(shù)值5
自動(dòng)裝箱(JDK1.5之后引入的概念)
? Integer i = 5;
自動(dòng)拆箱(JDK1.5之后引入的概念)
? int j = 0;
? Integer i = 5;
? j = i;? //自動(dòng)拆箱
類型轉(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ù)組的特點(diǎn):數(shù)組中的數(shù)據(jù)须尚,類型必須統(tǒng)一數(shù)組是定長(zhǎng)的,在創(chuàng)建數(shù)組對(duì)象時(shí)要給定長(zhǎng)度侍咱,長(zhǎng)度給定后不能再改耐床。數(shù)組不能擴(kuò)容(數(shù)組裝滿后,不能自動(dòng)擴(kuò)展長(zhǎng)度放坏,不能繼續(xù)添加內(nèi)容)集合的特點(diǎn):集合中的數(shù)據(jù)咙咽,類型不必統(tǒng)一(集合中只能放引用數(shù)據(jù)類型(基本數(shù)據(jù)類型使用包裝類)的數(shù)據(jù)) 一般會(huì)強(qiáng)制集合中的類型統(tǒng)一(泛型),方便集合的管理集合是變長(zhǎng)的淤年,一般集合在初始創(chuàng)建時(shí)不指名長(zhǎng)度钧敞。 集合的長(zhǎng)度是隨著內(nèi)容數(shù)量的變化而變化提供了大量的方法,處理集合內(nèi)容的訪問麸粮,追加溉苛,刪除等基礎(chǔ)操作真實(shí)的商業(yè)化項(xiàng)目中,使用頻率集合 >> 數(shù)組 集合的分類線性集合:Collection接口(重要)List接口:有序(序號(hào))可重復(fù):可以通過下標(biāo)訪問元素弄诲,集合中可以出現(xiàn)重復(fù)的元素ArrayList實(shí)現(xiàn)類: 底層實(shí)現(xiàn)是基于數(shù)組 (日常編程中使用最多的)void add(Object o) 將元素o在集合的結(jié)尾處進(jìn)行添加void add(int index, Object o) 將元素o在index位置進(jìn)行添加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個(gè))當(dāng)index與o沖突時(shí)齐遵,優(yōu)先移除index位置比如 remove(2) 如果有元素2寂玲,則優(yōu)先移除下標(biāo)2位置boolean contains(Object o) 查找元素o在集合中是否存在boolean isEmpty() 判斷集合是否為空 等同于 size() == 0void clear() 清空集合創(chuàng)建new ArrayList(); 在內(nèi)存中創(chuàng)建了一個(gè)長(zhǎng)度是10的數(shù)組內(nèi)容接近容量警戒時(shí),數(shù)組x2擴(kuò)容LinkedList實(shí)現(xiàn)類 底層實(shí)現(xiàn)基于鏈表擁有ArrayList實(shí)現(xiàn)類中上述方法梗摇,結(jié)果與ArrayList操作基本一致Vector實(shí)現(xiàn)類 底層實(shí)現(xiàn)基于數(shù)組擁有ArrayList實(shí)現(xiàn)類中上述方法拓哟,結(jié)果與ArrayList操作基本一致(重要)數(shù)組與鏈表的區(qū)別數(shù)組在內(nèi)存中是連續(xù)分配的,其查找元素速度快伶授,插入和刪除元素速度慢鏈表在內(nèi)存中是分散存儲(chǔ)的断序,其查找元素速度慢流纹,插入和刪除元素速度快(重要)ArrayList與LinkedList的區(qū)別ArrayList是基于數(shù)組實(shí)現(xiàn)的,LinkedList是基于鏈表實(shí)現(xiàn)的數(shù)組與鏈表的區(qū)別ArrayList與Vector的區(qū)別ArrayList是線程不安全的违诗,效率較高漱凝。Vector是線程安全的,效率較低-----------------------------------------------------------------------練習(xí):創(chuàng)建Student對(duì)象學(xué)號(hào) sno姓名 sname生日 birthday控制臺(tái)上顯示***************1-新增學(xué)生2-刪除學(xué)生3-修改學(xué)生4-顯示所有學(xué)生5-退出***************所有產(chǎn)生的學(xué)生對(duì)象诸迟,放入到List的集合中刪除和修改 根據(jù)學(xué)號(hào)Set接口:無序(序號(hào))不重復(fù):不能通過下標(biāo)訪問元素茸炒,集合中不允許出現(xiàn)重的元素存放順序:不是由程序開發(fā)者決定的,由具體實(shí)現(xiàn)類的算法實(shí)現(xiàn)的基于Hash表來維護(hù)順序HashSet和LinkedHashSet基于二叉樹維護(hù)順序TreeSet迭代器: Iterator 迭代集合中的數(shù)據(jù)亮蒋,尤其是用于Set集合和Map集合中不要求順序的去重復(fù)List接口與Set接口的比較List接口:有序(序號(hào))可重復(fù):可以通過下標(biāo)訪問元素扣典,集合中可以出現(xiàn)重復(fù)的元素主要實(shí)現(xiàn)類:ArrayList,LinkedList慎玖,VectorSet接口:無序(序號(hào))不重復(fù):不能通過下標(biāo)訪問元素贮尖,集合中不允許出現(xiàn)重的元素主要實(shí)現(xiàn)類:HashSet,LinkedHashSet趁怔,TreeSet Set集合的訪問方式:迭代器鍵值集合:Map接口(重要)key和value兩部分組成map.put(key,value): 向集合中存放一個(gè)鍵值對(duì) 如果key已經(jīng)存在湿硝,則覆蓋原有數(shù)據(jù)Object value = map.get(key): 根據(jù)key值取得對(duì)應(yīng)的value Object value = map.remove(key): 根據(jù)key值移除對(duì)應(yīng)的鍵值對(duì),并返回它boolean containsKey(Object key) 某個(gè)key是否在集合中存在boolean containsValue(Object value) 某個(gè)value是否在集合中存在 boolean isEmpty() 是否為空集合int size() 集合的長(zhǎng)度 Set keySet() 得到所有key值組成的set集合: 用于遍歷map集合
主要實(shí)現(xiàn)類
HashMap,Hashtable润努,TreeMap
HashMap和TreeMap的區(qū)別:key值的存放順序(與Set中的定義是一樣)
面試問題:
Map接口與List接口(Collection接口)的區(qū)別
List接口:線性結(jié)構(gòu)关斜,一個(gè)節(jié)點(diǎn)存放一個(gè)數(shù)據(jù)
Map接口:鍵值對(duì)結(jié)構(gòu),一個(gè)節(jié)點(diǎn)可以存放key-value兩個(gè)數(shù)據(jù)
HashMap與HashTable的區(qū)別
HashMap是線程不安全的铺浇,效率稍高
HashTable是線程安全的痢畜,效率稍低
? ? 泛型
約束集合中的數(shù)據(jù)類型,保證集合中數(shù)據(jù)類型是一致
泛型帶來的優(yōu)勢(shì):
(1)保證數(shù)據(jù)類型一致鳍侣,方便后續(xù)程序的處理和邏輯編寫
(2)向集合中添加數(shù)據(jù)時(shí)丁稀,強(qiáng)力約束數(shù)據(jù)類型,保證數(shù)據(jù)準(zhǔn)確和安全
(3)遍歷或取得數(shù)據(jù)時(shí)倚聚,省略O(shè)bject類型強(qiáng)制轉(zhuǎn)換线衫,提升效率
(4)可以使用for...each句式快速遍歷集合
在聲明集合時(shí),在類名后的<>中寫出泛型
=======================================================================================
周四的練習(xí)? 改寫為使用Map集合實(shí)現(xiàn)
key是學(xué)號(hào)
value是學(xué)生對(duì)象
要求使用泛型
文件與流
java.io包中提供了關(guān)于文件和流的大部分的類
文件類? java.io.File
操作系統(tǒng)中的文件和文件夾(不包括文件中內(nèi)容)
? 文件
主要方法
boolean exist();? 測(cè)試文件或文件夾是否存在
boolean createNewFile(); 創(chuàng)建新的空文件
boolean delete();? 刪除文件
String getAbsolutePath();? 得到文件的絕對(duì)路徑
File getAbsoluteFile();? 得到文件的絕對(duì)路徑? 使用File對(duì)象表示該路徑
String getPath();? 得到文件的路徑(一般都是絕對(duì)路徑)
String getName();? 得到文件名(不包含目錄)
String getParent() 得到完整目錄(不包括文件名)
File getParentFile() 得到完整目錄的File對(duì)象(不包括文件名)
long length();? ? 得到文件的大谢笳邸(單位是Byte字節(jié))
輔助方法
boolean canExecute()? 是否為可執(zhí)行文件
boolean canRead()? ? ? 文件是否可讀
boolean canWrite()? ? 文件是否可寫
boolean setWritable(boolean writable)? 設(shè)置文件是否為可寫
練習(xí):
c://1.gif.jpg? 編寫一個(gè)程序授账,得到該文件的擴(kuò)展名
? 文件夾
f.mkdir();? 創(chuàng)建空的文件夾(只能創(chuàng)建最后一級(jí)目錄,當(dāng)出現(xiàn)多級(jí)目錄(父級(jí)目錄不存在)時(shí)惨驶,方法無效)
f.mkdirs();? 創(chuàng)建空的文件夾白热,包含多級(jí)目錄? 推薦使用!粗卜!
在特定文件夾中創(chuàng)建文件的方法請(qǐng)參照com.demo.les03.Test3類
輔助方法
boolean isDirectory()? 文件對(duì)象是否是一個(gè)文件夾
boolean isFile()? ? 文件對(duì)象是否是一個(gè)文件
String[] list()? ? 返回文件夾下包含的子文件和子文件夾? 返回字符串?dāng)?shù)組
File[] listFiles()? 返回文件夾下包含的子文件和子文件夾? File數(shù)組
-----------------------------------------------------------------------------------
在控制臺(tái)上實(shí)現(xiàn)cmd的以下功能
dir? 查看子目錄和子文件
cd xxx? 進(jìn)入某個(gè)子目錄
cd..? 返回上一級(jí)目錄
cd\? ? 返回根目錄
create xxx.jpg? ? 在當(dāng)前目錄中新建xxx.jpg文件
delete xxx.jpg? ? 在當(dāng)前目錄中刪除xxx.jpg文件
流(Stream)類:在兩種不同介質(zhì)之間數(shù)據(jù)交互的一種形式屋确。有人稱之為“管道”?
流向分類:針對(duì)的目標(biāo)是:內(nèi)存(程序)
輸入流
輸出流
單位分類:
字節(jié)流:最小單位:byte
字符流:最小單位:char(2byte)
功能分類
原始流:基礎(chǔ)的功能流
處理流:對(duì)原始流進(jìn)行加強(qiáng)
類名的后綴
? ? 輸入流? ? ? ? 輸出流
字節(jié)流? ? InputStream? ? OutputStream
字符流? ? Reader? ? ? ? Writer
字節(jié)輸入流的父類:InputStream? 它的所有的子類命名都是XXXXXInputStream
其余的類似
字符流可以操作純文本文件 txt
----------------------------------------------------------------
練習(xí):
在C://1.txt文檔中有一些英文字母(大小寫都有)
找到其中出現(xiàn)次數(shù)最多的字母(a,A算一個(gè)字母)
asdklfjalLKDSAFJOISDJLjlksdjflkajoiwjlfkALKASDLFJLK
例子:利用程序 操作文件內(nèi)容
原始流-提供了文件操作的相關(guān)方法
FileInputStream
FileOutputStream
FileReader
FileWriter
文件的復(fù)制
1.將被復(fù)制的文件一次性讀取至內(nèi)存,內(nèi)存中向外輸出。
文件過大乍恐,內(nèi)存可能裝不下
2.一邊讀,一邊寫(推薦)
保證使用較小內(nèi)存测砂,就可以復(fù)制較大的文件
功能分類
原始流:基礎(chǔ)的功能流
處理流:對(duì)原始流進(jìn)行加強(qiáng)
類名的前綴
Buffered? ? 緩沖流? 提供了緩沖區(qū)能夠提升流的讀寫效率
Data? ? ? ? 數(shù)據(jù)流? 提供了從流中提取各種數(shù)據(jù)類型的方法
Object? ? ? 序列化? 提供了將對(duì)象直接序列化的相關(guān)方法
處理輸出流
需要將內(nèi)容從緩沖區(qū)中刷入實(shí)際位置
將之前控制臺(tái)輸入學(xué)生信息的練習(xí)
將學(xué)生信息保存到一個(gè)文本文件中? 1.txt
1001,張三,1999-9-9
1002,趙四,1997-7-7
序列化與反序列化
將內(nèi)存中的對(duì)象直接傳輸?shù)狡渌橘|(zhì)中
ObjectInputStream? 將對(duì)象從其他介質(zhì)中讀入到內(nèi)存中? (反序列化)
ObjectOuputStream? 將對(duì)象從內(nèi)存?zhèn)鬏數(shù)狡渌橘|(zhì)中? ? (序列化)?
被序列化對(duì)象的類必須實(shí)現(xiàn)接口java.io.Serializable
系統(tǒng)中常用的類基本都實(shí)現(xiàn)了該接口:
String茵烈,包裝類,Date砌些,集合....
使用了集合裝對(duì)象呜投,將集合序列化的辦法,可以解決存放多個(gè)數(shù)據(jù)的問題
前提:集合中的對(duì)象必須實(shí)現(xiàn)java.io.Serializable接口
transient關(guān)鍵字存璃,修飾屬性
被該關(guān)鍵字修飾的屬性仑荐,不參與序列化操作
------------------------------------------------------------
練習(xí):昨天練習(xí)改寫為使用序列化的方式,保存數(shù)據(jù)
-----------------------------------------------------------
多線程
單核CPU在同一時(shí)間只能處理一個(gè)進(jìn)程
CPU的輪轉(zhuǎn)時(shí)間片:
時(shí)間片:一小段時(shí)間
由于輪轉(zhuǎn)的速度非匙荻快粘招,多個(gè)程序看起來就是同時(shí)運(yùn)行的
進(jìn)程:程序在系統(tǒng)中運(yùn)行時(shí)的一個(gè)體現(xiàn)
線程:一個(gè)進(jìn)程中“同時(shí)”執(zhí)行的程序分支
Java中如何實(shí)現(xiàn)多線程?
兩種
1.繼承java.lang.Thread類偎球,重寫這個(gè)類的run方法
2.實(shí)現(xiàn)java.lang.Runnable接口, 并實(shí)現(xiàn)接口中的run方法
線程的啟動(dòng)方式
直接創(chuàng)建對(duì)象調(diào)用run方法洒扎,這種方式不是多線程的啟動(dòng)方式,與常規(guī)的方法調(diào)用一致
如果某個(gè)類繼承了Thread類衰絮,通過start方法進(jìn)行啟動(dòng)
如果某個(gè)類實(shí)現(xiàn)了Runnable接口袍冷,將對(duì)象交給一個(gè)啟動(dòng)線程Thread對(duì)象,啟動(dòng)Thread對(duì)象的start
MyThread2 mt2 = new MyThread2();
Thread t = new Thread(mt2);
t.start();
線程安全
當(dāng)多個(gè)線程訪問同一個(gè)資源時(shí)猫牡,有可能某個(gè)線程執(zhí)行一半的情況下胡诗,讓出了CPU的執(zhí)行權(quán),
下一輪時(shí)間片被其他線程搶走淌友,造成了數(shù)據(jù)的不準(zhǔn)確
synchronized:保證線程安全
同步方法? 修飾方法煌恢,將方法變?yōu)橥椒椒ǎ褐荒鼙WC類內(nèi)部資源的安全
同步塊? ? 在塊中的代碼,對(duì)于塊聲明的資源亩进,進(jìn)行鎖定症虑,保證線程安全
面試問題
線程實(shí)現(xiàn)的方式
1.繼承java.lang.Thread類,重寫這個(gè)類的run方法
2.實(shí)現(xiàn)java.lang.Runnable接口, 并實(shí)現(xiàn)接口中的run方法
應(yīng)該使用哪種方式創(chuàng)建一個(gè)線程归薛?
推薦使用第2種方式來創(chuàng)建線程谍憔,將繼承的父類的位置留出來以防萬一。
使用Runnable來創(chuàng)建線程主籍,的啟動(dòng)方式习贫?
MyRunnable m = new MyRunnable();
Thread t = new Thread(m);
t.start();
同步:線程安全,在同步塊中的代碼必須是一個(gè)線程完整執(zhí)行后千元,才能繼續(xù)下一次競(jìng)爭(zhēng)苫昌。
同步:加鎖。? ? 理解為:線程鎖定了CPU
死鎖:多個(gè)共享資源A幸海,B
? ? ? 多個(gè)線程T1和T2
T1獲得了A資源祟身,請(qǐng)求B資源
T2獲得了B資源奥务,請(qǐng)求A資源
--------------------------------------------------------------------------
(選做)模擬三個(gè)面包師制作面包,面包的總數(shù)要求為30? (售票反過來做)