java ==和=_Java ==和equals()的區別

前言

本篇文章講的是從JVM角度比較==和equals的區別

一:** Java數據類型分類**

08445889bbb1

Paste_Image.png

1:基本數據類型

又稱為原始數據類型,他們之間的比較應該使用(==),比較的是他們的值。

2:引用數據類型

當引用數據類型用(==)進行比較,比較的是他們在內存中的存放地址。

當復合數據類型之間進行equals比較時,這個方法的初始行為是比較對象在堆內存中的地址。

equals()方法是用來判斷其他的對象是否和該對象相等.

//equals()方法在object類中定義如下:

public boolean equals(Object obj) {

return (this == obj);

}

但在一些諸如String,Integer,Date類中把Object中的這個方法覆蓋了,作用被覆蓋為比較內容是否相同。

// 比如在String類中如下:

public boolean equals(Object var1) {

if(this == var1) {

return true;

} else {

if(var1 instanceof String) {

String var2 = (String)var1;

int var3 = this.value.length;

if(var3 == var2.value.length) {

char[] var4 = this.value;

char[] var5 = var2.value;

for(int var6 = 0; var3-- != 0; ++var6) {

if(var4[var6] != var5[var6]) {

return false;

}

}

return true;

}

}

return false;

}

}

很明顯,這是進行的內容比較,而已經不再是地址的比較。依次類推Math、Integer、Double等這些類都是重寫了equals()方法的,從而進行的是內容的比較。當然,基本類型是進行值的比較。

二: String類的討論

String a = "abc";

String b = "abc";

System.out.println(a == b);//true

輸出true

說明:==在進行復合數據類型比較時,比較的是內存中的存放地址。因此a與b引用同一個String對象。

String b = "abc";

String c = new String("abc");

System.out.println(c == b);//false

System.out.println(c.equals(b));//true

輸出:

false

true

說明:b,c分別引用了兩個對象。顯然,兩者內容是相同的,因此equal返回true。第一個例子也一樣。

三: 解釋

String str1= "hello";

String str2= new String("hello");

String str3= str2;

首先看一張內存上述的內存分配圖

08445889bbb1

Paste_Image.png

從圖中可以發現每個String對象的內容實際是保存到堆內存中的,而且堆中的內容是相等的,但是對于str1和str2來說所指向的地址堆內存地址是不等的,所以盡管內容是相等的,但是地址值是不相等的

“==”是用來進行數值比較的,所以str1和str2比較不相等,因為str2和str3指向同一個內存地址所以str2和str3是相等的。所以“==”是用來進行地址值比較的。

5. 為什么Java中1000==1000為false而100==100為true?

Integer i1 = 100, i2 = 100;

System.out.println(i1 == i2);//true

Integer i3 = 1000, i4 = 1000;

System.out.println(i3 == i4);//fales

查看Integer.java類,會發現有一個內部私有類,IntegerCache.java,它緩存了從-128到127之間的所有的整數對象。

看源碼

private static class IntegerCache {

static final int low = -128;

static final int high;

static final Integer[] cache;

private IntegerCache() {

}

static {

int var0 = 127;

String var1 = VM.getSavedProperty("java.lang.Integer.IntegerCache.high");

int var2;

if(var1 != null) {

try {

var2 = Integer.parseInt(var1);

var2 = Math.max(var2, 127);

var0 = Math.min(var2, 2147483518);

} catch (NumberFormatException var4) {

;

}

}

high = var0;

cache = new Integer[high - -128 + 1];

var2 = -128;

for(int var3 = 0; var3 < cache.length; ++var3) {

cache[var3] = new Integer(var2++);

}

assert high >= 127;

}

}

所以例子中i1和i2指向了一個對象。因此100==100為true。

Demo地址

最后

不懂得地方歡迎私信我,我會在第一時間給予回復,如閱讀中發現寫錯的地方,歡迎糾正。

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

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

相關文章

ZOJ 3804 YY's Minions (簡單模擬)

