1. 程式人生 > >java進階的16個知識點

java進階的16個知識點

1.float 型別在java中佔4個字元,long型別在java中佔8個字元,為什麼float型別比long型別取值範圍大?
float   32位二進位制碼中,第32位  1位符號位   第23-31位 8位指數位  第0-22位  23位尾數位
指數位 (-128—127)+2^7
表示為10進位制    (1位符號位所示符號)(23位尾數位對應十進位制數)*10^(8位指數位對應十進位制數)

long 64位

表示為10進位制  (64位二進位制數對應的十進位制數)

2.i++和++i到底有什麼不同。僅僅是先加和後加的區別麼?
i++:
先將i值賦給一個臨時變數,在進行i+=1後將臨時變數返回

++i:
i+=1

3.java中無優先順序的運算順序是怎樣的?i+++j是計算(i++)+j還是i+(++j)?

從左到右,計算(i++)+j

public class TestOperatSequence {
	//運算從左到右結合
	public static void main(String[] args) {
		int i=1,j=2;
		System.out.println(i+++j);
		i=1;j=2;
		System.out.println((i++)+j);
		i=1;j=2;
		System.out.println(i+(++j));
	}
}

執行結果:

3
3
4

再看這段程式碼:

public class TestOperatSequence {
	//運算從左到右結合
	public static void main(String[] args) {
		int[] a={1,2,3};
		int i=1;
		a[++i]+=i++;  //3+2
		for(int item:a)
			System.out.println(item);
	}
}

執行結果:

1
2
5

雖然賦值是右賦左,但運算順序顯然是先++i後i++,從左向右


4.為什麼要為String物件建立常量池?String常量池有什麼好處?
節約記憶體,在利用字面量建立字串物件時的時候,如果該物件在常量池中已存在,則直接使用該物件,而不必重新分配記憶體建立新物件,可以實現多執行緒共享資源
String編譯時常量會在編譯的時候被加入到String常量池中,使用intern關鍵字,如果常量池中已存在該物件,直接返回該物件,如果不存在,則將物件放入常量池中後再返回該物件

5.使用“+”可以連線兩個字串,如何進行連線的?
Oracle:

new StringBuilder().append(obj1).append(obj2).toString();

Eclipse:
當左邊引數為基本資料型別時,會先將基本資料型別轉化為String型別;其餘同Oracle

new StringBuilder(String.valueOf(i1)).append(obj2).toString();

在字串進行頻繁拼接的時候,使用StringBuilder可以節省例項化StringBuilder所耗時間

public class TestStringPlus {
	public static void main(String[] args) {
		System.out.println("Direct plus time:"+getDirectTime());
		System.out.println("StringBuilder plus time:"+getStringBuilderTime());
	}
	
	public static long getDirectTime(){
		long now=System.nanoTime();
		@SuppressWarnings("unused")
		String str="";
		for(int i=0;i<10000;i++)
			str+="a";
		return System.nanoTime()-now;
	}
	
	public static long getStringBuilderTime(){
		long now=System.nanoTime();
		String str="";
		StringBuilder sb=new StringBuilder(str);
		for(int i=0;i<10000;i++)
			sb.append("a");
		return System.nanoTime()-now;
	}
}

執行結果:

Direct plus time:57455979
StringBuilder plus time:443259


6.陣列長度時,可以使用byte,short,int,能否使用long和char?
不能使用long,範圍太大,不必要
可以使用char,用該字元對應的ASCLL碼作為陣列長度

7.移位運算:5<<35,會首先進行35%32的求餘運算嗎?
在java中int佔4個位元組32位,long佔8個位元組64個位元組,當移位超過31或者63位時,移位便沒有什麼意義了。所以在左側運算元為int型別的時候,取右側運算元補碼後5位(<=31)作為移位位數,左側運算元為long型別的時候,取右側運算元補碼後6位(<=63)作為移位位數

public class TestBitMove {
	public static void main(String[] args) {
		//5    00000101		00101000
		System.out.println(5<<35);
		System.out.println(5<<3);
		//30  00011110		00000000
		System.out.println(30>>70);
		System.out.println(30>>6);
		
		//-10 10001010		01110110	移位數為22位
		System.out.println(5<<-10 );
		System.out.println(5<<22);
	}
}

執行結果:

40
40
0
0
20971520
20971520


8.從JDK1.7開始,switch語句可以支援String型別,那麼在底層是如何實現的呢?
根據String的hashcode建立一個變數,利用該變數進行switch分支判定

9.如果重寫了equals方法,為什麼還要重寫hashcode方法?
不重寫equals的話,equals繼承自Object,判斷方法依舊是==
鍵值對集合是利用hashcode存取值的 ,當引用物件作為鍵值對集合中的鍵時,鍵值相等,但hashcode不相等,就沒法獲取“相等的”鍵所對應的值

import java.util.Hashtable;


public class TestHashCode {
	public static void main(String[] args) {
		Hashtable<HC,Integer> ht=new Hashtable<HC,Integer>();
		ht.put(new HC(1), 1);
		System.out.println(ht.get(new HC(1)));
		
		Hashtable<NHC,Integer> nht=new Hashtable<NHC,Integer>();
		nht.put(new NHC(1), 1);
		System.out.println(nht.get(new NHC(1)));
	}
}

