Java面試(基礎篇) - 第二篇!

未看第一篇的,這里可以直達
Java面試(基礎篇) - 第一篇

Integer對象可以用==判斷嗎?為什么?

回答

不可以,因為 == 比較的是對象的實例(內存地址),Integer是有一個緩存機制的,它會將-128–127之間的數字緩存下,所以,我們使用 == 比較,在這個數字區間內,它是相等的。但是,如果超過了這個區間,他就不相等了。所以,建議還是使用equals方法比較。

擴展

測試一下 看看代碼

        Integer a=10;Integer b=10;System.out.println(a==b);//trueInteger c=128;Integer d=128;System.out.println(c==d);//falseSystem.out.println(c.equals(d));//true

Java為什么不支持多繼承?

回答

如果支持多繼承 就會產生菱形繼承問題。即,
在這里插入圖片描述
Parrot無法確定是從Bird 還是Mammal繼承Animal的方法。
其次,如果支持多繼承,Java中的復雜度也會上升,不利于維護。修改一個父類,可能會影響多個子類,增加代碼的復雜度。
Java中 是通過接口實現 來達到多繼承的效果的。

擴展

這個問題,java之父,James Gosling也曾回答過,就是因為會產生菱形繼承問題。
此外 Java提供了另一種方式,即多實現接口 來達到同樣的效果。
那么,新問題,實現的兩個接口中,有一個方法名,參數相同的方法,此時繼承類要實現哪一個?
答案是,會編譯報錯,此時,這個問題就交給開發人員去解決。進行重寫這個方法。

接口 和抽象類的區別是什么?

回答

接口和抽象類都可以代表抽象層,只不過說,兩者的含義不一樣。接口更多用于制定規范,抽象類則用于復用。

另外,抽象類可以有構造器,接口沒有。雖然說 抽象類不能直接new,但是抽象類的構造器也可以作為初始化賦值來用。
接口在java8之前,只能定義,并且默認修飾符public,不能用其他修飾符,而抽象類則可以有具體的方法實現。

擴展

說到接口和抽象類的區別,我們可以通過模板方法來深入理解一下。
模板方法作為一種設計模式,它主要就是為了解決代碼中的復用問題。


public abstract class Coupon {public final void applyCoupon() {//打印是否有效invalidCoupon();//打印折扣applyDisCount();}//具體折扣邏輯protected abstract void applyDisCount();//無效優惠卷邏輯protected abstract void invalidCoupon();
}
public class FixedAmountCoupon extends Coupon{@Overrideprotected void applyDisCount() {System.out.println("滿100減10");}@Overrideprotected void invalidCoupon() {System.out.println("無效優惠卷");}
}
public class PercentageCoupon extends Coupon{@Overrideprotected void applyDisCount() {System.out.println("打八折");}@Overrideprotected void invalidCoupon() {System.out.println("無效優惠卷");}
}public static void main(String[] args) {Coupon fixedAmountCoupon = new FixedAmountCoupon();fixedAmountCoupon.applyCoupon();}

如何理解Java中的多態?

回答

統一操作針對不同的對象,得到不同的結果。在Java中,子類重寫父類的方法,就是多態的一種體現。
滿足三個條件即可。
類繼承或實現方法。
子類重寫父類的方法。
父類的指針指向子類的引用。

擴展

多態是一種運行期的概念,有人說多態分為兩種,靜態多態和動態多態。靜態多態就是重載,編譯器實現方法名相同,參數類型個數不同。不過我認為 多態是一種運行期的概念,重寫更能體現。

有了基本數據類型 為什么還要使用包裝類?

回答

因為,Java是面向對象的語言,很多地方要求使用對象。比如說集合,泛型。
另外,包裝類也提供了一些方法,可以直接使用,便于開發。

擴展

如果包裝類Integer 和基本數據類型int進行數據比較,是int轉為Integer 還是Integer 轉為int呢?
實際上,不管是包裝類和基本類比較,還是包裝類和包裝類比較,都是轉為int,底層使用intValue這個方法進行比較的。

可以使用浮點數表示金額計算嗎?為什么?

回答

不可以,不是所有的小數都可以用浮點數來表示的。IEEE提出用近似值表示小數,并且引入了精度的概念,這就是我們所說的浮點數。浮點數只是近似值,而不是精確值,所以不能用來表示金額,否則精度會缺失。

擴展

不是所有的數都可以用二進制表示的,比如0.1,轉化為二進制就會出現無限循環的情況。
為了解決精度問題,Java提供了BigDecimal來進行精確運算。

可以使用BigDecimal的equals進行等值比較嗎?為什么?

回答

不可以,equals比較是兩部分,值和標度,對于0.1和0.10這兩個數,雖然他們的值相同,但他們的標度不同,所以也不相等。

擴展

BigDecimal 提供了四種類型的接收,int,long,double,String。其中int 和long是整數,所以他們的標度是0,而對于
double,使用new BigDecimal(0.1)創建的時候,實際上我們拿到的是0.1的近似值,也就是一個55位的小數。標度為55.
而我們使用new Bigdecimal(“0.1”)的時候,值是01.而標度則是1.

對于比較BigDecimal,推薦的做法是 使用CompareTo方法,這個方法只比較兩個數字的值,不比較標度,相等則返回0.

Java中負數取絕對值,結果一定是正數嗎?

回答

不一定,Math.abs(),這里要是取到了Integer的最小值,取絕對值出來,還是一個負數。這是因為,此時這個最小數已經是Int類型的最小數了,再去拿絕對值,就會發生越界。超出int的范圍。

System.out.println(Math.abs(Integer.MIN_VALUE));

如何解決呢,只需要將他轉為Long類型即可。

System.out.println(Math.abs((long)Integer.MIN_VALUE));

擴展

我們直到Java中的基本數據類型中的整型有 byte,short,int,long四種。數字的范圍也是從小到大的。1byte=1個字節。范圍是,-2^7 ~2^7-1.也就是-128到127。初始化時,byte默認值是0.short則使用兩個字節存儲,范圍是-32768 - 32767 (-2^15 ~ 215-1).int則是四個字節存儲,-231 ~ 2^31-1.long 則是八個字節 范圍為-2^63 ~ 2 ^63-1。
超出范圍,就會發生溢出,溢出并不會拋出異常,已沒有任何提示,所以在進行數據運算的時候,一定要注意。

什么是泛型?為什么要用泛型?

回答

泛型是JDK5引入的概念,允許在定義類或者接口的時候,使用類型參數。聲明的類型參數在使用時用具體的類型來替換。
好處就是,提高了代碼的復用性,以及安全性。在泛型出來之前,做類型轉換的時候,要進行類型檢查,如果類型轉換出錯,就會直接宕掉。而泛型的作用就是在編譯時,進行類型檢查,增加程序的安全性。

擴展

舉個例子看一下,如何定義一個簡單的泛型。