1 /*2 題意&#xff1a;一個矩陣中有 n*m個寵物&#xff0c;每一個寵物都有一個狀態&#xff0c; 1醒著的&#xff0c;0睡著的3 X離開的&#xff01;如果這個寵物&#xff08;醒著的&#xff09;的周圍醒著的個數>3 || <2它就會睡著&#xff0c;4 如果這個寵物&…

java接口方法實現_Java接口的簡單定義與實現方法示例

本文實例講述了Java接口的簡單定義與實現方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;1、接口是Java中最終要的概念&#xff0c;接口可以理解為一種特殊的類&#xff0c;里面全部是由全局常量和公共的抽象方法所組成。2、接口的格式:interface interfaceName{全…

NYOJ995硬幣找零(簡單dp)

1 /*2 題意&#xff1a;給你不同面額的硬幣&#xff08;每種硬幣無限多&#xff09;&#xff0c;需要找零的面值是T&#xff0c;用這些硬幣進行找零&#xff0c;3 如果T恰好能被找零&#xff0c;輸出最少需要的硬幣的數目&#xff01;否則請輸出剩下錢數最少的找零方案…

docker mysql命令大全_Docker命令大全

Docker run 命令docker run [OPTIONS] IMAGE [COMMAND] [ARG...]OPTIONS說明&#xff1a;-a stdin: 指定標準輸入輸出內容類型&#xff0c;可選 STDIN/STDOUT/STDERR 三項&#xff1b;-d: 后臺運行容器&#xff0c;并返回容器ID&#xff1b;-i: 以交互模式運行容器&#xff0c;…

NYOJ 1023 還是回文(DP,花最少費用形成回文串)

1 /*2 題意&#xff1a;給出一串字符(全部是小寫字母)&#xff0c;添加或刪除一個字符&#xff0c;都會產生一定的花費。3 那么&#xff0c;將字符串變成回文串的最小花費是多少呢&#xff1f; 4 5 思路&#xff1a;如果一個字符串增加一個字符 x可以形成一個回文串…

java mapreduce教程_Java搭建MapReduce完成二次排序步驟

1、構建新的作業Configuration confgetConf();Job jobJob.getInstance(conf);job.setJarByClass(SortYearAndTemp2.class);2、設置輸入輸出目錄Path inpathnew Path(conf.get("inpath"));Path outpathnew Path(conf.get("outpath"));FileInputFormat.addIn…

contentprovider java_創建Contentprovider,

創建Contentprovider:1. 創建一個provider----ExampleContentProvidera. 設計authority b. 設計path c.處理content URI IDs d.Content URI patterns)定義MIME Types(One of the required methods that you must implement for any provider.A method that youre expected to i…

hdu Caocao's Bridges(無向圖邊雙連通分量,找出權值最小的橋)

1 /*2 題意&#xff1a;給出一個無向圖&#xff0c;去掉一條權值最小邊&#xff0c;使這個無向圖不再連同&#xff01;3 4 tm太坑了...5 1,如果這個無向圖開始就是一個非連通圖&#xff0c;直接輸出06 2&#xff0c;重邊&#xff08;兩個節點存在多條邊&am…

poj1273Drainage Ditches

1 #include<iostream>2 /*3 題意&#xff1a;就是尋找從源點到匯點的最大流&#xff01;4 要注意的是每兩個點的流量可能有多個&#xff0c;也就是說有重邊&#xff0c;所以要把兩個點的所有的流量都加起來5 就是這兩個點之間的流量了&#xff0…

Java11.0.2怎么生成JRE_java環境變量配置,jdk13.0.1中沒有jre解決辦法

標簽&#xff1a;完成后 回車 手動 完成 cmd 沒有 alt span 環境變量配置java.Oracle中下載了最新的jdk13.0.1&#xff0c;安裝之后發現沒自動生成jre&#xff0c;導致環境變量配置一直不成功如果沒有自動生成jre&#xff0c;需要手動生成jre手動生成辦法&…

hdu4751Divide Groups(dfs枚舉完全圖集合或者bfs染色)

1 /*************************************************************************2 > File Name: j.cpp3 > Author: HJZ4 > Mail: 2570230521qq.com 5 > Created Time: 2014年08月28日 星期四 12時26分13秒6 ***********************************…

java二期_享學二期java架構師

前言-薇:itstudy01在我們工作和學習的過程中&#xff0c;Java線程我們或多或少的都會用到&#xff0c;但是在使用的過程上并不是很順利&#xff0c;會遇到各種各樣的坑&#xff0c;這里我通過講解Thread類中的核心方法&#xff0c;以求重點掌握以下關鍵技術點&#xff1a;線程的…

poj3342Party at Hali-Bula(樹形dp)

1 /*2 樹形dp&#xff01;3 判重思路&#xff1a;4 當dp[v][0]dp[v][1]時&#xff0c;很自然&#xff0c;flag[u][0]必然是有兩種方案的。flag[u][1]則不然&#xff0c;5 因為它只和dp[v][0]有關系。而若flag[v][0]不唯一時&#xff0c;則必然flag[u][1]也不唯一6 …

mysql django構架圖_(一)Django項目架構介紹

項目的架構為&#xff1a;1、虛擬環境virtualenv安裝Django2.1.3安裝pymysql安裝mysqlclient安裝其他等2、項目結構為&#xff1a;應用APP&#xff1a;blog -- 管理博客account -- 管理用戶注冊/登錄/等后臺數據庫&#xff1a;mysql路由分層及命名空間&#xff1a;根據應用進行…

poj1330Nearest Common Ancestors 1470 Closest Common Ancestors(LCA算法)

LCA思想&#xff1a;http://www.cnblogs.com/hujunzheng/p/3945885.html 在求解最近公共祖先為問題上&#xff0c;用到的是Tarjan的思想&#xff0c;從根結點開始形成一棵深搜樹&#xff0c;非常好的處理技巧就是在回溯到結點u的時候&#xff0c;u的子樹已經遍歷&#xff0c;這…

LCA算法的理解

LCA思想&#xff1a;在求解最近公共祖先為問題上&#xff0c;用到的是Tarjan的思想&#xff0c;從根結點開始形成一棵深搜樹&#xff0c;非常好的處理技巧就是在回溯到結點u的時候&#xff0c;u的子樹已經遍歷&#xff0c;這時候才把u結點放入合并集合中&#xff0c; 這樣u結點…

java連加密的mysql_Java 實現加密數據庫連接

一、前言在很多項目中&#xff0c;數據庫相關的配置文件內容都是以明文的形式展示的&#xff0c;這存在一定的安全隱患。在開發和維護項目時&#xff0c;不僅要關注項目的性能&#xff0c;同時也要注重其安全性。二、實現思路我們都知道項目啟動時&#xff0c;Spring 容器會加載…

codeforces Gargari and Bishops(很好的暴力)

1 /*2 題意&#xff1a;給你一個n*n的格子&#xff0c;每一個格子都有一個數值&#xff01;將兩只bishops放在某一個格子上&#xff0c;3 每一個bishop可以攻擊對角線上的格子&#xff08;主對角線和者斜對角線&#xff09;&#xff0c;然后會獲得格子上的4 數值&a…

java詞匯速查手冊_java 詞匯表速查手冊

Abstract class 抽象類:抽象類是不允許實例化的類&#xff0c;因此一般它需要被進行擴展繼承。Abstract method 抽象方法:抽象方法即不包含任何功能代碼的方法。Access modifier 訪問控制修飾符:訪問控制修飾符用來修飾Java中類、以及類的方法和變量的訪問控制屬性。Anonymous …

codeforces Gargari and Permutations(DAG+BFS)

1 /*2 題意&#xff1a;求出多個全排列的lcs&#xff01;3 思路&#xff1a;因為是全排列&#xff0c;所以每一行的每一個數字都不會重復&#xff0c;所以如果有每一個全排列的數字 i 都在數字 j的前面&#xff0c;那么i&#xff0c; j建立一條有向邊&#xff01;4 …