2019java面試被蹂躪記錄,持續更新

大四開始找實習,被各種筆試、面試蹂躪,所以寫一篇博客記錄一下蹂躪我的那些題目,雖然它們對我百般摧殘但我還是愛它們

1.byte類型,下面輸出的是什麼

byte b = 127;
b = b + 1;
System.out.println(b);

結果是編譯不通過;

原因在於因爲b爲變量,java編譯無法確定b+1是否會超過(byte的範圍[-128,127]),所以編譯無法通過;
那如果b=1+2呢?答案是全部正常,因爲1跟2都是常量,編譯能確定b不會超過(byte的範圍[-128,127])
藉此機會延伸一下:

​​​​​​byte b=127;
b++;
System.out.println(b);

答案是-128,接下來我們就來看看爲什麼:

  1. 首先我們知道計算機是以二進制的形式存儲數據的
  2. 機器數:首位數(符號位)0表示正數,1表示負數
  3. 在計算機中,正數是直接用原碼錶示的,負數用補碼錶示
  4. 正數的原碼、反碼、補碼相同
  5. 負數的反碼爲:除符號位外,原碼各位取反,得負數的反碼;
  6. 負數的補碼爲:反碼+1就是補碼。
  7. 補碼反算原碼:符號位不變(即1),其餘各位取反後加1,與原碼算補碼一樣

原碼:將一個整數,轉換成二進制,就是其原碼。如單字節的5的原碼爲:0000 0101;-5的原碼爲1000 0101。
ok,也會是說127二進制是01111111,加1後爲10000000,符號位1爲負數,即補碼形式存儲,轉爲原碼爲11111111+1即真值10000000又爲負數所以-128;當在一個i++;後爲多少呢,我就不說了,你們可以試一下
再延伸:

int b = 389;
byte i = (byte)b;
System.out.println(i);

答案是-123,首先int是4字節32位,二進位即爲00000000 00000000 00000001 10000101,byte一個字節,所以得到的結果是10000101,爲負數且以補碼形式存儲,得到原碼爲11111010+1爲11111011即-127+4=-123
關於byte就這樣

2.final關鍵字

  • final修飾的類不能被繼承
  • final修飾的方法不能被子類重寫
  • final修飾的變量是常量,只能被賦值一次,且不會被初始化(很好理解),調用之前需要先賦值,不然會編譯錯誤;

3.類的繼承,抽象類以及接口

  • 一個類只能有一個直接父類,但可以實現多個接口,用逗號隔開;但如果該類是一個接口,它可以通過extends繼承多個接口,記住是接口;
  • 類class,抽象類abstract,接口interface
  • 抽象類不能被實例化。抽象方法必須用abstract修飾,且包含抽象方法的類必須聲明爲抽象類,但抽象類可以不包含抽象方法;
  • 接口不能被實例化,接口的所有方法都是抽象方法,而且默認使用public abstract來修飾,而所有變量默認使用public static final來修飾,即公共靜態常量;
  • 抽象類跟接口的區別:
    1.抽象類要被子類繼承,接口要被類實現。
    2.接口只能做方法聲明,抽象類中可以作方法聲明,也可以做方法實現。
    3.接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。
    4.抽象類可以有具體的方法和屬性,接口只能有抽象方法和不可變常量。
    5.接口是設計的結果,抽象類是重構的結果。
    6.一個類只能繼承一個抽象類,但可以實現多個接口;

4.String,SringBuilder,StringBuffer之間的關係以及區別

參考:https://blog.csdn.net/yajing8/article/details/73695170

再一點:

下面兩天語句的區別:
String name = "abc";
String name = new String("abc");

前提:這兩條語句是獨立分開的完全沒關係的;

String name = "";只創建一個對象:會創建一個字符串常量abc放入字符串常量池,然後name引用指向這個常量內存地址;

String name = new String("");創建兩個對象:會創建一個字符串常量放入字符串常量池,然後再創建一個String對象放入堆,引用name指向這個對象,對象又指向常量池的abc;

再說一個:String a="ab"+"cd";會被優化成String a="abcd";

5.關於try,catch,finally執行順序以及return語句的執行情況

參考:https://blog.csdn.net/yajing8/article/details/73695170

6.關於表單重複提交產生的原因以及解決方法

產生的原因:

  1. 用戶重複點擊提交
  2. 提交 form 表單,後端未返回結果(還在處理請求)時,刷新頁面
  3. 後端已處理返回結果,用戶後退

解決的方法:

  • 前端解決:
    1.將提交按鈕鎖定
    2.ajax方式,不存在刷新再次提交問題
    3.ajax方式,不存在返回再次提交問題
  • 後端解決:
    使用session解決:
    第一步:首先後端生成一個token存入session,放入前端的隱藏域,提交表單時一同提交上去
    第二步:讀取前端提交的toke和session的token判斷是否相等,相等就是第一次提交,否則就是重複提交
    第三步:自己的業務邏輯處理
    第四步:成功就移除session的token

7.SQL

  1. 使用limit m offset n分頁時,可簡寫爲limit m,n;m表示每頁最多的數據條數,隨着N越來越大,查詢效率也會越來越低。
  2. 聚合查詢:COUNT(*)COUNT(id)實際上是一樣的效果。另外注意,聚合查詢同樣可以使用WHERE條件,因此我們可以方便地統計出有多少男生、多少女生
  3. 查找有重複的數據,關鍵字group by以及having count(重複的列)>1:
    select * from test
    where name in (select name from test group by name having count(name) > 1);
  4. 查找去重,關鍵字distinct:
select distinct name from test

關於distinct:

  • 只能過濾掉重複數據,並返回該字段所有符合where的數據,無法返回其他字段
  • 如果是distinct name,id 這樣的mysql 會認爲要過濾掉name和id兩個字段都重複的記錄
  • 如果sql這樣寫:select id,distinct name from user,這樣mysql會報錯,因爲distinct必須放在要查詢字段的開頭。
  • 所以一般distinct用來查詢不重複記錄的條數:select count(distinct name) from test;
  • 如果要查詢不重複的記錄,有時候可以用group by :select id,name from test group by name;

8.for的運行步驟

class Demo{
	public static void main(String[] args){
		int x = 1;
		for(show('a'); show('b') && x<3;show('c')){
			show('d'); 
			x++;
		}
	}
	public static boolean show(char ch){
		System.out.print(ch);
		return true;
	}
}

運行結果爲:abdcbdcb
第一次循環:a b d c

  1. 首先運行for初始化代碼塊,即show('a');
  2. 運行判斷語句:show('b') && x<3;
  3. 運行show('d');x++;
  4. 運行show('c');

第二次循環:b d c

  1. 不會再運行初始化代碼,直接運行判斷語句:show('b') && x<3;
  2. 運行show('d');x++;
  3. 運行show('c');

第三次循環:b

  1. 直接運行判斷語句:show('b') && x<3;   此時x=3;不滿足循環條件,循環結束

如果循環田間語句爲x<3&&show('b') ;第三次循環結果還是abdcbdcb嗎?

9.new一個對象發生了什麼

https://www.cnblogs.com/JackPn/p/9386182.html

 

我找到實習了,暫停更新,感動!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章