  public static void main(String[] args) {List<String> listString = new ArrayList<>();listString.add("1");String first = getFirst(listString);List<Integer> listInteger = new ArrayList<>();Integer first1 = getFirst(listInteger);System.out.println(first1);}//定義一個靜態方法 傳入List<?> 泛型 返回對應類型的第一個數據,沒有數據則返回nullpublic static <T> T getFirst(List<T> list){if(list.size() == 0){return null;}return list.get(0);}

可以看到 這里我傳入是String類型,它就會返回String類型的參數。如果是Integer類型,則會返回Integer類型的參數。如此,就可以實現,一個方法,多種類型都可以使用,增加了代碼的復用性。

了解過類型擦除嗎?為什么要進行類型擦除?

回答

簡單理解就是 將泛型Java代碼轉化為普通Java代碼。不過編譯器更直接點,將泛型Java代碼轉為字節碼。

所謂的類型擦除 就是將泛型信息擦除掉 轉為使用Object對象接收。這也是為什么要使用包裝類的一個原因。基本數據類型非對象,不進行裝箱,無法使用泛型。

擴展

泛型中用于定義的字母,主要有K T V E Object。
E主要在集合中使用,代表的是元素。
T則主要代表Java類,如我們自定義的User類,就可以用T代替。
K V 指的是鍵值
N代指數據類型。
? 則表示不確定的Java類型。
Object 代指所有類的根類,任何類的對象,都可以設置為Object的引用變量,使用時進行強制類型轉換即可。

泛型中的上下界限定符extends supper區別是什么?

回答

一般我們認為,extends代表的是類型的上界,也就是參數只能傳它本身或者它的子類。比如,我們有一個people類,teacher 和 student都是它的子類。 使用Student 就可以正常調用方法,但是如果傳入一個沒有繼承People的User,則在編譯期就會報錯。

 public static void main(String[] args) {Student people = getPeople(new Student());getPeople(new User());}//定義一個靜態方法 傳入List<?> 泛型 返回對應類型的第一個數據,沒有數據則返回nullpublic static <T extends People> T getPeople(T t){return t;}

了解了泛型中的上界限定符,我們再來看一下下界限定符,其實它的作用和上界限定符剛好相反。表示,參數化類型必須是此類或者此類的父類。

