12.時間日期,字符串,內部類,拆裝箱
一.String,StringBuffer,StringBuilder
1.String是一個不可變的常量,每次修改都會產生新的對象
2.StringBuffer,StringBuilder都是可變字符序列,是字符串的增強版。
3.StringBuffer,StringBuilder作用:主要是當業務大量修改字符串的時使用
4.區別:StringBuffer是線程安全,StringBuild非線程安全
二.自動拆裝箱
1.基本類型轉換為封裝類型為裝箱過程,反之則是拆箱過程
2.八種基本數據類型對應的封裝類型
Byte b;//byte
Short s;//short
Integer i ;//int
Long l;//long
Float f;//float
Double d;//double
Character c;//char
Boolean bool;//boolean
3.從字符串轉換為基本據類型,都是由其封裝類型的valueOf()方法實現
例如:int num4 = Integer.valueOf("12345");
float f2 = Float.valueOf("3.1415");
一.內部類
1.成員內部類 語法
public class InnerDemo{
class Inner{}
}
2.特點:
a.會產生多個class文件,文件名為:InnerDemo$Inner.class
b.內部類可以直接訪問外部類的所有屬性和方法包括私有的
c.外部類不能直接訪問內部類的成員,要通過內部類的實例來調用
d.創建內部類的語法:InnerDemo.Inner in = new InnerDemo().new Inner();
e.所有的內部類都不能和外部類重名
f.內部類不能定義靜態方法和屬性,但是可以定義靜態常量
二.內部匿名類
1.語法: new interface/superClass(){//實體}
2.特點:
a.沒有名字
b.匿名類也會產生class文件,文件名是後綴加上1,2,3,4...
c.只能一次性使用
d.匿名類中不能定義靜態代碼塊
三.局部內部類
1.定義在方法體或者代碼塊中
2.特點:
a.其作用範圍只能是在該方法體中
b.不能用任何修飾符
c.也會產生類文件
枚舉
1.定義:是一個類,可以有屬性和方法,但其構造方法是私有的,外部不能訪問
2.特點:不能直接構造,用類名.枚舉值的方式創建枚舉對象
3.用法:代替接口來定義常量
4.優勢:可以對常量多定義,可以在獲取常量值時加入邏輯代碼,功能比接口更強大
5.語法:見案例
練習:
假設銀行賬戶狀態為:
0.開戶
1.激活
2.正常使用
3.凍結
4.睡眠
5.註銷
請設計枚舉類型保存這些狀態
要求:程序中可以隨時調用狀態值,和查看狀態屬性
思路:1枚舉中有狀態值屬性和狀態屬性
2.重載枚舉的構造方法
3.在get中添加邏輯代碼
/* * 練習:假設銀行賬戶狀態為: 0.開戶 1.激活 2.正常使用 3.凍結 4.睡眠 5.註銷 請設計枚舉類型保存這些狀態 要求:程序中可以隨時調用狀態值,和查看狀態屬性 思路:1枚舉中有狀態值屬性和狀態屬性 2.重載枚舉的構造方法 3.在get中添加邏輯代碼 */ package com.class1114; public class Class1 { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(AccountState.OPENaccount.getKey()); System.out.println(AccountState.OPENaccount.getValue()); } } enum AccountState{ OPENaccount(0),ACTIVATEaccount(1),NORMALaccount(2),BLOCKEDaccount(3),DORMANCYaccount(4),LOGOUTaccount(5); AccountState(int key){ this.key=key; } private int key; private String value; public int getKey() { return key; } public void setKey(int key) { this.key = key; } public String getValue() { switch(key){ case 0: value="開戶"; break; case 1: value="激活"; break; case 2: value="正常使用"; break; case 3: value="凍結"; break; case 4: value="睡眠"; break; case 5: value="註銷"; break; default: value=""; } return value; } public void setValue(String value) { this.value = value; } }
日期類型:
Date SimpleDateFormat Calendar
一.date常用方法
1.構造方法
2.getTime():獲取時間的毫秒數
二.SimpleDateFormat常用方法
1.構造方法
2.formart:日期轉字符串
3.parse:字符串轉日期
三.Calendar常用方法
1.getInstence():獲取日歷對象
2.set:設置日歷的字段值
3.get:獲取日歷的字段值
4.add:在日歷的字段值上增加數值
5.getTime:返回日歷的日期對象
練習
1.用java程序計算1到1000000的累加值,求這段程序運行的時間是多少?
2.打印輸出當前時間
格式:2012年1月1日 23點33分56秒234毫秒 時區:XXXX
3.輸入字符串 2012-12-12 2:21:24,把該字符串轉換成日期對象
/* * 1.用java程序計算1到1000000的累加值,求這段程序運行的時間是多少? */ package com.class1114; import java.util.Date; public class Class3 { public static void main(String[] args) { // TODO Auto-generated method stub Date d1=new Date(); long t1=d1.getTime(); int sum=0; for(int i=1;i<=1000000;i++){ sum+=i; } Date d2=new Date(); long t2=d2.getTime(); long t=t2-t1; System.out.println(t); } }
/* * 2.打印輸出當前時間 格式:2012年1月1日 23點33分56秒234毫秒 時區:XXXX */ package com.class1114; import java.text.SimpleDateFormat; import java.util.Date; public class Class2 { public static void main(String[] args) { // TODO Auto-generated method stub Date d=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH點mm分ss秒SSS毫秒 時區:ZZZZ"); String str=sdf.format(d); System.out.println(str); } }
/* * 3.輸入字符串 2012-12-12 2:21:24,把該字符串轉換成日期對象 */ package com.class1114; import java.text.SimpleDateFormat; import java.util.Date; public class Class4 { public static void main(String[] args) { // TODO Auto-generated method stub Date d=new Date(); String str="2012-12-12 21:21:24"; SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { d=sdf.parse(str); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } System.out.println(d); } }
例子
package com.demo1114; import org.junit.Test; import com.demo1114.Innerclass.Inner; public class Demo { @Test public void test(){ StringBuffer sb = new StringBuffer("hello"); sb.append(" hwua"); sb.insert(5, " are you "); System.out.println(sb.toString()); } //拆裝箱 @Test void test2(){ int i = Integer.valueOf("123"); Integer number = 100; int num2 = number; } public static void main(String[] args) { Demo d = new Demo(); d.test2(); Inner in = new Innerclass().new Inner(); Iinter ii = new Iinter() { @Override public void hello() { System.out.println("你好"); } }; ii.hello(); } } class Innerclass{ String name; private int age; class Inner{ String sex; void hello(){ age = 1; name="sds"; } } void test(){ Inner in = new Inner(); in.sex = ""; class TestInner{ String hh; } } } interface Iinter{ void hello(); }
package com.demo1114; import org.junit.Test; public class EnumDemo{ public static void main(String[] args) { System.out.println(Color.BLUE.getValue()); System.out.println(Color.BLUE.getKey()); } } enum Color { RED(1),YELLOW(2),BLUE(3),GREEN(4),BLACK(5); Color(int key){ this.key = key; } int key; String value; public int getKey() { return key; } public void setKey(int key) { this.key = key; } public String getValue() { if(key==1){ return "紅色"; }else if(key==2){ return "黃色"; }else if(key==3){ return "藍色"; }else if(key==4){ return "綠色"; }else if(key==5){ return "黑色"; } return ""; } public void setValue(String value) { this.value = value; } }
package com.demo1114; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.junit.Test; public class DateDemo { @Test void test1(){ Date date = new Date(); System.out.println(date); } //日期和字符串的轉換 //2012年1月1日 23點33分56秒234毫秒 時區:XXXX @Test public void test2(){ Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH點mm分ss秒SSS毫秒 時區:z"); String str = sdf.format(date); System.out.println(str); } public void test3() throws ParseException{ String str = "2017-11-14 23:23:23"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = sdf.parse(str); System.out.println(date.toString()); } public static void main(String[] args) { DateDemo dd = new DateDemo(); try { dd.test3(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package com.demo1114; import java.util.Calendar; public class CalenderDemo { public static void main(String[] args) { Calendar c = Calendar.getInstance(); c.add(Calendar.YEAR, -3); c.get(Calendar.DAY_OF_WEEK); System.out.println(c.get(Calendar.DAY_OF_WEEK)); } }
作業1
1.輸入文件名,判斷該文件是不是java文件
2.寫一個方法,實現對敏感字的替換返回替換後的字符串 String replaceWord(String src,String word,String desc)
src:原字符串
word:敏感詞
desc:替換後的詞
3.將下列詩句替換格式:
白日依山盡,黃河入海流,欲窮千裏目,更上一層樓。
替換為:
白日依山盡,
黃河入海流,
欲窮千裏目,
更上一層樓。
4.寫一個方法,判斷字符串中字符出現的次數 int countChar(String src,String char)
src:原字符串
char:出現的字符
5.判斷登錄名和密碼是否正確,登錄名大小寫忽略
登錄名為:admin
密碼為:sa123456
/* * 1.輸入文件名,判斷該文件是不是java文件 */ package com.class1113; import java.util.Scanner; public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); System.out.println("請輸入文件名"); String s=sc.next(); if(s.endsWith(".java")){ System.out.println("該文件是java文件"); }else{ System.out.println("不知道"); } } }
/* * 2.寫一個方法,實現對敏感字的替換返回替換後的字符串 * String replaceWord(String src,String word,String desc) src:原字符串 word:敏感詞 desc:替換後的詞 */ package com.class1113; public class Test2 { public static void main(String[] args) { // TODO Auto-generated method stub Test2 t2=new Test2(); String ss; ss=t2.replaceWord("woshishuiawo", "wo", "ni"); System.out.println(ss); ss=t2.replaceWord("我是中國人,我愛天空,天空是我親祖宗", "天空", "xx"); System.out.println(ss); } public String replaceWord(String src,String word,String desc){ String s=""; s=src.replaceAll(word, desc); return s; } }
/* * 3.將下列詩句替換格式: 白日依山盡,黃河入海流,欲窮千裏目,更上一層樓。 替換為: 白日依山盡, 黃河入海流, 欲窮千裏目, 更上一層樓。 */ package com.class1113; public class Test3 { public static void main(String[] args) { // TODO Auto-generated method stub String ss="白日依山盡,黃河入海流,欲窮千裏目,更上一層樓。"; String[] s1=ss.split(","); for(int i=0;i<s1.length;i++){ if(i!=s1.length-1){ System.out.println(s1[i]+","); }else{ System.out.println(s1[i]); } } } }
/* * 4.寫一個方法,判斷字符串中字符出現的次數 int countChar(String src,String char) src:原字符串 char:出現的字符 用indexof也可以 */ package com.class1113; public class Test4 { public static void main(String[] args) { // TODO Auto-generated method stub Test4 t4=new Test4(); int s=t4.countChar("oh;asgujho;hgwo;fhoa", "g"); System.out.println(s); } public int countChar(String src,String char1){ int count=0; for(int i=0;i<src.length();i++){ if(char1.charAt(0)==(src.charAt(i))){ System.out.println("xx"); count++; } } return count; } }
/* * 5.判斷登錄名和密碼是否正確,登錄名大小寫忽略 登錄名為:admin 密碼為:sa123456 */ package com.class1113; import java.util.Scanner; public class Test5 { public static void main(String[] args) { // TODO Auto-generated method stub String id="admin"; String password="sa123456"; Scanner sc=new Scanner(System.in); System.out.println("請輸入用戶名:"); String s1=sc.next(); if(id.compareToIgnoreCase(s1)==0){ System.out.println("請輸入密碼:"); String s2=sc.next(); if(password.compareToIgnoreCase(s2)==0){ System.out.println("登錄成功!"); }else{ System.out.println("密碼錯誤!"); } }else{ System.out.println("用戶名錯誤!"); } } }
泛型作業
自己設計一個MyMap類,模擬完成HashMap的存放數據過程
要求完成:
put(K k,V v);
get(K k);
size();
Set keySet();返回所有鍵的集合
ensureCapacity(int i);判斷是否需要擴容
思路:
1.寫一個MyEntry類,來存放鍵值對
class MyMap<K,V>{
MyEntry<K,V>[] mes;
int size;
}
class MyEntry<K,V>{
K k;
V v;
set/get
}
/* * 泛型 * 自己設計一個MyMap類,模擬完成HashMap的存放數據過程 要求完成: put(K k,V v); get(K k); size(); Set keySet();返回所有鍵的集合 ensureCapacity(int i);判斷是否需要擴容 */ package com.class1113; import java.util.HashSet; import java.util.Set; public class Test6 { public static void main(String[] args) { // TODO Auto-generated method stub MyMap<Integer,String> mmp=new MyMap<>(); int i=0; String j=i+""; while(i<20){ System.out.println(mmp.size()); System.out.println(mmp.put(i, j)); System.out.println(mmp.get(i)); i++; } System.out.println(mmp.size()); } } class MyMap<K,V>{ MyEntry<K,V>[] mes=new MyEntry[16]; int size; int Capacity=16; public boolean put(K k,V v){ boolean b1=false; MyEntry<K,V> me1=new MyEntry<>(); me1.setK(k); me1.setV(v); if(size>mes.length*3/4){ ensureCapacity(size); } for(int i=0;i<mes.length;i++){ if(mes[i]==null){ mes[i]=me1; b1=true; break; } } return b1; } public V get(K k){ V vv=null; MyEntry<K,V> me2=new MyEntry<>(); for(int i=0;i<mes.length;i++) { if(mes[i].getK()==k){ vv=mes[i].getV(); break; } } return vv; } public int size(){ int num=0; for(int i=0;i<mes.length;i++){ if(mes[i]==null){ num=i; break; } } return num; } public Set keyset(){ Set set=new HashSet(); for(int i=0;i<mes.length;i++){ set.add(mes[i].getK()); } return set; } public boolean ensureCapacity(int i){ boolean b2=false; if(i>mes.length*3/4){ MyEntry<K,V>[] newmes=new MyEntry[mes.length+(mes.length>>1)]; for(int j=0;i<mes.length;j++){ newmes[j]=mes[j]; } mes=newmes; b2=true; } return b2; } } class MyEntry<K,V>{ private K k; private V v; public K getK() { return k; } public void setK(K k) { this.k = k; } public V getV() { return v; } public void setV(V v) { this.v = v; } }
/* * 寫一個泛型類 寫一個泛型方法 contact(p , o) 如果實參為兩個整形,返回值為兩數之和 如果實參為兩個字符串,返回值為兩格字符串的拼接 如果實參為兩個浮點型,返回值為兩數之積 */ package com.class1113; public class Class1 { public static void main(String[] args) { // TODO Auto-generated method stub GenricitiyClass<Integer,Integer> gn1=new GenricitiyClass<>(); gn1.contact(2,5); GenricitiyClass<String,String> gn2=new GenricitiyClass<>(); gn2.contact("hehe", "da"); GenricitiyClass<Double,Double> gn3=new GenricitiyClass<>(); gn3.contact(12.5, 23.9); GenricitiyClass<Integer,Double> gn4=new GenricitiyClass<>(); gn4.contact(12, 23.9); } } class GenricitiyClass<E,T>{ public void contact(E e,T t){ Object a=null; if(e.getClass().toString().equals("class java.lang.Integer")&&t.getClass().toString().equals("class java.lang.Integer")){ a=(Integer)e+(Integer)t; }else if(e.getClass().toString().equals("class java.lang.String")&&t.getClass().toString().equals("class java.lang.String")){ a=(String)e+(String)t; }else if(e.getClass().toString().equals("class java.lang.Double")&&t.getClass().toString().equals("class java.lang.Double")){ a=(Double)e*(Double)t; } System.out.println(a); } }
作業2
1.輸入年月日,輸出這個日期是星期幾
2.輸出香港回歸那一天是星期幾
3.輸出新中國成立和澳門回歸相差多少天
4.輸出今年雙十一的三天前是星期幾
5.輸入年份月份,打印輸出這個月的月歷 格式如下
一 二 三 四 五 六 日
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28
/* * 1.輸入年月日,輸出這個日期是星期幾 */ package com.class1114; import java.util.Calendar; import java.util.Scanner; public class Test1 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); System.out.println("請輸入某年:"); int year=sc.nextInt(); System.out.println("請輸入某月:"); int month=sc.nextInt(); System.out.println("請輸入某日:"); int date=sc.nextInt(); Calendar c=Calendar.getInstance(); c.set(year,month-1,date); int d=c.get(Calendar.DAY_OF_WEEK)-1; System.out.println("那天是星期"+d); } }
/* * 2.輸出香港回歸那一天是星期幾 * 1997.7.1 */ package com.class1114; import java.util.Calendar; public class Test2 { public static void main(String[] args) { // TODO Auto-generated method stub Calendar c=Calendar.getInstance(); c.set(1997, 6, 1); int d=c.get(Calendar.DAY_OF_WEEK)-1; System.out.println("香港回歸那天是星期"+d); } }
/* * 3.輸出新中國成立和澳門回歸相差多少天 * 1949.10.1;1999.12.20 */ package com.class1114; import java.util.Calendar; public class Test3 { public static void main(String[] args) { // TODO Auto-generated method stub Calendar c1=Calendar.getInstance(); c1.set(1949, 9, 1); Calendar c2=Calendar.getInstance(); c2.set(1999, 11, 20); long l1=c1.getTime().getTime(); long l2=c2.getTime().getTime(); long i=(l2-l1)/1000/60/60/24; System.out.println(l1); System.out.println(l2); System.out.println("新中國成立和澳門回歸相差"+i+"天"); } }
/* *4.輸出今年雙十一的三天前是星期幾 */ package com.class1114; import java.util.Calendar; public class Test4 { public static void main(String[] args) { // TODO Auto-generated method stub Calendar c=Calendar.getInstance(); c.set(2017, 10, 11); c.add(Calendar.DATE, -3); System.out.println(c.get(Calendar.DAY_OF_WEEK)-1); } }
/* * 5.輸入年份月份,打印輸出這個月的月歷 格式如下 一 二 三 四 五 六 日 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 */ package com.class1114; import java.util.Calendar; import java.util.Scanner; public class Test5 { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc=new Scanner(System.in); System.out.println("請輸入某年:"); int year=sc.nextInt(); System.out.println("請輸入某月:"); int month=sc.nextInt(); Calendar c=Calendar.getInstance(); c.set(year, month-1, 1); System.out.println("一"+"\t"+"二"+"\t"+"三"+"\t"+"四"+"\t"+"五"+"\t"+"六"+"\t"+"日"); int j=1; //輸出空格 if(c.get(Calendar.DAY_OF_WEEK)==1){ for(int i=0;i<6;i++){ System.out.print("\t"); } }else{ while(j<c.get(Calendar.DAY_OF_WEEK)-1){ System.out.print("\t"); j++; } } int i=1; //輸出日期 while(c.get(Calendar.MONTH)==month-1){ System.out.print(i+"\t"); c.add(Calendar.DAY_OF_MONTH, 1); //換行 if(c.get(Calendar.DAY_OF_WEEK)-1==1){ System.out.println(); } i++; } } }
12.時間日期,字符串,內部類,拆裝箱