class NHC{
	private int data;
	
	public NHC(int data) {
		this.data = data;
	}

	@Override
	public boolean equals(Object obj) {
		if(obj instanceof NHC)
			return ((NHC)obj).data==this.data;
		return false;
	}
}

class HC{
	private int data;
	
	public HC(int data) {
		this.data = data;
	}
	
	@Override
	public int hashCode(){
		return data;
	}

	@Override
	public boolean equals(Object obj) {
		if(obj instanceof HC)
			return ((HC)obj).data==this.data;
		return false;
	}
}

執行結果:

1
null


10.構造器是否建立了物件?構造器在例項化物件時起什麼作用?
構造器並沒有建立物件,而是new關鍵字建立了物件,構造器只是對物件初始化

11.靜態方法是否可以重寫?方法重寫與方法隱藏有什麼不同?
不可以,再呼叫子類的方法時,不知道是呼叫繼承的方法,還是重寫的方法
方法重寫,更新方法的實現,是方法的替換
方法隱藏:在靜態方法中,實現一個新方法,只是在類外無法呼叫原來的方法

(其實很容易理解,靜態方法和屬性都是放在靜態儲存區的,父類放父類的,子類放子類的,用的時候再從各自的儲存區取得,各不相關)

public class TestStaticOverride {
	public static void main(String[] args) {
		System.out.println("Base class:");
		Base.T();
		
		System.out.println("Sub class:");
		new Sub();
		Sub.T();
	}
}

class Base{
	public static void T(){
		System.out.println("Hello,this is parent!");
	}
}

class Sub extends Base{
	public Sub(){
		super.T();
	}
	
	public static void T(){
		System.out.println("Hello,this is child!");
	}
}

可以看到在呼叫Sub.T()時,呼叫的是Sub的T()方法,但是並沒有重寫覆蓋掉父類的方法,因為在Sub建構函式中呼叫父類T()方法時,依然生效

12.為什麼不能在靜態方法中使用this?this指代的當前物件在哪裡?
This物件,在物件被例項化、物件成員函式被呼叫的時候,虛擬機器自動將該物件的引用作為隱藏引數傳入構造器靜態方法是類方法,this指代的是被例項化後的具體某個物件。靜態方法在類的物件未被例項化時即可使用,此時尚未存在具體物件

13.在java中,類會在什麼時間、什麼條件下被jvm載入?
編譯後形成.class檔案,執行時被載入

14.Java中的列舉是怎麼實現的?
列舉型別本質上是一個final類,繼承自java.lang.Enum類
在列舉型別保持被列舉物件的引用,且用public static final進行修飾,這樣外界就可以直接通過列舉型別.被列舉物件來訪問該物件。

public abstract class Color extends java.lang.Enum(Color){
    public static final Color RED;
    public static final Color BLUE;
    public static final Color WHITE;
}

訪問方式:
Color.RED;

15.每個基本資料型別都對應一個包裝類,這些包裝類有什麼作用?
java是完全面向物件語言,所有資料都應該是物件,然而為了方便使用,設定了八個基本資料型別:byte、short、int、long、float、double、boolean、char
包裝類是對這些基本資料型別的包裝以實現面向物件的一些特性,包裝類可以作為集合容器的key和value,基本資料型別不可以

16.內部成員類是如何繫結外圍類物件的?
內部成員類中隱藏了一個外圍物件的引用,在例項化的時候,自動將該引用指向例項化的外圍類物件

相關推薦

java16知識點

