Java對象

面向對象和面向過程的區別

兩者的主要區別在于解決問題的方式不同
面向過程把解決問題的過程拆成一個個方法,通過一個個方法的執行解決問題。
面向對象會先抽象出對象,然后用對象執行方法的方式解決問題。
另外,面向對象開發的程序一般更易維護、易復用 易擴展。

創建一個對象用什么運算符?對象實體與對象引用有何不同?

new運算符,new創建對象實例(對象實例在堆內存中),對象引用指向對象實例(對象引用存放在棧內存中)
一個對象引用可以指向0個或1個對象(一根繩子可以不系氣球,也可以系一個氣球)一個對象可以有n個引用指向它(可以用n條繩子系住一個氣球)。

對象的相等和引用相等的區別

對象的相等一般比較的是內存中存放的內容是否相等
引用相等一般比較的是他們指向的內存地址是否相等

類的構造方法的作用是什么

溝造方法是一種特殊的方法,主要作用是完成對象的初始化工作。

如果一個類沒有聲明構造方法, 該程序能正確執行嗎?

如果一個類沒有聲明構造方法,也可以執行! 因為一個類即使沒有聲明構造方法也會有默認的不帶參數的構造方法。如果我們自己添加了類的構造方法(無論是否有參),ava就不會再添加默認的
無參數的構造方法了,我們一直在不知不覺地使用構造方法,這也是為什么我們在創建對象的時候
后面要加一個括號(因為要調用無參的構造方法)。如果我們重載了有參的構造方法,記得都要把無參的構造方法也寫出來(無論是否用到),因為這可以幫助我們在創建對象的時候少踩。

溝造方法有哪些特點? 是否可被override

構造方法特點如下:
名字與類名相同
沒有返回值,但不能用void聲明構造函數
生成類的對象時自動執行,無需調用
構造方法不能被override (重寫),但是可以overload (重載)所以你可以看到一個類中有多個構造函數的情況

面向對象的三大特征

封裝

封裝是指把一個對象的狀態信息(也就是屬性)隱藏在對象內部,不允許外部對象直接訪問對象的為部信息。但是可以提供一些可以被外界訪問的方法來操作屬性。

繼承

不同類型的對象,相互之間經常有一定數量的共同點。

接口和抽象類有什么共同點和區別

共同點:
都不能被實例化
都可以包含抽象方法
都可以有默認實現的方法(java8可以用 default 關鍵字在接口中定義默認方法)
區別:
接口主要用于對類的行為進行約束,你實現了某個接口就具有了對應的行為。抽象類主要用于
代碼復用,強調的是所屬關系
一個類只能繼承一個類, 但是可以實現多個接口
接口中的成員變量只能是 public static final 類型的,不能被修改且必須有初始值,而抽
象類的成員變量默認default, 可在子類中被重新定義,也可被重新賦值。

深接貝和淺貝區別了解嗎?什么是引用貝?

關于深貝和淺貝區別,我這里先給結論
淺拷貝:淺貝會在堆上創建一個新的對象(區別于引用拷貝的一點),不過,如果原對象內
部的屬性是引用類型的話,淺貝會直接復制內部對象的引用地址,也就是說貝對象和原對象共用同一個內部對象
深拷貝:深拷貝會完全復制整個對象,包括這個對象所包含的內部對象。

Object類的常見方法有哪些?

Object類是一個特殊的類,是所有類的父類。它主要提供了以下11個方法

== 和equals的區別

對于基本類型和引用類型的作用效果是不同的:
對于基本數據類型來說, 比較的是值。
對于引用數據類型來說, 比較的是對象的內存地址,
因為java只有值傳遞,所以,對于==來說,不管是比較基本數據類型,還是引用數據類型的變量,其本質比較的都是值,只是引用類型變量存的值是對象的地址
equals) 不能用于判斷基本數據類型的變量,只能用來判斷兩個對象是否相等。 equals()方法存在于bject類中,而object類是所有類的直接或間接父類,因此所有的類都有equalsC)方法。
Object類 equalsC) 方法:

