成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 中常見的幾個陷阱,你沒有遇到幾個?

開發 后端
java 中有很多,新手經常遇到的陷阱,本文主要包含:自動裝箱與拆箱;不可變的String;內存泄漏;自增類型使用;使用 “==”進行對象比較;double 類型計算

概述

 

[[280818]]

 

java 中有很多,新手經常遇到的陷阱,本文主要包含

  • 自動裝箱與拆箱
  • 不可變的String
  • 內存泄漏
  • 自增類型使用
  • 使用 “==”進行對象比較
  • double 類型計算

不可變的String

Java String類是不可變的(不可修改)。這是因為String對象被緩存在String池中。字符串引用的對象可以更改,但字符串對象本身不能更改。

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

字符串是不可變的。一旦創建了字符串,以后將無法更改該字符串對象。

Java使用按值傳遞,而不是按引用傳遞。當您在方法中為分配新值時,它只會修改本地,而不是調用代碼中的原始s

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

自動裝箱與拆箱

裝箱就是自動將基本數據類型轉換為包裝器類型;

拆箱就是自動將包裝器類型轉換為基本數據類型。

裝箱拆箱的類型有哪些?

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

通過上圖,可以看出,java 基本類型可以進行拆裝箱。

那拆裝箱會出現什么問題呢?

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

通過實例,上面兩個程序,計算耗時相差近10倍,在大量存在裝箱行為時,會導致程序性能低下。

當封裝類型進行==、+、-、*、/計算時,會自動拆箱,對基礎數據類型進行運算.所以在進行計算時,使用基本數據類型。

內存泄漏

Java的核心優勢之一是 Java垃圾收集器,它可以管理堆上的對象內存。每當對象不可訪問時,它將自動釋放。

但是,對于新手和有經驗的程序員而言,常見的錯誤是通過允許不再使用的對象可訪問來防止釋放內存。這可能對項目造成很大的不利影響,因為內存泄漏會阻塞資源并降低應用程序性能。它甚至可能導致java.lang.OutOfMemoryError。

常見的情況是:

  • 靜態字段聲明。靜態字段,并在不再需要其數據后忘記將其設置為null
  • 未正常關閉流。 Java虛擬機為每個打開的連接分配內存。忘記關閉連接會消耗內存。這樣的連接可以是:輸入流,數據庫連接,會話等。
  • finalize() 方法。當我們覆蓋的finalize()方法,finalize()只會在對象內存回收前被調用一次,具有不確定行,只保證方法會調用,但不保證方法里的任務會被執行完。所以盡量避免使用。在Java 9 中,已經聲明為過期函數,

自增類型使用

Java中運算符的計算順序是在同等級下從左到右計算,看下自增情況

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

第一種情況的執行上下文如下:

1.存儲操作數的先前值。

2.增加值。

3.返回上一個值

第二種情況的執行上下文如下:

1.增加值。

2.存儲操作數的值(遞增)

3.返回值

使用 “==”進行對象比較

許多新手程序員嘗試使用“ ==”運算符比較對象,并且當代碼的行為不符合預期時,就會感到困惑。需要注意的是,關系運算符“ ==”正在進行引用比較,它檢查兩個對象是否都指向內存中的相同位置。使用 .equals()方法將消除此問題,因為它會比較對象內部的值。

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

盡管有時“ ==”運算符會給出預期的答案:

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

這是什么原因呢?同樣是字符串,創建的方式不同,差距咋這么大呢

Java語言規范的字符串文字中:同一包中不同類內的文字字符串表示對同一String 對象的引用

如果還不清楚那看下兩種字符串創建過程

第一種new的方式

new一個字符串時,做了兩件事。首先在堆中生成了該字符串對象,然后去看常量池中有沒有該字符串,如果有就不管了,沒有就往常量池中添加一個

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

第二種,直接賦值

這樣創建字符串,首先會去常量池里找有沒有這個字符串,有就直接指向常量池的該字符串,沒有就先往常量池中添加一個,再指向它。

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

上面就是兩種方式的對比情況了。

 

[[280822]]

 

兩個Integer 對比

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

那為什么100的時候就是相等200就不行了呢這是由于Integer 使用了緩存。

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

其static塊中就一次性生成了-128到127直接的Integer類型變量存儲在cache[]中,對于-128到127之間的int類型,返回的都是同一個Integer類型對象。

整個工作過程就是:Integer.class在裝載(Java虛擬機啟動)時,其內部類型IntegerCache的static塊即開始執行,實例化并暫存數值在-128到127之間的Integer類型對象。

當自動裝箱int型值在-128到127之間時,即直接返回IntegerCache中暫存的Integer類型對象。

為什么Java這么設計?應該是出于效率考慮,因為自動裝箱經常遇到,尤其是小數值的自動裝箱;而如果每次自動裝箱都觸發new,在堆中分配內存,就太耗時了;

其它幾種基本類型包裝類,也進行了緩存

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

Double 類型計算

 

Java 中常見的幾個陷阱,你沒有遇到幾個?

 

Java中的double和float在內部表示為二進制分數,因此在表示十進制分數時可能不夠精確(IEEE標準754)。十進制數計算需要精度,需要使用java.math.BigDecimal

總結

Java 中還有很多小陷阱,如果你有可以寫出來吆。

責任編輯:華軒 來源: 今日頭條
相關推薦

2022-05-24 16:09:38

前端腳本

2020-08-13 06:43:41

React前端開發

2022-04-06 07:32:41

Java運算符變量

2019-08-29 09:15:30

負載均衡算法備份

2022-07-20 09:06:27

Hook封裝工具庫

2021-10-12 00:04:24

腳本備份MariDB

2014-05-04 16:39:49

開源項目開源產品

2022-07-03 23:26:38

DOMHook封裝

2025-03-25 10:49:13

2022-06-30 08:31:54

排序函數SQL

2023-04-11 08:49:42

排序函數SQL

2010-11-01 09:16:13

DIV+CSS

2022-11-16 09:04:36

SQL查詢SELECT

2021-11-04 11:54:30

Linux內存系統

2010-10-26 10:16:36

求職

2010-01-26 15:32:43

Scala用法錯誤

2021-11-26 05:50:50

Promise JS項目

2023-12-06 14:23:24

2019-10-17 16:02:44

高并發緩存瀏覽器

2024-09-11 16:34:38

語法糖Java語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色网站在线 | 九九久久免费视频 | 亚洲精品乱码久久久久久按摩观 | 久久99视频精品 | 少妇诱惑av | 成人午夜免费网站 | 日韩福利在线 | 亚洲经典一区 | 亚洲精品www | 中文字幕不卡在线观看 | 毛片免费看的 | 欧美bondage紧缚视频 | 欧美精选一区二区 | 欧美激情综合 | 午夜影院网站 | 日韩电影中文字幕 | 亚洲一区二区三区高清 | 亚洲精美视频 | 国产在线中文字幕 | 日韩免费 | 欧美在线一区二区三区 | 欧美精品成人一区二区三区四区 | 一级黄色绿像片 | 黄a在线观看 | 久久国产精品一区二区三区 | 一区二区三区四区在线视频 | 日韩电影免费在线观看中文字幕 | 综合网伊人 | 91久久国产综合久久91精品网站 | 欧美中文字幕在线 | 国产成人免费一区二区60岁 | 亚洲成人精品在线观看 | 久久久久免费观看 | 国产午夜精品视频 | 久久久久久av | 蜜桃综合在线 | 九九热精品视频在线观看 | 毛片一区二区三区 | 欧美三级视频 | 国产激情精品 | 在线免费观看毛片 |