枚舉enum
枚舉是一個類,就是一個引用資料類型
枚舉類中根據需求定義多個枚舉值,
枚舉值一旦被定義,不允許被改變,靜态的常量
01.在Student類中定義Gender類型的sex私有屬性:
private Gender sex;
02.建立Gender的枚舉
public enum Gender{
MAN("男"),WOMEN("女");
private String sex;
private Gender(String sex){
this.sex=sex;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
03.在測試類中調用
stu.setSex(Gender.MAN)
String sex = stu.getSex().getSex();
System.out.println(sex);//控制台輸出--->男
1.我們是用的封裝不能從根本上禁止使用者的輸入
2.使用枚舉,從根本上限定使用者的輸入
3.所有的枚舉值都是靜态常量,可以通過枚舉類.枚舉值
4.枚舉類中構造方法,必須是私有的 private
基本資料類型的包裝類
1.集合中的泛型,<>不允許出現基本資料類型,包裝類可以
2.定義了一個基本資料類型的變量,變量名能點出來東西
3.基本資料類型不能轉換成對象,包裝類可以
4.所有的包裝類都是由final修飾的,不允許被繼承
5.在基本資料類型需要轉換成對象的時候,使用包裝類
6.jdk1.5以後,允許基本資料類型和包裝類進行混合運算,底層有裝箱和拆箱操作
基本資料類型 包裝類
byte Byte
short Short
int Integer
long Long
float Float
double Double
上面的六種都是數值類型!都是 extends Number implements Comparable<T>
public abstract class Number implements java.io.Serializable 支援 序列化
char Character
boolean Boolean
上面兩種都是 implements java.io.Serializable, Comparable<T>
比如說:
public Serializable getNum(Serializable s){
}
我們調用getNum(參數可以是8種包裝類中的任何一個)
傳回值也可以是 8種包裝類中的任何一個
裝箱和拆箱--->包裝類和基本資料類型的轉換
01.裝箱:把基本資料類型轉換成對應的包裝類Integer num=1
02.拆箱:把包裝類轉換成對應的基本資料資料類型 int num2=num
基本資料類型轉換:
01.自動類型轉換
02.強制類型轉換
引用資料類型轉換
01.向下轉換
02.向上轉換
/**
* 1.所有的包裝類都有對應的基本資料類型作為參數,來構造自己的執行個體
*/
@SuppressWarnings("unused")
@Test
public void Test01(){
Byte b=new Byte((byte) 1);
Short s=new Short((short) 1);
Integer i=new Integer(1);
Long l=new Long(1);
Float f=new Float(1.0);
Double d=new Double(1.0);
Character c=new Character(\'1\');
Character c2=new Character((char) 20);
Boolean bo=new Boolean(true);
}
/**
* 1.Float有三種執行個體化的方法參數分别是double float 和String
* 2.除了Character以外的的7種包裝類都有将String 作為參數 來建構自己的執行個體
* 6種數值類型的的包裝類都繼承了Number
* 是以在使用String作為參數來建立自己的執行個體時
* 如果參數不能轉換成數值 則抛出NumberFormatException
*/
@SuppressWarnings("unused")
@Test
public void Test02(){
Byte b=new Byte("1");
Short s=new Short("1");
Integer i=new Integer("1");
Long l=new Long("1");
Float f=new Float("1");
Double d=new Double("1");
//Character c=new Character("1");
Boolean bo=new Boolean("1");
Boolean bo2=new Boolean(true);
System.out.println(bo+"\n"+bo2);
}
/**
* 1.除了Character以外的的7種包裝類都有parseXxx(String s)
* 比如說Byte b=new Byte("1");
* b.parseByte(String);
* 01.4種整型對應的包裝類都是parseXxx(String s,int radix)radix進制轉換
* 02.其他4種沒有parseXxx(String s,int radix)
* 03.Character壓根沒有parseXxx()
*/
@SuppressWarnings("unused")
@Test
public void Test03(){
Byte b=new Byte("1");
Short s=new Short("1");
Integer i=new Integer("1");
Long l=new Long("1");
Float f=new Float("1");
Double d=new Double("1");
Character c=new Character(\'1\');
Boolean bo=new Boolean("true");
System.out.println(bo);
}
/**
* 4.進制轉換 需要學習位運算
*/
@Test
public void Test04(){
System.out.println("2進制的10對應的資料----->"+Integer.toBinaryString(10));
System.out.println("8進制的10對應的資料----->"+Integer.toOctalString(10));
System.out.println("16進制的10對應的資料----->"+Integer.toHexString(10));
}
/**
* 5.valueOf
* 把基本資料類型轉換成對應的包裝類---->裝箱
* xxxValue 8中包裝類型都有
* 把xxx類型轉換成對應的基本資料類型--->拆箱
*/
@Test
public void Test05(){
int num=3;
Integer i=Integer.valueOf(num);
num=i.intValue();
}
/**
* 6.經典的面試題
* 因為Integer.valueOf(num)會緩存-128~127之間的資料
* 如果我們的資料在這個區間,不回去建立新的對象,而是從緩存中擷取
* 否則會new Integer()
*/
@Test
public void Test06() {
int num1=127;
int num2=127;
System.out.println(num1==num2);
Integer a1=new Integer(127);
Integer b1=new Integer(127);
System.out.println(a1==b1);
Integer a=127;
Integer b=127;
System.out.println(a==b);
Integer c=128;
Integer d=128;
System.out.println(c==d);
System.out.println("1"+1+1);
}
/**
* 111
* 211
*/
@Test
public void Test07() {
System.out.println("1"+1+1);
System.out.println(1+1+"1"+1);
}
Math
01.就是一個算術類
02.是final修飾
03.除了構造方法之外所有的方法都是靜态方法,友善我們使用
天花闆函數:
ceil 天 向上取整 3.1 ==》4 3.0 ==》3
floor 地 向下取整 3.9 ==》3
四舍五入
round(2.5)==>3
round(2.498)==>2
Random
随機的boolean 數值 random.nextBoolean()
随機0-1之間的小數 random.nextDouble()
随機int類型的整數 random.nextInt()
随機int類型指定的整數 random.nextInt(10)// 傳回的是0-10以内 不包含10
String
/**
* 大小寫轉換
* 字元串的長度 比較equals 忽略大小寫的比較equalsIgnore
*/
@Test
public void test01(){
String str1="hello";
String str2="HELLO";
System.out.println("小寫變成大寫"+str1.toUpperCase());
System.out.println("大寫變成小寫"+str2.toLowerCase());
System.out.println("字元串的長度"+str1.length());
System.out.println("hello.equals.HELLO----->"+str1.equals(str2));
System.out.println("hello.equalsIgnoreCase.HELLO----->"+str1.equalsIgnoreCase(str2));
}
/**
* 字元串轉換成char類型的數組
*/
@Test
public void test02(){
String str1="h e l l o";
char[] strs = str1.toCharArray();
System.out.println(strs.length);//9
for (char c : strs) {
System.out.println(c);
}
}
/**
* 字元串拆分 String regex 正規表達式
*/
@Test
public void test03(){
String str1="h1+e2+l3+l4+o5";
String[] strs = str1.split("\\+");//有+号的地方進行拆分,不顯示+号
for (String c : strs) {
System.out.println(c);
}
}
/**
* 查詢指定字元的位置 下标從0開始
*/
@Test
public void test04(){
String str1="[email protected]";
System.out.println("@出現的位置"+str1.indexOf("@"));
System.out.println(".最後一次出現的位置"+str1.lastIndexOf("."));
}
/**
* 截取字元串 指向拿到qq.com
*/
@Test
public void test05(){
String str1="[email protected]";
int begin = str1.indexOf("@");
int end = str1.lastIndexOf(".");
str1 = str1.substring(begin+1, end);//begin包含目前位置,end不包含目前位置
System.out.println(str1);
}
/**
* 替換字元串 把qq換成163
*/
@Test
public void test06(){
String str1="[email protected]";
str1 = str1.replace("qq", "163");
System.out.println(str1);
}
/**
* 傳回字元串中指定位置的字元
*/
@Test
public void test07(){
String str1="[email protected]";
char s=str1.charAt(6);
System.out.println(s);
}
/**
* 連接配接字元串concat(String)
*/
@Test
public void test08(){
System.out.println("1"+11+1);//1111
System.out.println(11+1+"1"+5.0+"a");//1215.0a
String str1="a";
String str2="bc";
System.out.println(str1.concat(str2));
}
/**
* 判斷某個字元串中是否包含另一個完整的字元串
*/
@Test
public void test09(){
String str1="abcdef";
boolean b = str1.contains("def");
System.out.println(b);
}
/**
* String StringBuffer StringBuilder
* String str1 = "abcdefg";
str1 = "abc"; // 每次都是一個新對象
01.String對象不可變
02.StringBuffer StringBuilder對象可變
03.StringBuffer線程安全 但是 效率比StringBuilder低 ,适合于多線程的情況下使用
04.StringBuilder 線程不安全,但是效率是最高的! 适合于單線程的情況下使用
*/
@Test
public void test10(){
String str1="hello";// 定義一個變量
int num = 1000000; // 定義操作字元串的次數
// 設定開始時間
long begin = System.currentTimeMillis();
for (int i = 0; i < num/100; i++) {
str1+="bye";
}
long end = System.currentTimeMillis();
System.out.println("String操作1w次執行的時間是:"+(end-begin));
// 使用StringBuffer
str1="hello";
StringBuffer sb=new StringBuffer(str1);
//設定開始時間
begin=System.currentTimeMillis();
for (int i = 0; i < num; i++) {
sb.append("bye");
}
end=System.currentTimeMillis();
System.out.println("StringBuffer操作100w次執行的時間是:"+(end-begin));
// 使用StringBuilder
str1="hello";
StringBuilder sb2=new StringBuilder(str1);
//設定開始時間
begin=System.currentTimeMillis();
for (int i = 0; i < num; i++) {
sb2.append("bye");
}
end=System.currentTimeMillis();
System.out.println("StringBuilder操作100w次執行的時間是:"+(end-begin));
}