日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java踩坑记

發布時間:2023/12/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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方法就未實現,當然,如果只是用做遍歷,則完全是沒問題的

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

  • ArrayList的subList方法,返回的是ArrayList中的一個內部類java.util.ArrayList.SubList
  • 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

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的java踩坑记的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。