equals) 方法存在兩種使用情況:
類沒有重寫 equas()方法:通過equals()比較該類的兩個對象時,等價于通過 == 比較
這兩個對象,使用的默認是 object類equals()方法
類重寫了 equals()方法: 般我們都重寫 equas()方法來比較兩個對象中的屬性是否柜等;若它們的屬性相等,則返回true(即,認為這兩個對象相等)
舉個例子 (這里只是為了舉例。 實際上, 你按照下面這種寫法的話,像IDEA這種比較智能的IDEA 都會提示你將 == 換成 equals()。

String 中的 equals 方法是被重寫過的,因為 Object 的 equals 方法是比較的對象的內存
地址,而 String 的 equals 方法比較的是對象的值
當創建 String 類型的對象時,虛擬機會在常量池中查找有沒有已經存在的值和要創建的值相同
的對象,如果有就把它賦給當前引用。如果沒有就在常量池中重新創建一個 String 對象。
String類equals()方法:

hashCodeO有什么用?

hashcodeC 的作用是獲取哈希碼(int整數),也稱為散列碼。這個哈希碼的作用是確定該對象在哈希表中的索引位置
hashcode()定義在DK的 Object 類中,這就意味著java中的任何類都包含有
hashcode() 函數。另外需要注意的是:Object的hashcode()方法是本地方法,也就是用C語言或c++實現的,該方法通常用來將對象的內存地址轉換為整數之后返回。

散列表存儲的是鍵值對(key-value),它的特點是:能根據鍵“快速的檢索出對應的值”。這其中就利用到了散列碼! (可以快速找到所需要的對象)

為什么要有hashCode?

我們以HashSet 如何檢查重復為例子來說明為什么要有 hashcode
下面這段內容摘自我的Java啟蒙書 《HeadFirst java》:
當你把對象加入 HashSet 時, HashSet 會先計算對象的 hashcode 值來判斷對象加入的位置,同時也會與其他已經加入的對象的 hashcode值作比較,如果沒有相符的 hashcode
HashSet 會假設對象沒有重復出現。但是如果發現有相同hashcode 值的對象,這時會調用equals) 方法來檢查 hashcode 相等的對象是否真的相同。如果兩者相同,HashSet就不會讓其加入操作成功。如果不同的話,就會重新散列到其他位置。這樣我們就大大減少了
equals 的次數,相應就大大提高了執行速度。
其實, hashcodeC) 和 equals)都是用于比較兩個對象是否相等

那為什么JDK還要同時提供這兩個方法呢?

這是因為在一些容器(比如 HashMap、 HashSet)中,有了 hashcodeC)之后,判斷元素是否在對應容器中的效率會更高 (參考添加元素進HashSet的過程)
我們在前面也提到了添加元素進Hashset的過程,如果HashSet在對比的時候,同樣的
hashcode 有多個對象,它會繼續使用 equals) 來判斷是否真的相同。也就是說 hashcode
幫助我們大大縮小了查找成本。

那為什么不只提供 hashcodeO 方法呢?
這是因為兩個對象的hashcode 值相等并不代表兩個對象就相等
那為什么兩個對象有相同的 hashcode 值,它們也不一定是相等的?
因為 hashcodeC 所使用的哈希算法也許剛好會讓多個對象傳回相同的哈希值。越糟糕的哈希算法越容易碰撞,但這也與數據值域分布的特性有關 (所請哈希碰撞也就是指的是不同的對象得到柜同的 hashcode)
總結下來就是:
如果兩個對象的hashcode 值相等,那這兩個對象不一定相等(哈希碰撞)。
如果兩個對象的hashcode 相等并且equals()方法也返回 true,我們才認為這兩個對象
相等。
如果兩個對象的hashcode 值不相等,我們就可以直接認為這兩個對象不相等
相信大家看了我前面對 hashcodeO) 和equalsO 的介紹之后, 下面這個問題已經難不倒你們
了。

為什么重寫equals() 時必須重寫hashCode() 方法?

因為兩個相等的對象的 hashcode 值必須是相等。也就是說如果 equals 方法判斷兩個對象是相等的,那這兩個對象的 hashcode 值也要相等,
如果重寫 equals) 時沒有重寫 hashcode() 方法的話就可能會導致 equals 方法判斷是相等的兩個對象, hashcode 值卻不相等
思考:重寫 equals) 時沒有重寫 hashcode) 方法的話,使用 HashMap 可能會出現什么問
題。
總結:
equals 方法判斷兩個對象是相等的,那這兩個對象的 hashcode 值也要相等
兩個對象有相同的 hashcode 值,他們也不一定是相等的(哈希碰撞)

String

