包裝類的基本用法
為什么需要包裝類(Wrapper Class)
java並不是純面向對象的語言,java語言是一個面向對象的語言,但是java中的基本數據類型卻不是面向對象的,但是我們在實際使用中經常將基本數據類型轉換成對象,便於操作,比如,集合的操作中,這時,我們就需要將基本類型數據轉化成對象!
包裝類和基本數據類型的關系
基本數據類型 包裝類
byte Byte
boolean Boolean
short Short
char Character
int Integer
long Long
float Float
double Double
包裝類的繼承關系
包裝類的基本操作
詳見jdk api
1 public class TestInteger { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 Integer i1=new Integer(123); 6 Integer i2 = new Integer("123"); 7 System.out.println("i1=i2:"+(i1==i2));//false 8 System.out.println("i1.equals(i2):"+i1.equals(i2)); 9 System.out.println(i2); 10 System.out.println(i2.toString());//說明重寫了toString方法 11 Integer i3=new Integer(128); 12 System.out.println(i1.compareTo(i3));//-1 13 System.out.println(i1.compareTo(i2));//0 14 System.out.println(i3.compareTo(i2));//1 15 //(1)Integer-->int 包裝對象.intValue() 16 int i=i1.intValue(); 17 System.out.println(Integer.max(10, 20));//返回最大值 18 //(2)String -->int 包裝類類名.parseInt(String s) 19 int ii=Integer.parseInt("234"); 20 //(3)int -->Integer 21 Integer i4=Integer.valueOf(123); 22 //(4)int-->String 23 String str=ii+""; 24 String s=String .valueOf(ii); 25 //(5)String-->Integer; 26 Integer i5=new Integer("345"); 27 //(6)Integer-->String 28 String ss=i5.toString(); 29 System.out.println(ss); 30 } 31 32 }
4.StringBuilder_StringBuffer 用法_JDK 底
層源碼分析---->請見源碼查看
4.1 可變的字符串
StringBuilder:效率高,安全性低
StringBuffer:效率低,安全性高
4.2StringBuilder 的常用方法的使用
- append()
- delete()
- insert()
- StringBuilder()構造函數

package com.bjsxt.stringbuilder; public class TestStringBuffer { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); // 字符串的追加 sb.append("hello"); sb.append(true); sb.append('你'); sb.append(100); System.out.println(sb.toString()); sb.delete(3, 5);// 含頭不含尾 System.out.println(sb); sb.deleteCharAt(1);// 刪除指定位置上的字符 System.out.println(sb); sb.insert(2, '好'); System.out.println(sb); System.out.println(sb.indexOf("t") + "\t" + sb.indexOf("k")); } }

package com.bjsxt.stringbuilder; public class TestStringBuilder2 { public static void main(String[] args) { StringBuilder sb=new StringBuilder();//實際上創建了一個長度為16的char類型的數組 StringBuilder sb2=new StringBuilder("hello");//5+16 sb2.append("world"); sb2.append("world"); sb2.append("world"); sb2.append("world"); sb2.append("world"); sb2.append("world"); sb2.append("world"); sb2.append("world"); System.out.println(sb2); System.out.println("容量"+sb2.capacity()+"\tsb2的長度"+sb2.length()); } }
4.3StringBuilder 的 JDK 源碼分析
5.不可變字符序列和可變字符序列的深入
javap 是 JDK 自帶的一個工具,可以反編譯,也可以查看 Java
編譯器生成的字節碼,是分析代的一個好工具。
-c 對代碼進行反匯編

package com.bjsxt.test; public class Test { public static void main(String[] args) { String str1="abc"+"dbc"; String str4="abcdbc"; //在運行時會在堆中創建對象 /** * StringBuilder sb=new StringBuilder(); * sb.append("abcdbc"); * sb.append("cde"); * String str2=sb.toString(); * * */ String str2=str1+"cde"; String str3=new String("hello"); System.out.println(str1==str4); /**在等號的右側有變量參與運行或new關鍵字,將在堆內存開辟空間*/ String str6=""; for(int i=0;i<10;i++){ StringBuilder sb2=new StringBuilder(); sb2.append(str6); sb2.append(i); str6=sb2.toString(); //str6=str6+i; } System.out.println(str6); /**只創建了一個對象,sb對象*/ StringBuilder sb=new StringBuilder(); for(int i=0;i<10;i++){ sb.append(i); } System.out.println(sb); } }
6.java.util.Date 類
6.1java.util.Date 類
long getTime()
- 返回自 1970 年 1 月 1 日以來,由此 Date 對象表示的00:00:00 GMT 的毫秒數
6.2java.sql.Date 類
6.3java.sql.Date 類

package com.bjsxt.testdate; import java.util.Date; public class TestDate { public static void main(String[] args) { Date d=new Date(); System.out.println(System.currentTimeMillis());//1970-1-1 00:00:00 Date d2=new Date(1000L); System.out.println(d2.toGMTString()); System.out.println(d.getTime()); System.out.println(d.before(d2)); //false System.out.println(d.after(d2)); //true System.out.println(d.getTime()<d2.getTime()); System.out.println(d.getTime()>d2.getTime()); // System.out.println(d2.toString()); /**java.util.Date類的子類*/ java.sql.Date sqlDate=new java.sql.Date(1000L); System.out.println(sqlDate); java.sql.Time sqlTime=new java.sql.Time(1000L); System.out.println(sqlTime.toGMTString()); java.sql.Timestamp timestamp=new java.sql.Timestamp(1001L); System.out.println(timestamp); } }
7.DateFormat 和 SimpleDateFormat 類
完成字符串和時間對象的轉換

package String; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class TestDateFormat { public static void main(String[] args) throws ParseException { // TODO Auto-generated method stub DateFormat d=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); /** * Date-->String format(Date d) * String-->Date parse(String s) */ Date date=new Date(3456465434131346L); System.out.println(date); String strDate=d.format(date); System.out.println(strDate); Scanner input=new Scanner(System.in); System.out.println("請輸入一個時間:yyyy-MM-dd hh:mm:ss.SSS"); String str=input.nextLine(); Date d2=d.parse(str); System.out.println(d2); } } package String; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Scanner; public class TestDateFormat { public static void main(String[] args) throws ParseException { // TODO Auto-generated method stub DateFormat d=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); /** * Date-->String format(Date d) * String-->Date parse(String s) */ Date date=new Date(3456465434131346L); System.out.println(date); String strDate=d.format(date); System.out.println(strDate); Scanner input=new Scanner(System.in); System.out.println("請輸入一個時間:yyyy-MM-dd hh:mm:ss.SSS"); String str=input.nextLine(); Date d2=d.parse(str); System.out.println(d2); } }
8.Calendar 類
8.1Calendar 的類
人們對於時間的認識是:某年某月某日,這樣的日期概念。計算機是 long 類型的數字。通過 Calendar 在二者之間搭起橋梁!
GregorianCalendar 是 Calendar 的一個具體子類,提供了世界上大多數國家/地區使用的標准日歷系統。
注意:
月份:一月是 0,二月是 1,以此類推,是 12 月是 11
星期:周日是 1,周一是 2,。。。周六是 7

package com.bjsxt.calendar; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Scanner; public class Test { public static void main(String[] args) throws ParseException { Scanner input=new Scanner(System.in); System.out.println("請輸入一個日期:yyyy-MM-dd"); String str=input.next(); //創建DateFormat對象,用於將String轉Date DateFormat df=new SimpleDateFormat("yyyy-MM-dd"); Date d=df.parse(str); //Date對象所表示的時間設置到Calendar中 Calendar cal=new GregorianCalendar(); cal.setTime(d); //獲取輸入的日期中的date部分 int nowDate=cal.get(Calendar.DAY_OF_MONTH); //14 //將日期設置為1號,設置成2030-2-1 cal.set(Calendar.DAY_OF_MONTH, 1); //獲取1號是星期幾? int dayOfWeek=cal.get(Calendar.DAY_OF_WEEK); System.out.println("日\t一\t二\t三\t四\t五\t六"); for(int i=1;i<dayOfWeek;i++){ System.out.print("\t"); } //獲取輸入的月份的最后一天 int maxDay=cal.getActualMaximum(Calendar.DAY_OF_MONTH); //System.out.println(maxDay); for(int i=1;i<=maxDay;i++){ System.out.print(i); if(i==nowDate){ System.out.print("*"); } System.out.print("\t"); if(cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY){ System.out.println(); } cal.add(Calendar.DAY_OF_MONTH, 1); } } }

package com.bjsxt.calendar; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class TestCalendar { public static void main(String[] args) { //父類引用指向子類對象 Calendar cal=new GregorianCalendar(); cal.set(2030, 1, 14); System.out.println("年"+cal.get(1)); System.out.println("年:"+cal.get(Calendar.YEAR)); //getTime(),將Calendar轉換成Date對象 Date d=cal.getTime(); System.out.println(d); //setTime(Date) 將Date對象所表示的時間設置到日歷中 Date date=new Date(1000L); cal.setTime(date); System.out.println("年:"+cal.get(Calendar.YEAR)); System.out.println("月:"+cal.get(Calendar.MONTH)); System.out.println("日:"+cal.get(Calendar.DAY_OF_MONTH)); cal.add(Calendar.DAY_OF_MONTH, 10); System.out.println("日:"+cal.get(Calendar.DAY_OF_MONTH)); cal.add(Calendar.DAY_OF_MONTH, -100); System.out.println("年:"+cal.get(Calendar.YEAR)); System.out.println("月:"+cal.get(Calendar.MONTH)); System.out.println("日:"+cal.get(Calendar.DAY_OF_MONTH)); } }
9.Math 類
9.1Math 類的常用方法

package String; public class TestMath { public static void main(String[] args) { System.out.println("絕對值:"+Math.abs(23)+"\t"+Math.abs(-23)+"\t"+Math.abs(0)); System.out.println("向上取整,再轉double:"+Math.ceil(23.0001)+"\t"+Math.ceil(-9.9999)); System.out.println("向下取整再轉double"+Math.floor(23.9999)+"\t"+Math.floor(-23.0001)); System.out.println("最值:"+Math.max(20, 10)+"\t"+Math.min(2, 40)); System.out.println("5的2次方:"+Math.pow(5, 2)+"5的立方"+Math.pow(5, 3)); System.out.println("隨機數[0,1):"+Math.random()); int ran=(int)(Math.random()*9000)+1000; System.out.println("1000-9999之間的隨機數:"+ran); System.out.println("四舍五入:"+Math.round(34.566)+"\t"+Math.round(34.345)); System.out.println("開方:"+Math.sqrt(55)); } }
9.2 靜態導入

package String; import static java.lang.Math.*;//靜態導入 public class TestStaticImport { public static void main(String[] args) { System.out.println(abs(-20)); System.out.println(Math.abs(-2)); System.out.println(random()); } public static int abs(int number){ return number; } }
JDK1.5
10.File 類
文件和目錄路徑名的抽象表示形式。一個 File 對象可以代表一個文件或目錄
- 可以實現獲取文件和目錄屬性等功能
- 可以實現對文件和目錄的創建、刪除等功能
常用方法有:
- createNewFile() //有則不創建 返回false,沒有則創建 返回true
- delete() //刪除成功 返回true ,失敗返回false
- getAbsoluteFile() //返回絕對路徑
- getPath() //返回相對路徑
- getName() //返回文件名
- isFile() //是否為文件 boolean
- length //長度
- mkdir() //創建單層目錄
- mkdirs() //創建多級目錄
- delete() //只能刪除空目錄
- list() //返回一個字符串數組,命名由此抽象路徑名表示的目錄中的文件和目錄。
- listFiles() //返回一個抽象路徑名數組,表示由該抽象路徑名表示的目錄中的文件和目錄。
File 不能訪問文件內容
10.1File 類操作文件
10.2File 類操作目錄

package dead; import java.io.File; import java.io.IOException; public class TestFile { //使用file類去操縱文件 public static void main(String[] args) throws IOException { //創建File類的文件 File f1=new File("D:/a1.txt");//絕對路徑 File f2=new File("D:\\a2.txt"); File f3=new File("a.txt");//相對路徑 File f5=new File("D:\\test");//目錄 File f4=new File(f5,"a4.txt"); File f6=new File("D:"+File.separator+"a5.txt"); /** * File操作文件的相關方法 */ //System.out.println(f1.createNewFile()); System.out.println(f1.delete());//直接從磁盤上刪除 System.out.println(f1.exists()); System.out.println("絕對路徑:"+f3.getAbsolutePath()); System.out.println("相對路徑:"+f3.getPath()); System.out.println(f3); //相對路徑 System.out.println("是否是文件"+f3.isFile()); System.out.println("是否是文件"+f5.isFile()); System.out.println("文件中內容的長度"+f3.length()); } }

package com.bjsxt.file; import java.io.File; public class TestDirectory { public static void main(String[] args) { //創建File類的對象 File f=new File("D:"+File.separator+"test"); f.mkdir(); //用於創建目錄 ,單層目錄 System.out.println("目錄是否存在"+f.exists()); System.out.println("是目錄還是文件:"+f.isDirectory()); System.out.println("是目錄還是文件:"+f.isFile()); File f2=new File("D:\\aa\\bb\\cc"); f2.mkdirs(); //用於創建目錄,多層目錄 f.delete(); File parent=f2.getParentFile(); //獲取cc目錄的父級目錄 System.out.println(parent); parent.delete(); //delete刪除目錄時,只允許刪除空目錄 f2.delete();//刪除cc parent.delete();//刪除bb File f3=new File("D:\\"); String [] strFile=f3.list(); System.out.println(strFile.length); //數組中元素的個數 for(String s:strFile){ System.out.println(s); } System.out.println("\n--------------------------------\n"); File [] flist=f3.listFiles(); for(File file:flist){ System.out.println(file); } } }
11.使用遞歸算法遍歷目錄結構和樹結構
編寫一個程序:以樹狀結構展現特定的文件夾及其子文件
(夾)(使用遞歸來做)

package Testfile; import java.io.File; public class TestFile { public static void main(String[] args) { File f=new File("E:\\eclipse"); printFile(f,0); } public static void printFile(File file,int level){ //打印樹狀結構的層次關系 for(int i=0;i<level;i++){ System.out.print("-"); } //輸出目錄或者文件的名稱 System.out.println(file.getName()); if(file.isDirectory()){//判斷file對象是否是目錄 File[] listFiles = file.listFiles(); for(File temp:listFiles){ //自己調用自己 printFile(temp,level+1); } } } }
12.枚舉
12.1 枚舉的定義
只能夠取特定值中的一個
使用 enum 關鍵字
12.2 枚舉的使用
而每個被枚舉的成員實質就是一個枚舉類型的實例,他們默認都是 public static final 的。可以直接通過枚舉類型名直接使用它們。)
強烈建議當你需要定義一組常量時,使用枚舉類型盡量不要使用枚舉的高級特性,事實上高級特性都可以使用普通類來實現,沒有必要引入復雜性!
12.3 枚舉與類的關系
所有的枚舉類型隱性地繼承自 java.lang.Enum。(枚舉實質上還是類!)

package com.bjsxt.enumpro; public enum Gender { 男,女; //男,女 public static final private String name; public void setName(String name){ this.name=name; } public String getName(){ return this.name(); } }

package com.bjsxt.enumpro; /**枚舉在自定義類中的使用*/ public class Person { private String name;//姓名 private int age;//年齡 private Gender gender;//性別 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Gender getGender() { return gender; } public void setGender(Gender gender) { this.gender = gender; } public Person(String name, int age, Gender gender) { super(); this.name = name; this.age = age; this.gender = gender; } public Person() { super(); } }

package com.bjsxt.enumpro; public class TestGender { public static void main(String[] args) { Gender sex=Gender.女; // //Gender g=new Gender();//錯誤的,因為枚舉不是類,不能有構造方法 sex.setName("張三"); //System.out.println(sex.getName()); /**枚舉與String類型之間的轉換*/ String str=sex.toString(); System.out.println(str); /**枚舉-->String toString()方法 * String -->枚舉*/ Gender g=Enum.valueOf(Gender.class, "男"); System.out.println(g); /**枚舉在switch中的使用*/ switch(g){ case 男: System.out.println("男----------"); break; case 女: System.out.println("女---------------"); break; } /**枚舉在自定義類中的使用*/ Person p=new Person("marry", 20, Gender.女); } }