java踩坑記

1.String 相等

稍微有點經驗的程序員都會用equals比較而不是用 ==,但用equals就真的安全了嗎,看下面的代碼

user.getName().equals("xiaoming");

有經驗的老司機很快就能看到問題,如果user.getName()為null,就會拋出空指針異常,因此下面的寫法更為穩妥

"xiaoming".equals(user.getName());

當然這種寫法并不是萬能的,如果比對的兩邊都是未知變量,如下

user.getName().equals(user1.getName());//user.getName() 和 user1.getName()都有可能為null

因此更為穩妥的方法可以采用jdk Objects類中的equals方法,左右兩邊都可以避免空指針異常

Objects.equals(user.getName(), user1.getName());

需要注意的是Objects類在jdk1.7才支持,如果是jdk1.6,可以采用guava中的Objects類代替

2.Integer 比較

Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;
System.out.println(a == b);// 結果為:true
System.out.println(c == d);// 結果為:false

令人驚訝的是結果并不是預料中的全是true,而是一個為true,一個為false
至于原因還需要從源碼中探究

首先通過源碼來看一下,當通過 = 對Integer賦值時,實際調用了Integer.valueOf()方法

public static Integer valueOf(int i) {assert IntegerCache.high >= 127;if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}

可以看到當 i >= IntegerCache.low && i <= IntegerCache.high 時,是從一個緩存類中取,其它情況會new一個對象。IntegerCache.low默認為-128,high默認為127(可調整)。

這樣a=b就很好解釋了,因為==比較的是內存地址,a,b都是從這個緩存類中取的同一個對象,所以返回結果為true。b,c則都是new的新對象,內存地址自然不同,所以返回false

既然看到了這個緩存類,就有必要一睹它的廬山真面目了

private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);}private IntegerCache() {}
}

IntegerCache 是Integer類中一個靜態內部類,high值可通過JVM 的啟動參數設置

3.Arrays.asList(array)

String [] array= {"a","b","c"};
// 返回的List實例為:java.util.Arrays.ArrayList
List<String> list = Arrays.asList(array);
list.remove(0);

Arrays.asList是一種很常見的創建List的方式,但該方法返回的List實例不是平時常用的List實例,而是Arrays的一個靜態內部類,該類繼承自AbstractList類,并為提供List的完整的實現,例如remove方法就未實現,當然,如果只是用做遍歷,則完全是沒問題的

類似的情況還有不少,使用時要注意,例如:

  1. ArrayList的subList方法,返回的是ArrayList中的一個內部類java.util.ArrayList.SubList
  2. HashMap的values方法,返回的是HashMap中的一個內部類:java.util.HashMap.Values

4.list.toArray

List<String> list = new ArrayList<String>();
String[] array=(String[]) list.toArray();

上面的寫法乍一看似乎沒有什么問題,但list.toArray()返回的是一個object數組,強轉會拋異常。其實是可以指定返回數組的類型的,如下

String[] array=list.toArray(new String[list.size()]);

5.foreach remove

List<String> list =new ArrayList<String>();
list.add("java");
list.add("c");
list.add("js");
for(String str:list){list.remove(0);
}

在遍歷時刪除元素也是比較常用的操作,但foreach時刪除元素有可能拋異常,這種不好控制的寫法還是不用為好,可以用迭代器去代替

for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {String str = iterator.next();iterator.remove();
}

6. String getBytes

String str="韋德";
byte[] bytes = str.getBytes();

String的getBytes()方法用的是當前項目的默認編碼,如果不指定編碼,在不同的運行環境很容易被坑,所以還是根據自己的需要指定對應的編碼比較靠譜

String str="韋德";
byte[] bytes = str.getBytes("utf-8");

轉載于:https://www.cnblogs.com/zhaoguhong/p/7602899.html

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

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

相關文章

java taken_java-是否有正確的方法在slf4j中傳遞參數?