1.float 型別在java中佔4個字元,long型別在java中佔8個字元,為什麼float型別比long型別取值範圍大? float   32位二進位制碼中,第32位  1位符號位   第23-31位 8位指數位  第0-22位  23位尾數位 指數位 (-12

Java知識點2:看不懂的代碼 - 協變與逆變

階段 off 開始 限制 array 設計者 equals 性方面 版本兼容 要搞懂Java中的協辦與逆變,不得不從繼承說起,如果沒有繼承,協變與逆變也天然不存在了。 我們知道,在Java的世界中,存在繼承機制。比如MochaCoffee類是Coffee類的派生類,那麽我

Java知識點1:白撿的擴充套件性 - 列舉值也是物件

一、背景 列舉經常被大家用來儲存一組有限個數的候選常量。比如下面定義了一組常見資料庫型別: public enum DatabaseType { MYSQL, ORACLE, SQLSERVER } 當圍繞這一組常量出現功能上的擴充套件點時,很多人的做法是為新的功

JavaNIO Java知識點5:服務端高併發的基石 - NIO與Reactor模式以及AIO與Proactor模式

javaNIO對於多路複用io(同步非阻塞io)的實現 package test; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.channels.SelectionKey; import

Java之JSP生成條形碼知識點總結

JSP生成條形碼  例項說明 條形碼是用於區分產品的一組編號,但是以條碼形式呈現給使用者,例如圖書上的ISBN編碼、超市商品的條形碼、各種電子產品和保修憑證上的條形碼等等。本例項在JSP頁面實

Java語法16-Lambda-Stream-Optional

Lambda   大年初二,大門不出二門不邁。繼續學習! 函式式介面   Lambda表示式其實就是實現SAM介面的語法糖,所謂SAM介面就是Single Abstract Method,即該介面中只有一個抽象方法需要實現,當然該介面可以包含其他非抽象方法。    它關注方法具備什麼樣的功能,強調做

JAVA-註解

繼承 false time 指定 java進階 row policy spa bool 註解元數據分為4部分分別為Target,Documented,Inherited,Retention: Target>指定被註解的註解僅僅能使用在某個類型上;Element

JAVA-泛型

span float ati 子類 rec content ace -s ava >泛型:泛型指代了參數的類型化類型,一般被用在接口。類。方法中 >作用:用來確定參數的範圍,在書寫代碼的時候提前檢查代碼的錯誤性 >泛型的聲明,下面給出類聲明,依此類推:

Java之路——從初級程序員到架構師,從小工到專家

類型 編程語言 fomat 基礎 color 使用場景 霍夫曼 ebsp cal 怎樣學習才能從一名Java初級程序員成長為一名合格的架構師,或者說一名合格的架構師應該有怎樣的技術知識體系,這是不僅一個剛剛踏入職場的初級程序員也是工作三五年之後開始迷茫的老程序員經常會問到的

Java中使用new Date()和System.currentTimeMillis()獲取當前時間戳的區別(轉)(Java-性能提升)

使用 get csdn 比較 his new mem ava 輸出 在開發過程中,通常很多人都習慣使用new Date()來獲取當前時間,使用起來也比較方便,同時還可以獲取與當前時間有關的各方面信息,例如獲取小時,分鐘等等,而且還可以格式化輸出,包含的信息是比較豐富的。但是

java 一:代理和動態代理

實現 public rgs tostring 開源項目 body llb ack code 靜態代理:   定義頂級接口:Iservice //目標類和代理類都實現該接口 public interface Iservice { public String serv

Java容器學習

一段 轉換 hashmap container arr 目標 刪除元素 存取 system   Java中有一些對象被稱為容器(container)。容器中可以包含多個對象,每個對象稱為容器中的一個元素。容器是用對象封裝的數據結構(data structure)。   

Java篇設計模式之二 ----- 工廠模式

class computer 社會 進階 輕松 override out 是否 return 前言 在上一篇中我們學習了單例模式,介紹了單例模式創建的幾種方法以及最優的方法。本篇則介紹設計模式中的工廠模式,主要分為簡單工廠模式、工廠方法和抽象工廠模式。 簡單工廠模式 簡單

Java 線程安全

轉賬 鎖定 事務 util threads 影響 get span 執行 多線程編程中的三個核心概念 原子性 這一點,跟數據庫事務的原子性概念差不多,即一個操作(有可能包含有多個子操作)要麽全部執行(生效),要麽全部都不執行(都不生效)。 關於原子性,一個非常經典的例子就是

Java篇設計模式之四 -----適配器模式和橋接模式

原則 pub 是我 protect 接口 logs 將不 多說 外鏈 前言 在上一篇中我們學習了創建型模式的建造者模式和原型模式。本篇則來學習下結構型模式的適配器模式和橋接模式。 適配器模式 簡介 適配器模式是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬於結構型模

Java篇設計模式之五-----外觀模式和裝飾器模式

和我 logs 適配器模式 del xtra implement () 實例化 網絡遊戲 前言 在上一篇中我們學習了結構型模式的適配器模式和橋接模式。本篇則來學習下結構型模式的外觀模式和裝飾器模式。 外觀模式 簡介 外觀模式隱藏系統的復雜性,並向客戶端提供了一個客戶端可以

Java篇設計模式之六 ----- 組合模式和過濾器模式

對組 www. 希望 als oid block 個人 定義 lsi 前言 在上一篇中我們學習了結構型模式的外觀模式和裝飾器模式。本篇則來學習下組合模式和過濾器模式。 組合模式 簡介 組合模式是用於把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象,用來表

Java面試題列表 面向對象編程的基本理念與核心設計思想

編程 ber 異同 lar domain spring 日常 beans erl 解釋下多態性(polymorphism),封裝性(encapsulation),內聚(cohesion)以及耦合(coupling)。 繼承(Inheritance)與聚合(Aggregati

Java篇設計模式之八 ----- 責任鏈模式和命令模式

如果能 clean branch pcm tle 開始 類型 mar www 前言 在上一篇中我們學習了結構型模式的享元模式和代理模式。本篇則來學習下行為型模式的兩個模式, 責任鏈模式(Chain of Responsibility Pattern)和命令模式(Comman

Java篇設計模式之九----- 解釋器模式和叠代器模式

簡單 目的 java進階 使用 記錄 ace 客戶端 -- pro 前言 在上一篇中我們學習了行為型模式的責任鏈模式(Chain of Responsibility Pattern)和命令模式(Command Pattern)。本篇則來學習下行為型模式的兩個模式, 解釋器模