1、Switch能否用string做引數?
在Java 5以前,switch(expr)中,expr只能是byte、short、char、int,從Java 5開始,Java中引入了列舉型別,expr也可以是enum型別(列舉型別),從Java 7開始,expr還可以是字串(String),但是長整型(long)在目前所有的版本中都是不可以的,
解釋:
expr可能是一個列舉型別,或者一個整數的運算式(int 或Integer),而short byte char可以默認隱式的轉換為int型別,所以可以而double和float不行
從JDK1.7之后expr支持string型別
本質上來說,對string的支持,其實還是對int型別的支持
不懂就寫:
enum型別
enum型別是一種特殊的型別,他的值包含在一個命名的常量集合中,這些常量稱為列舉符,
說明:列舉變數同struct和union一樣,可以使用不同的方式說明,
//ex: enum week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; enum week a,b,c; //或:ex: enum week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }a,b,c; //或: enum { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }a,b,c;列舉符表中的識別符號宣告為int型別的常量,它可以出現在常量可以出現的任何地方,
如果其中不含有 = 的列舉符,則相應常量值從0開始,且列舉常量值從左至右依次遞增1,enum week { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }day;如上定義week,其結果Monday = 0,Tuesday = 1…Sunday = 6
如果其中含有 = 的列舉符,則該列舉符的值由該運算式指定,其前面識別符號遵守之前的規則(即:從零開始,從左至右依次遞增1或從前面含有 = 的列舉符的值開始遞增),其后的識別符號的值從該值開始依次遞增,enum week { Monday, Tuesday = 2, Wednesday, Thursday = 3, Friday, Saturday, Sunday }day;如上所定義,則其結果為Monday = 0,Tuesday = 2,Wednesday = 3,Thursday = 3,Friday = 4…Sunday = 6.
當列舉型別和列舉變數放在一起定義時,列舉型別的名字(就是enum week中的week)可以省略不寫,意思是上圖的有兩種寫法
第一種:
enum week{Mon = 1, Tues, Wed, Thurs}num;第二種:
enum {Mon = 1, Tues, Wed, Thurs}num;
注意:
1、同一作用域中的各列舉符的名字必須互不相同,也不能與普通變數名相同,但其值可以相同,
2、列舉值是常量,不是變數,不能在程式中用賦值陳述句在對其賦值
ex: Friday = 1;
Sunday = 2;
Saturday = Sunday; //這種方式都是錯誤的
3、只能把列舉值賦予列舉變數,不能把元素的數值直接賦予列舉變數,如果一定要使用,則一定要強制型別轉換enum week{Mon = 1, Tues, Wed, Thurs}num; num = (enum week)10; printf("%d", num);上面的代碼中,在對列舉變數賦值10的時候進行的強制型別轉換,將整型常量10轉換成了enum week型別再賦值給num變數,
總結:
1、在沒有顯示說明的情況下,列舉常量(也就是花括號中的常量名)默認第一個列舉常量的值為0,往后每個列舉常量依次遞增1
2、在部分顯示說明的情況下,未指定的列舉名的值將依著之前最有一個指定值向后依次遞增
3、一個整數不能
直接賦值給一個列舉變數,必須用該列舉變數所屬的列舉型別進行型別強制轉換后才能賦值4、同一列舉型別中不同的列舉成員可以具有相同的值
5、同一個程式中不能定義同名的列舉型別,不同的列舉型別中也不能存在同名的列舉成員(列舉常量)
2、equals與==的區別,
== 和 Equals 的區別
1. == 是一個運算子,
2.Equals則是string物件的方法,可以.(點)出來,
我們比較無非就是這兩種 1、基本資料型別比較 2、參考物件比較
1、基本資料型別比較
==和Equals都比較兩個值是否相等,相等為true 否則為false;
2、參考物件比較
==和Equals都是比較堆疊記憶體中的地址是否相等 ,相等為true 否則為false;主要區別在于前者是方法后者是運算子,“==”的行為對于每個物件來說與equals()是完全相同的,但是equals()可以基于業務規則的不同而重寫(overridden ),“==”習慣用于原生(primitive)型別之間的比較,而equals()僅用于物件之間的比較,
==與equals的主要區別是:==常用于比較原生型別,而equals()方法用于檢查物件的相等性,另一個不同的點是:如果==和equals()用于比較物件,當兩個參考地址相同,==回傳true,而equals()可以回傳true或者false主要取決于重寫實作,最常見的一個例子,字串的比較,不同情況==和equals()回傳不同的結果,
分開講解:
一、java當中的資料型別和“==”的含義:
- 基本資料型別(也稱原始資料型別) :byte,short,char,int,long,float,double,boolean,他們之間的比較,應用雙等號(==),比較的是他們的值,
- 參考資料型別:當他們用(==)進行比較的時候,比較的是他們在記憶體中的存放地址(確切的說,是堆記憶體地址),
注:對于第二種型別,除非是同一個new出來的物件,他們的比較后的結果為true,否則比較后結果為false,因為每new一次,都會重新開辟堆記憶體空間,
二、equals()方法介紹:
JAVA當中所有的類都是繼承于Object這個超類的,在Object類中定義了一個equals的方法,equals的原始碼是這樣寫的:
public boolean equals(Object obj) { //this - s1 //obj - s2 return (this == obj); }可以看到,這個方法的初始默認行為是比較物件的記憶體地址值,一般來說,意義不大,所以,在一些類別庫當中這個方法被重寫了,如String、Integer、Date,在這些類當中equals有其自身的實作(一般都是用來比較物件的成員變數值是否相同),而不再是比較類在堆記憶體中的存放地址了,
所以說,對于復合資料型別之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是記憶體中的存放位置的地址值,跟雙等號(==)的結果相同;如果被復寫,按照復寫的要求來,總結
== 的作用:
基本型別:比較的就是值是否相同
參考型別:比較的就是地址值是否相同
equals 的作用:
參考型別:默認情況下,比較的是地址值,
注:不過,我們可以根據情況自己重寫該方法,一般重寫都是自動生成,比較物件的成員變數值是否相同
public class ObjectDemo{ public static void main(String[] args) { String s1 = "Hello"; String s2 = new String("Hello"); s2 = s2.intern(); System.out.println(s1 == s2); // true System.out.println(s1.equals(s2)); // true } }java.lang.String的intern()方法 "abc".intern()方法的回傳值還是字串"abc",表面上看起來好像這個方法沒什么用處,但實際上,它做了個小動作:檢查字串池里是否存在"abc"這么一個字串,如果存在,就回傳池里的字串;如果不存在,該方法會 把"abc"添加到字串池中,然后再回傳它的參考,
intern()方法
如果字符常量池中已經包含一個等于此String物件的字串,則回傳常量池中字串的參考,否則,將新的字串放入常量池,并回傳新字串的參考’
理解
package com.tangbaobao.test1; import org.junit.jupiter.api.Test; public class Test2 { @Test public void fun1(){ String str1 = new StringBuilder("計算機").append("軟體").toString(); String str2 = new StringBuilder("Ja").append("va").toString(); String str3 = "java"; String str4 = new String("java"); System.out.println(str1.intern() == str1);//因為之前沒有所以創建的參考和intern()回傳的參考相同 System.out.println(str2.intern() == str2);//"java在StringBuilder()之前已經出現過",所以intern()回傳的參考與新創建的參考不是同一個 System.out.println(str3 == str4); } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/297863.html
標籤:其他
上一篇:java 反射機制簡單理解
下一篇:理財通app的設計與實作(二)