第三變種是最好的。實際上&#xff0c;第一種情況是通過StringBuilder進行的字符串連接。第二和第三種情況相同。他們需要將整數值裝箱到Integer(或其他Object)&#xff0c;然后創建一個數組來打包它們。在我的機器上進行的簡單測試表明&#xff0c;如果不執行日志記錄&#xf…

html常用小知識

請求重定向&#xff1a;加載頁面之后&#xff0c;除了用js做重定向之外&#xff0c;我們還可以直接用<meta>標簽做重定向。 1 <meta http-equiv"refresh" content"5;urlhttp://www.baidu.com" /> 5秒后跳轉 超鏈接&#xff1a;在當前的iframe…

MyEclipse快捷鍵大全【轉】

-------------------------------------MyEclipse 快捷鍵1(CTRL)-------------------------------------Ctrl1 快速修復CtrlD: 刪除當前行 CtrlQ 定位到最后編輯的地方 CtrlL 定位在某行 CtrlO 快速顯示 OutLine CtrlT 快速顯示當前類的繼承結構 CtrlW 關閉當前Editer Ct…

根據您的命令-命令設計模式

命令設計模式是一種廣為人知的設計模式&#xff0c;它屬于行為設計模式&#xff08;“四人幫”的一部分&#xff09;。 顧名思義&#xff0c;它與應用程序中的動作和事件有關。 問題陳述&#xff1a; 假設有一個網頁將在其中包含多個菜單的情況。 編寫此代碼的一種方法是使條件…

用js和jQuery做輪播圖

