1. 程式人生 > >12.時間日期,字符串,內部類,拆裝箱

12.時間日期,字符串,內部類,拆裝箱

語法 append string bool 格式 activate 增強 accounts try

一.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.時間日期,字符串,內部類,拆裝箱