String 面試題目:這個語句創建了多少個對象? 這個答案為 或者 ,因為如果 這個字面值如果在常量池中已經出現過,那麼就只創建一個對象,如果沒有出現過就會創建兩個對象, 的出現一定會有一個對象被創建,所有確保有一個對象被創建. 為啥 相等,是因為在編譯的時候已經為 字面值,已經拼接好了,所以進行 ...
String
String str1 = "dashu";
String str2 = "dashu";
String string = new String("dashu");
System.out.println(str1 == string);
// 結果為 false
面試題目:這個語句創建了多少個對象?
new String("dashu");
這個答案為1
或者2
,因為如果"dashu"
這個字面值如果在常量池中已經出現過,那麼就只創建一個對象,如果沒有出現過就會創建兩個對象,new
的出現一定會有一個對象被創建,所有確保有一個對象被創建.
String str1 = "dashu";
String str2 = "da" + "shu";
System.out.println(str1 == str2);
// 結果為 true
為啥
str1 == str2
相等,是因為在編譯的時候已經為"dashu"
字面值,已經拼接好了,所以進行比較時,就會相等.
String str1 = "dashu";
String str2 = "da";
String str3 = str2 + "shu";
System.out.println(str1 == str3);
// 結果為 false
原理是通過
stringbuilder
的拼接方法,然後在調用toString()
方法.
在String
中有一個intern()
方法,它返回的是常量池中字面值的地址,如果在常量池中沒有這個字面值,就會把這個字面值先加到常量表後,返回這個字面值的地址.
把上面的代碼添加intern()
試試:
String str1 = "dashu";
String str2 = "da";
String str3 = str2 + "shu";
System.out.println(str1 == str3.intern());
// 結果為 true
許可權修飾符
class Chirld{
public void publicMethod(){
// public為任何地方都可以通過子類的對象進行訪問
}
protected void protectedMethod(){
// protected為私有方法,只能在子類中進行訪問
}
private void privateMethod(){
// private為只能在本來進行訪問,除了子類可以調用,其他都不可以進行訪問這個方法
}
}
public Father extends Chirld{
public static void main(String[] args){
new Father().publicMethod();
new Father().protectedMethod();
}
}
實例方法是什麼呢?不用static
添加修飾的方法就是了,訪問實例方法,只能通過創建對象進行訪問.
什麼是類方法呢?就是用static
添加修飾的方法就是了,訪問這個方法可以通過創建對象進行訪問,也可以通過類名進行調用進行訪問.
方法
方法的重載:方法名一樣,參數名不一樣
重載的出現就是為瞭解決操作同種方法的動作,但是類型不同的功能需求.
public Father extends Chirld{
public static void main(String[] args){
publilc void add(int a){
System.out.println(a+1);
}
publilc void add(long b){
System.out.println(b+1);
}
}
}
方法的重載為編譯時的多態
//
class GuoWang{
public void add(){
System.out.println("GuoWang");
}
}
//
public class DaShu extends GuoWang{
public void add(){
System.out.println("DaShu");
}
public static void main(String[] args){
// 變國王
GuoWang gw = new DaShu();
gw.add();
}
}
// DaShu
方法的多態,覆寫父類的方法.方法的參數不一樣為重載,一樣為覆寫.
變數的介紹格式: 變數類型 + 變數名
變數的作用是用來存儲信息的容器
集合
集合也是容器,把擁有相同類型的變數存儲起來的,集合類型 + 集合名字.
Collection
-> List -> ArrayList LinkedList
-> Set -> hashSet treeset
Map
-> hashmap
-> treemap
舉例:
// 源碼
public interface List<E> extends Collection<E>{
int size();
boolean isEmpty();
....
}
public interface Collection<E> extends Iterable<E>{
int size();
boolean isEmpty();
...
}
集合中的常用方法:
Collection<E>
size():返回類型為
int.
isEmpty():返回類型為boolean.
contains(Object):返回類型為boolean.
iterator():Iterator<E>
toArray():Object[]
toArray(T[]): T[]
add(E):返回類型為
boolean
remove(Object):返回類型為boolean
containsAll(Collection<?>):返回類型為boolean
addAll(Collection<? extends E>):返回類型為boolean
removeAll(Collection<?>):返回類型為boolean
retainAll(Colleciton<?>):返回類型為boolean
clear():返回類型為void
equals(Object):返回類型為boolean
hashCode():i返回類型為int
spliterator():
Spliterator<E>
stream():Stream<E>
parallelStream():Stream<E>
default Stream<E> stream(){
return StreamSupport.stream(spliterator(), false);
}
介面的定義:public abstract 返回類型 方法名(參數)
,從jdk1.8
開始可以實現方法了,用default
修飾.
interface Student{
void go();
default void dohomework(){
System.out.println("dohomework");
}
}
// 實現介面
public class Dashu implements Student{
public static void mian(String[] args) throws Exception{
new Dashu().dohomework();
}
@Override
public void go(){}
}
這個特性的引入是為了擴展介面中的方法
源碼:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
public class ArrayList<E> extends AbstractList<E>
implements List<E>,RandomAccess,Cloneable,java.io.Serializable
Collection<T>介面 -> AbstractCollection<E>
List<T>介面 -> AbstractList<E>
往後餘生,唯獨有你
簡書作者:達叔小生
90後帥氣小伙,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書博客: https://www.jianshu.com/u/c785ece603d1
結語
- 下麵我將繼續對 其他知識 深入講解 ,有興趣可以繼續關註
- 小禮物走一走 or 點贊