String、 StringBuffer、StringBuilder的區別?
可變性
String 是不可變的
StringBuilder 與 StringBuffer 都繼承自 AbstractStringBuilder 類,在
AbstractStringBuilder 中也是使用字符數組保存字符串,不過沒有使用final和
private 關鍵字修飾,最關鍵的是這個 AbstractstringBuilder 類還提供了很多修改字符串的方法比如 append 方法。
線程安全性
String 中的對象是不可變的,也就可以理解為常量,線程安全。AbstractstringBuilder是StringBuilder 與 StringBuffer 的公共父類,定義了一些字符串的基本操作,如
expandcapacity、 append、insert、indexOf 等公共方法。 StringBuffer對方法加了司步鎖或者對調用的方法加了同步鎖,所以是線程安全的。 StringBuilder并沒有對方法進行加同步鎖,所以是非線程安全的。
性能
每次對String 類型進行改變的時候,都會生成一個新的 String對象,然后將指針指向新的String對象。 StringBuffer 每次都會對 StringBuffer 對象本身進行操作,而不是生成新的對象并改變對象引用。相同情況下使用StringBuilder 相比使用 StringBuffer僅能獲得10%~15%左右的性能提升,但卻要冒多線程不安全的風險。
對于三者使用的總結:
1操作少量的數據:適用String
2單線程操作字符串緩沖區下操作大量數據:適用 StringBuilder
3多線程操作字符串緩沖區下操作大量數據:適用 StringBuffer

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

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

相關文章

乞丐傳武功

題目 你施舍給了路邊的乞丐兩個饅頭,誰料這個乞丐其實是隱士高人。為了回報你的善心,只見他緩緩從懷中掏出了數本武功秘籍,讓你從中挑選一本。你珍重地接過這些秘籍,目光掃過每本封面,降龍十八掌、神照經、易筋經、凌…

[FreeRTOS 基礎知識] 互斥量 概念

文章目錄 基礎知識互斥量互斥量與信號量區別優先級反轉優先級繼承小結 基礎知識 [FreeRTOS 基礎知識] 信號量 概念 互斥量 互斥量(Mutex,全稱:Mutual Exclusion),在計算機科學中,是一種用于防止多個進程同…

科研繪圖系列:R語言實驗結果組圖(linechart + barplot)

介紹 實驗結果的多樣性意味著每個結果都可能揭示研究的不同方面或角度。在科學研究和數據分析中,通常我們會收集一系列數據點,每個數據點都對應著實驗的一個特定變量或條件。為了全面理解這些數據,我們可能會采用多種可視化技術來展示它們。 將多個結果分別可視化,可以讓…

親子時光里的打臉高手,賈乃亮與甜馨的父愛如山

賈乃亮這波操作,簡直是“實力打臉”界的MVP啊! 7月5號,他一甩手,甩出張合照, 瞬間讓多少猜測紛飛的小伙伴直呼:“臉疼不?”帶著咱家小甜心甜馨, 回了哈爾濱老家,這趟親…

Nginx(http配置、https配置)訪問Spring Boot 項目

前文 記錄一下在linux服務器下配置nginx中nginx.conf文件代理訪問springboot項目 1. spring boot.yml配置 其他mysql,redis,mybatis等之類的配置就不一一列出了 # 自定義配置 為了等下驗證讀取的配置文件環境 appName: productserver:port: 8083 # 應用服務 WEB 訪問端口s…

SQL窗口函數詳解

