淺析關於java的一些基礎問題(上篇)

       要想讓一個問題變難,最基本有兩種方式,即極度細化和高度抽象。對於任何語言的研究,良好的基礎相當重要,本篇文章,將從極度細化的角度java

來解析一些java中的基礎問題,這些問題也是大部分編程人員的軟肋或易混淆點。算法

一  關於String問題編程

1.String是基本類型(值類型)仍是引用類型?安全

 (1)String是引用類型。經過查看jdk,String是一個類,既然是一個類,那麼就是引用類型;異步

 (2)基本類型包括:int,float,boolean,byte,凡是經過new關鍵字的,都屬於引用類型,如工具

通常狀況,引用類型是經過new關鍵字,如ClassA  a=new ClassA() ,a就是引用類型,引用類型存儲在內存堆中,而值類型存儲在內存棧中。性能

堆和棧的區別是,棧存取速度快,固定存儲長度;而堆長度根據運行時實際狀況分配,速度慢。ui

2.String str1=「Alan」與String str2=new String("Alan")區別?this

回答該問題,就涉及到java虛擬機常量池問題spa

(1)在常量池中,不存在兩個相同的變量。

String str1="Alan_beijing";
String str2="Alan_beijing";

System.out.println(str1==str2);//true
System.out.println(str1.equals(str2));//true

說明str1和str2指向同一個對象。

(2)每new一個對象,就新增長一個對象,無論常量池中是否存在相同的變量

String str1="Alan_beijing";
String str2=new String("Alan_beijing");

System.out.println(str1==str2);//false
System.out.println(str1.equals(str2));//true

3.equals和==區別?

(1)核心區別:equals比較對象值是否相等,==比較是不是同一個對象。

String str1="Alan_beijing";
String str2=new String("Alan_beijing");

System.out.println(str1==str2);//false
System.out.println(str1.equals(str2));//true

4.爲何StringBuilder相對於String字符串拼接比較快?

知道了1-3答案,這個問題就很是容易解決了,由於每拼接一個字符串,就要new一個對象,佔用內存堆,而StringBuilder不須要,故比較快。

String str="a"+"b"+"c"+"d";//要額外增長3個變量,「ab」,"abc",'abcd'

 5.考慮以下問題答案

String str0="Alan";
String str1="Alan";
String str2="A"+"lan";
String str3=new String("Alan1");
String str4="A"+new String("lan");
String str5=str3.intern();


System.out.println(str0==str1);
System.out.println(str1==str2);
System.out.println(str1==str3);
System.out.println(str3==str4);
System.out.println(str1==str5);

Tip:以下爲String.equals()方法jdk源碼

 

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

 

源碼很清楚,有三個邏輯

(1)自身與自身比較,則返回true;

(2)當與其餘對象比較,比較的是字符串序列,字符序列相同,返回true,不然返回false;

(3)當不知足(1)(2),則直接返回false

二  關於集合問題

1.HashMap,TreeMap,HashSet和HashTable比較

(1)實現接口不同。HashMap和HashTable實現Map接口,而HashSet實現Set接口

(2)線程安全性不同。HashMap線程不安全(異步鎖),HashTable線程安全(同步鎖),HashSet線程不安全,由於它的底層

是由HashMap不重複key實現的。

(3)性能從高到底

HashMap>HashSet>HashTable

(4)K,V是否爲null

HashMap的K,V均可以存放null;

HashTable的K,V不能存放null;

HashSet只能V存放nll,K不能存放null

(5)存儲內容差別

HashMap<k,v>和HashTable<k,v>存儲k,v,而HashSet<E>存儲對象

(6)HashMap和TreeMap區別

TreeMap保存對象排列次序,HashMap不須保存對象排列次序

三 關於IO種類劃分問題

IO從種類上,通常劃分爲字符流和字節流兩大類,其中,字符流是以Reader或Writer結尾的,如InputStreamReader,

OutputStreamWriter;而字節流是以Stream結尾的,如InputStream,OutputStream。他們的繼承關係以下:

 

 

 四  關於異常問題

(1)全部的異常類繼承類Throwable

(2)異常從種類上來劃分,分爲非受查異常(派生於全部Error或RuntimeException)和受查異常

(3)自定義異常類,只需繼承Exception類或Exception下的任何子類便可

(4)何爲異常傳遞?指異常傳遞給調用的子類,而不在本身內部實現異常,經過throws向調用的類傳遞異常。

 

五  值傳遞和引用傳遞

值傳遞傳遞的是值,引用傳遞傳遞的是地址(也可叫作指針)

下面的的代碼,最終輸出結果爲15 0 20,請考慮爲何?

package demo.test;

import org.junit.Test;


public class MGenalTest {
    @Test
    public void test(){
        first();
    }

    public void first(){
        int i=5;
        Value v=new Value();
        v.i=25;
        second(v,i);
        System.out.println(v.i);
    }

    public void second(Value v,int i){
        i=0;
        v.i=20;
        Value val=new Value();
        v=val;
        System.out.println(v.i+" "+i);
    }
}

class Value{
    public int i=15;
}

六 反射

Java中的反射是一種強大的工具,它可以建立靈活的代碼,這些代碼能夠在運行時裝配,無須再組件之間進行連接,反射容許

在編寫與執行時,使程序代碼可以接入裝載到JVM中的類的內部信息,而不是源代碼中選定的類協做的代碼。

七  序列化

關於序列化,只需實現接口Serializable便可

public interface Serializable {
}

八  JVM

關於JVM,重點了解JVM垃圾回收機制,通常狀況地,對象在垃圾回收前,會先調用方法finalize(),而後再調用gc()方法。

關於垃圾回收機制問題,有不少回收算法,不一樣的算法,實現不一樣的機制。

九 算法

關於算法,遞歸算法考察比較多,如斐波拉列數列 1,1,2,3,5,8,。。。。

十 版權區

  •    轉載博客,必須註明博客出處
  •    博主網址:http://www.cnblogs.com/wangjiming/
  •    如您有新想法,歡迎提出,郵箱:2098469527@qq.com
  •   專業.NET之家技術QQ羣:490539956
  •   專業化Java之家QQ羣:924412846
  •   有問必答QQ羣:2098469527
  •   一對一技術輔導QQ:2098469527
相關文章
相關標籤/搜索