 public static void main(String[] args) {test(new ArrayList<People>());test(new ArrayList<Student>());test(new ArrayList<Teacher>());}//定義一個靜態方法 演示下界限定符 使用Student類 他的父類是People public static <T> T test(List<? super Student> t) {return null;}

擴展

使用限定通配符 我們需要遵守PECS原則。即,上界生產,下界消費。

如果 需要向集合讀取,就可以使用 ?extends 通配符。我們認為,從集合中讀 集合就是生產者。

如果不需要讀,只要寫入,那就可以使用? supper通配符。

如果 即要存又要取 那就不要使用任何限定符。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/89390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/89390.shtml
英文地址,請注明出處:http://en.pswp.cn/web/89390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C# in .NET】11. 探秘泛型:類型參數化革命

探秘泛型:類型參數化革命 泛型是 C# 和.NET框架中一項革命性的特性,它實現了 “編寫一次,多處復用” 的抽象能力,同時保持了靜態類型的安全性和高性能。與 C++ 模板等其他語言的泛型機制不同,.NET 泛型在 CLR(公共語言運行時)層面提供原生支持,這使得它兼具靈活性、安…

菜單權限管理

菜單管理系統的整體架構1.Menu 菜單表2.role 角色表3.role_menu 角色菜 單關聯表&#xff08;多對多 &#xff09;要找role_id為3的角色能用哪個菜單:SELECT *FROM sys_menu a LEFT JOIN sys_role_menu b ON a.menu_id b.menu_id WHERE role_id3拆分開就是4.user 用戶表5.user…

SQL FOREIGN KEY:詳解及其在數據庫設計中的應用

SQL FOREIGN KEY:詳解及其在數據庫設計中的應用 引言 在數據庫設計中,數據完整性是至關重要的。SQL FOREIGN KEY(外鍵)是實現數據完整性的一種有效手段。本文將詳細解釋SQL FOREIGN KEY的概念、用途以及在實際數據庫設計中的應用。 外鍵概述 1. 定義 外鍵(FOREIGN KE…

[yotroy.cool] 記一次 spring boot 項目寶塔面板部署踩坑

個人博客https://www.yotroy.cool/&#xff0c;感謝關注&#xff5e; 圖片資源可能顯示不全&#xff0c;請前往博客查看哦&#xff01;部署了個新項目&#xff0c;給我整抑郁了。。。下面是踩坑過程 寶塔面板 MySql5.7 版本 root 密碼錯誤 這個MySQL5.7 安裝完后就跑不了&#…

前端之HTML學習

HTML 學習筆記 前端三大件 HTML&#xff1a;超文本標記語言&#xff08;HyperText Markup Language&#xff09;CSS&#xff1a;層疊樣式表JavaScript&#xff1a;客戶端腳本語言常用框架&#xff1a;jQuery Vue 3(Element plus) HTML 基本概念 超文本&#xff1a;包含圖像…

迅速高效從web2到web3轉型 ,開啟遠程工作

Web2向Web3的轉型&#xff0c;是技術、產品、組織結構和商業模式的深度變革。若要迅速且高效地完成這個轉型&#xff0c;需要清晰的路徑規劃和戰略執行。 目錄 &#x1f501; 一、理解核心區別&#xff1a;Web2 vs Web3 &#x1f680; 二、轉型路徑 1. 選擇合適的切入點 …

區塊鏈開發協作工具全景圖:從智能合約管理到去中心化治理

&#x1f4a5; 三重絞索&#xff1a;區塊鏈開發的至暗時刻 1. 版本管理的深淵 當某DeFi團隊凌晨修復漏洞時&#xff0c;發現生產環境運行的竟是兩周前的廢棄分支——37%的項目因代碼分支混亂引發生產事故&#xff08;Electric Capital 2024&#xff09;。智能合約的版本漂移如同…

冒泡排序、選擇排序、插入排序、快速排序

目錄 1. 冒泡排序 (Bubble Sort) 算法思路分析 代碼實現 復雜度分析 2. 選擇排序 (Selection Sort) 算法思路分析 代碼實現 復雜度分析 3. 插入排序 (Insertion Sort) 算法思路分析 代碼實現 復雜度分析 4. 快速排序 (Quick Sort) 算法思路分析 代碼實現 復雜度…

PHP語言基礎知識(超詳細)第一節

一. PHP簡介: PHP即“超文本預處理器”,創建于1994年,是一種通用開源腳本語言。PHP是在服務器端執行的腳本語言,與C語言類似,是常用的網站編程語言。PHP獨特的語法混合了C、Java、Perl以及 PHP 自創的語法。利于學習,使用廣泛,主要適用于Web開發領域。 二. PHP的優點:…

Reloaded-II項目:解決GitHub下載Mod缺少DLL文件的問題

Reloaded-II項目&#xff1a;解決GitHub下載Mod缺少DLL文件的問題 問題現象分析 在使用Reloaded-II項目加載從GitHub下載的"Debug Stuff"模組時&#xff0c;用戶遇到了一個常見的技術問題&#xff1a;系統提示缺少DLL文件&#xff0c;導致模組無法正常運行。這種情況…

0-1搭建springboot+vue的教務管理系統(核心源碼)

目錄 后端核心代碼&#xff1a; control層 service 層 mapper層 后端核心代碼&#xff1a; control層&#xff1a; classControlsImpl package com.itheima.controls.impl;import com.itheima.mapper.ClassMapper; import com.itheima.pojo.Clazz; import com.itheima.po…

Ubuntu中man手冊不全解決以及man手冊中英文切換方法

步入正題之前&#xff0c;先來幫助大家了解一下man手冊的作用&#xff0c;讓大家對其有更深的理解并充分利用一、man 手冊的作用?man 手冊&#xff0c;即 manual pages&#xff0c;是 Linux 系統自帶的幫助文檔系統。通過 man 命令&#xff0c;用戶能快速獲取系統中幾乎所有命…

數據結構----線性表(棧及其棧的實現)C語言 學習筆記

棧&#xff1a;線性邏輯結構棧的分類 順序棧&#xff1a;順序存儲結構實現的棧鏈式棧&#xff1a;鏈式存儲結構實現的棧相關概念線性表&#xff1a;可以在任意位置操作棧&#xff1a;對線性表進行約束只能在一端插入和刪除操作的線性表&#xff0c;中間不允許操作。棧底&#x…

手滑誤操作? vue + Element UI 封裝二次確認框 | 附源碼

一諾最近在做后臺管理系統時&#xff0c;遇到一個很常見但又容易被忽視的小問題&#xff1a;單選框切換時&#xff0c;用戶一不小心點錯&#xff0c;原有配置就沒了&#xff0c;數據丟失&#xff0c;后悔也來不及。你是不是也遇到過類似的場景&#xff1f;比如切換網絡模式、切…

力扣刷題367——有效的完全平方數

力扣刷題367——有效的完全平方數&#xff08;69的相似題&#xff09; 題目&#xff1a; 給你一個正整數 num 。如果 num 是一個完全平方數&#xff0c;則返回 true &#xff0c;否則返回 false 。 完全平方數 是一個可以寫成某個整數的平方的整數。換句話說&#xff0c;它可以…

kubernetes架構原理與集群環境部署

kubernetes架構原理與集群環境部署概述為什么需要 KubernetesKubernetes 帶來的挑戰kubernetes架構解析master 節點的組件(1)API server(2)scheduler(3)Controller Manager(4)etcdNode 節點包含的組件(1)容器運行時(2)kubelet(3)kube-proxy代理kubernetes 網絡插件(1)Flannel 網…

Python爬蟲實戰:Requests與Selenium詳解

目錄 一 網絡爬蟲的了解 1 爬蟲庫 urllib庫 requests庫 scrapy庫 selenium庫 2 注意&#xff01;&#xff01;&#xff01; 二 requests庫 1 request庫的安裝 2 認識網頁資源 3 獲取網頁資源 4 小案例 5 代理服務器 三 selenium 1 準備工作 2 應用 3 實例 一 網…

什么是樂觀鎖?什么是悲觀鎖?

&#x1f512; 深入淺出&#xff1a;樂觀鎖 vs 悲觀鎖終極對決&#xff01;面試必考知識點詳解 各位CSDN的小伙伴們好呀&#xff01;&#x1f44b; 我是雪碧聊技術&#xff0c;今天給大家帶來高并發編程中的核心概念——樂觀鎖與悲觀鎖的深度解析&#xff01;&#x1f4bb; 無論…

HTML前端性能優化完整指南

圖片優化&#xff1a;性能優化的重中之重 重新審視圖片的必要性 在開始優化之前&#xff0c;首先需要思考一個根本問題&#xff1a;要實現預期的視覺效果&#xff0c;真的需要使用圖片嗎&#xff1f; 隨著Web技術的快速發展&#xff0c;許多以往只能通過圖片實現的效果&…

數據煉金術:用Python做智能數據整理員

數據煉金術&#xff1a;用Python做智能數據整理員 解鎖自動化魔法&#xff1a;文件批量重命名Excel智能清洗數據凈化全流程實戰 一、數據整理的困境與破局之道 你是否面臨這些數據噩夢場景&#xff1f; &#x1f9e9; ??混亂文件目錄??&#xff1a;最終版_報告_V4(1).doc…