詳細說明在sql中窗口函數是什么,為什么需要窗口函數,有普通的聚合函數了那窗口函數的意義在哪,窗口函數的執行邏輯是什么,over中的字句是如何使用和理解的(是不是句句戳到你的痛點,哼哼~&#x…

C語言編譯和編譯預處理

編譯預處理 ? 編譯是指把高級語言編寫的源程序翻譯成計算機可識別的二進制程序(目標程序)的過程,它由編譯程序完成。 ? 編譯預處理是指在編譯之前所作的處理工作,它由編譯預處理程序完成 在對一個源程序進行編譯時,…

全國青少年軟件編程等級考試-四級-奇偶之和(真題)

題目:奇偶之和 1.準備工作 (1)保留舞臺中的小貓角色; 2.功能實現 (1)分別計算1~100中,奇數之和,偶數之和; (2)說出奇數之和,偶數之和。 講解: 1、如何判斷奇偶數 奇數是指除以2有…

C++deque容器

文章目錄 deque容器概念deque操作deque對象的帶參數構造deque頭部和末尾的添加移除操作deque的數據存取deque與迭代器deque賦值deque插入deque刪除 deque容器概念 deque是雙端數組,而vector是單端的。 ?deque頭部和尾部添加或移除元素都非常快速, 但是在中部安插元…

在x86/amd64的機器上使用Docker運行arm64v8/ubuntu并安裝ROS1

一、準備工作 主要是因為國內網絡的問題,可能導致鏡像拉取失敗,解決辦法參考:鏡像加速 二、安裝運行過程 2.1拉取鏡像: sudo docker pull arm64v8/ubuntu:20.04這個是ubuntu的拉取指令,其他的也是類似。 2.2 運行…

【DevOps】運維過程中經常遇到的Http錯誤碼問題分析(一)

一、解決HTTP 408錯誤:上傳3M文件時請求超時的問題 在開發Web應用程序時,遇到HTTP 408狀態碼(請求超時)是常見的問題。特別是在上傳大文件時,這種情況更容易發生。本文將探討在上傳一個3M文件時,Web服務器…

LeetCode題練習與總結:排序鏈表--148

一、題目描述 給你鏈表的頭結點 head ,請將其按 升序 排列并返回 排序后的鏈表 。 示例 1: 輸入:head [4,2,1,3] 輸出:[1,2,3,4]示例 2: 輸入:head [-1,5,3,4,0] 輸出:[-1,0,3,4,5]示例 3&am…

封鎖-封鎖模式(共享鎖、排他鎖)、封鎖協議(兩階段封鎖協議)

一、引言 1、封鎖技術是目前大多數商用DBMS采用的并發控制技術,封鎖技術通過在數據庫對象上維護鎖來實現并發事務非串行調度的沖突可串行化 2、基于鎖的并發控制的基本思想是: 當一個事務對需要訪問的數據庫對象,例如關系、元組等進行操作…

【嵌入式開發 Linux 常用命令系列 1.6 -- grep 過濾指定的目錄】

請閱讀【嵌入式開發學習必備專欄 】 文章目錄 grep 過濾指定目錄 grep 過濾指定目錄 在Linux中使用grep搜索字符串并希望排除特定目錄時,可以使用--exclude-dir參數。這個參數允許你指定一個或多個目錄名稱來排除它們的內容不被grep搜索。這對于忽略一些常見的臨時…

LLM - 詞向量 Word2vec

1. 詞向量是一個詞的低維表示,詞向量可以反應語言的一些規律,詞意相近的詞向量之間近乎于平行。 2. 詞向量的實現: (1)首先使用滑動窗口來構造數據,一個滑動窗口是指在一段文本中連續出現的幾個單詞&#x…

llamaindex實戰-使用本地大模型和數據庫對話

概述 本文使用NLSQLTableQueryEngine 查詢引擎來構建SQL的自然語言處理查詢。 請注意,我們需要指定要與該查詢引擎一起使用的表。如果我們不這樣做,查詢引擎將提取所有架構上下文,這可能會溢出 LLM 的上下文窗口。 在以下情況都可以使用NL…

如何用Java寫一個整理Java方法調用關系網絡的程序

大家好,我是猿碼叔叔,一位 Java 語言工作者,也是一位算法學習剛入門的小學生。很久沒有為大家帶來干貨了。 最近遇到了一個問題,大致是這樣的:如果給你一個 java 方法,如何找到有哪些菜單在使用。我的第一想…

線程中如何有效避免死鎖問題

1. 理解死鎖形成的原因 互斥條件:一個資源每次只能被一個線程使用。 請求與保持條件:線程因請求資源而阻塞時,對已獲得的資源保持不放。 不剝奪條件:線程已獲得的資源,在末使用完之前,不能強行剝奪。 循環…

c++ primer plus 第15章友,異常和其他:15.1.3 其他友元關系

c primer plus 第15章友,異常和其他:15.1.3 其他友元關系 提示:這里可以添加系列文章的所有文章的目錄,目錄需要自己手動添加 15.1.3 其他友元關系 提示:寫完文章后,目錄可以自動生成,如何生成可…

整潔架構SOLID-單一職責原則(SRP)

文章目錄 定義案例分析重復的假象代碼合并解決方案 小結 定義 SRP是SOLID五大設計原則中最容易被誤解的一個。也許是名字的原因,很多程序員根據SRP這個名字想當然地認為這個原則就是指:每個模塊都應該只做一件事。 在歷史上,我們曾經這樣描…