Javascript或jQuery做輪播圖 css樣式 <style> a{ text-decoration:none; } .naver{ width: 100%; position:relative; }.images{position:relative;width: 100%;height: 400px; } .images img{position:absolute;left: 0;top: 0;width: 100%;height: 400px;opacity: 0;fi…

w3school前端教程合集

有關前端開發的w3c教程合集。 http://caibaojian.com/w3school/ 地圖ajax教程Canvas教程CSS教程CSS3教程CSS3選擇器CSS參考手冊DHTML教程HTML教程HTML5教程HTML5音頻教程HTML DOM教程JavaScript教程jQuery教程jQuery Ajax教程jQuery事件jQuery操作jQuery選擇器jQuery遍歷json教…

【開發調試】谷歌瀏覽器中調試移動網頁和測試網速下頁面效果

、 今天有幸給大家分享一下谷歌瀏覽器針對移動網頁測試的技巧&#xff0c;主要是最近做個微信公共號網站。所以就要對頁面測試拉。移動網頁我們最長測得就是各種手機大小的頁面效果和出現網絡問題的效果展示。 今天就簡單分享下在谷歌瀏覽器測試頁面的適配和網速限制展示。…

拼多多分享好友砍價Java實現_拼多多砍價怎么分享到朋友圈 砍價發到微信朋友圈方法...

拼多多是一款電商社交的共享式購物平臺&#xff0c;現在還推出了砍價的活動&#xff0c;只要邀請好友砍價&#xff0c;你就以最低的價格購買商品&#xff0c;還可以可能是免費拿到&#xff0c;那么今天小編就給大家講講如何將自己的砍價信息分享到微信朋友圈。首先下載手機拼多…

通過6個簡單的步驟在Windows上運行Apache Hive

注意 &#xff1a;您需要安裝cygwin才能運行本教程&#xff0c;因為Hadoop&#xff08;Hive需要&#xff09;需要cygwin才能在Windows上運行。 至少&#xff0c;系統中必須存在Basic&#xff0c;Net&#xff08;OpenSSH&#xff0c;tcp_wrapper軟件包&#xff09;和與安全相關的…

vim編輯器初級(八)

:abbreviate  后面接一個縮寫&#xff0c;再接這個縮寫的全寫&#xff0c;這樣在輸入這個縮寫后&#xff0c;vim會自動將其展開為它的全寫 :abbreviate  列出目前你所設置的所有縮寫 :map  后面接一個字符串&#xff0c;再接這個字符串所映射的一串命令&#xff0c;這樣在…

java多文件post請求_如何使用Java發出多部分/表單數據POST請求?

我們使用HttpClient 4.x創建多部分文件post。更新&#xff1a;截至HttpClient 4.3&#xff0c;一些類已被棄用。下面是新API的代碼&#xff1a;CloseableHttpClient httpClient HttpClients.createDefault();HttpPost uploadFile new HttpPost("...");MultipartEnt…

vue 環境的搭建及初始化項目

其實超級簡單&#xff0c;雖然網上很多&#xff0c;但是我順便記錄下相當于做筆記吧 1nodejs 的安裝&#xff0c; 在node官網下載&#xff0c;點擊安裝&#xff0c;安裝的時候最好選擇路徑在d盤 2設置環境變量 我的電腦-->屬性-->系統環境變量- 系統變量新增一個NODE…

Java堆轉儲:您可以完成任務嗎?

如果您像我一樣對Java性能充滿熱情&#xff0c;那么堆轉儲分析對您來說應該不是一個謎。 如果是這樣&#xff0c;那么好消息是您將有機會提高您的Java故障診斷技能和JVM知識。 JVM現已發展到今天&#xff0c;與舊的JDK 1.0 – JDK 1.4天相比&#xff0c;今天生成和分析JVM堆轉…

MariaDB配置、集群

MariaDB在centos 7.3的安裝&#xff0c;配置和集群搭配 阿里云最新選配系統中&#xff0c;只有centos7.3可選&#xff0c;因此&#xff0c;基于centos 7的MariaDB的安裝&#xff0c;配置。。。 全部刪除MySQL/MariaDB MySQL 已經不再包含在 CentOS 7 的源中&#xff0c;而改用了…

java 調用 ictclas50_1-Ictclas50分詞系統ForJava

Ictclas50是一個分詞庫&#xff0c;我嘛主要用來做中文分詞&#xff0c;其也能分出詞性等東西。1.環境搭建進入到下載頁面進行下載&#xff1a;如下圖&#xff1a; 因為我的系統是64位的windows&#xff0c;所以選擇了到數第三行進行下載。其JAVA版本是通過JNI去調用dll庫&…

SpringMVC亂碼或前臺亂碼解決辦法

JSP頁面亂碼 <% page language"java" import"java.util.*" pageEncoding"UTF-8"%> 以及 form表單提交方式為必須為post 修改web.xml&#xff0c;增加編碼過濾器&#xff0c;如下&#xff08;注意&#xff0c;需要設置forceEncoding參數值…

Beam概念學習系列之Pipeline Runners

不多說&#xff0c;直接上干貨&#xff01; https://beam.apache.org/get-started/beam-overview/ 在 Beam 管道上運行引擎會根據你選擇的分布式處理引擎&#xff0c;其中兼容的 API 轉換你的 Beam 程序應用&#xff0c;讓你的 Beam 應用程序可以有效的運行在指定的分布式處理引…

使普通的舊Java OSGi兼容

盡管OSGi在Java世界中越來越流行&#xff0c;但仍有許多Java應用程序和庫尚未設計成可在OSGi中使用。 有時您可能需要在OSGi環境中運行這樣的代碼&#xff0c;或者是因為您想利用OSGi本身提供的好處&#xff0c;或者因為您需要僅由該特定環境提供的某些功能。 通常&#xff0c;…

運行 java classnotfound_JAR運行出現ClassNotFoundException異常的解決辦法

2009年10月30日最近在弄個聊天室,由于要跟數據庫通信,用到了JDBC的3個jar,在eclipse里OK的,但布置到服務器壞事了,不知道怎么弄JDBC的3個jar了寫個autoStart.batjava -jar chatServer.jarpause運行報錯:F:\mydocuments\java project\socketTest\release>java -jar chatServe…

idea 創建多模塊依賴Maven項目

轉載地址&#xff1a; http://www.cnblogs.com/tibit/p/6185704.html idea 創建多模塊依賴Maven項目 本來網上的教程還算多&#xff0c;但是本著自己有的才是自己的原則&#xff0c;還是自己寫一份的好&#xff0c;雖然可能自己也不會真的用得著。 1. 創建一個新maven項目 2.…