日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java中常見的幾個陷阱,你沒有遇到幾個?

概述

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

專業(yè)從事網(wǎng)站制作、成都網(wǎng)站建設(shè),高端網(wǎng)站制作設(shè)計,小程序定制開發(fā),網(wǎng)站推廣的成都做網(wǎng)站的公司。優(yōu)秀技術(shù)團隊竭力真誠服務(wù),采用H5建站+CSS3前端渲染技術(shù),成都響應(yīng)式網(wǎng)站建設(shè)公司,讓網(wǎng)站在手機、平板、PC、微信下都能呈現(xiàn)。建站過程建立專項小組,與您實時在線互動,隨時提供解決方案,暢聊想法和感受。

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

不可變的String

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

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

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

自動裝箱與拆箱

裝箱就是自動將基本數(shù)據(jù)類型轉(zhuǎn)換為包裝器類型;

拆箱就是自動將包裝器類型轉(zhuǎn)換為基本數(shù)據(jù)類型。

裝箱拆箱的類型有哪些?

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

那拆裝箱會出現(xiàn)什么問題呢?

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

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

內(nèi)存泄漏

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

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

常見的情況是:

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

自增類型使用

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

第一種情況的執(zhí)行上下文如下:

1.存儲操作數(shù)的先前值。

2.增加值。

3.返回上一個值

第二種情況的執(zhí)行上下文如下:

1.增加值。

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

3.返回值

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

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

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

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

Java語言規(guī)范的字符串文字中:同一包中不同類內(nèi)的文字字符串表示對同一String 對象的引用

如果還不清楚那看下兩種字符串創(chuàng)建過程

第一種new的方式

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

第二種,直接賦值

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

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

兩個Integer 對比

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

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

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

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

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

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

Double 類型計算

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

總結(jié)

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


標題名稱:Java中常見的幾個陷阱,你沒有遇到幾個?
分享網(wǎng)址:http://m.5511xx.com/article/djhiisj.html