国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【優雅編程之道】之數組的7點建議

2019-11-08 01:45:19
字體:
來源:轉載
供稿:網友

開心一笑

【小明喜歡上一個剛來的女同事,她是醫院里的檢驗師,為了套近乎就經常跑到她科室去倒開水喝,熟了后就發現她隨身的小包包里總放著一把小水果刀,于是我問她:你總放把小刀包里干嘛?她答道:下夜班防身啊!雖然刀小,但是我清楚的知道人的大動脈在哪里!我去!這特么以后還敢撩嗎?】

提出問題

如何優雅的使用數組???

唯美圖片

解決問題

初始化數組格式選擇

程序清單 2-1 @Testpublic void test(){ //第一種初始化數組格式 String[] a = new String[5]; //第二種初始化數組格式 String b[] = new String[5];}

通常情況下,大部分的程序員都會選擇用第一種初始化數組的格式。但我確實碰到過有少數的開發人員用第二種初始化數組格式。這里我建議使用第一種,主要原因是:大多數人都使用第一種,自然,我們也要少數服從多數。而且從字面意思來看,String[] a 表示:初始化一個字符串(String)數組([]) a,讀起來更加順口。

數組是性能調優的一大法寶

數組和集合,我們都可以簡單的理解為籃子。不同的籃子可以裝不同的東西。 對于基本類型,建議你使用數組籃子,相對于集合籃子,它效率更高。具體實例如下:

程序清單 2-1 @Testpublic void test(){ int sum = 0; //數組裝int基本類型 int[] baseTypeArray = new int[10000]; for(int i=0,len = baseTypeArray.length;i < len;i++){ //不存在自動裝箱和拆箱的操作 sum = sum + baseTypeArray[i]; } //集合裝包裝類型 List<Integer> objectTypeList = new ArrayList<>(10000); for(int i=0,len = objectTypeList.size();i < len;i++){ //在這里有自動裝箱和拆箱的操作,效率低 sum = sum + objectTypeList.get(i); }}

四種數組復制方式的性能比較和抉擇

數組copy有很多種方法,效率不一。我們先看下面具體實例:

程序清單 2-1 /** * 測試4種數組復制效率比較 * @author 阿毅 * @date 2017/2/7. */public class AyTest { PRivate static final byte[] buffer = new byte[1024*10]; static { for (int i = 0; i < buffer.length; i++) { buffer[i] = (byte) (i & 0xFF); } } private static long startTime; public static void main(String[] args) { startTime = System.nanoTime(); byte[] newBuffer = new byte[buffer.length]; for(int i=0;i<buffer.length;i++) { newBuffer[i] = buffer[i]; } calcTime("forCopy"); startTime = System.nanoTime(); byte[] newBuffer2 = buffer.clone(); calcTime("cloneCopy"); startTime = System.nanoTime(); byte[] newBuffer3 = Arrays.copyOf(buffer, buffer.length); calcTime("arraysCopyOf"); startTime = System.nanoTime(); byte[] newBuffer4 = new byte[buffer.length]; System.arraycopy(buffer, 0, newBuffer, 0, buffer.length); calcTime("systemArraycopy"); } private static void calcTime(String type) { long endTime = System.nanoTime(); System.out.println(type + " cost " +(endTime-startTime)+ " nanosecond"); }}

運行結果:

forCopy cost 711576 nanosecondcloneCopy cost 53490 nanosecondarraysCopyOf cost 119946 nanosecondsystemArraycopy cost 39712 nanosecond

多運行幾次,我們得出數組復制效率:

System.arraycopy > clone > Arrays.copyOf > for

綜上所述,當復制大量數據時,使用System.arraycopy()命令。

警惕二維數組的拷貝

因為java中沒有二維數組的概念,只有數組的數組。所以對數組的數組進行拷貝,無論對clone或者arraycopy,都只是拷貝其中的引用。事實上,還是指向同一個值。具體實例如下:

程序清單 2-1 @Testpublic void test(){ //一維數組的拷貝 int[] a = {5,2,0,1,3,1,4}; int[] b = a.clone(); b[0]=10; System.out.println(a[0] + " copy " + b[0]); //打印結果:5 copy 10 //二維數組的拷貝:{5,2,0} 和 {1,3,1,4}這兩個一維數組都有引用指向它們 int[][] c = {{5,2,0},{1,3,1,4}}; int[][] d = c.clone(); d[0][0]=10; System.out.println(c[0][0] + " coyp " + d[0][0]); //打印結果:10 coyp 10 //二維數組的拷貝:{5,2,0} 和 {1,3,1,4}這兩個一維數組都有引用指向它們 int[][] e = {{5,2,0},{1,3,1,4}}; int[][] f = {{},{}}; System.arraycopy(e, 0, f, 0, e.length); f[0][0]=10; System.out.println(e[0][0] + " coyp " + f[0][0]); //打印結果:10 coyp 10}

從上面的例子可以看出,利用clone和System.arraycopy進行二維數組的拷貝,都是淺拷貝。在真實項目中,我們要警惕使用。

數組的深復制及優雅實現

在上面的警惕二維數組的拷貝中我們已經知道,clone和System.arraycopy都是淺拷貝,下面提供一些深拷貝的優雅方法:

例:

程序清單 2-1 @Testpublic void test(){ Boy[] boys = new Boy[1]; Boy boy = new Boy("60","ay",new Girl("30","al")); boys[0] = boy; //利用org.apache.commons.lang3.SerializationUtils進行深度clone Boy[] coypBoys = (Boy[])SerializationUtils.clone(boys); //clone是淺clone //Boy[] coypBoys = boys.clone(); coypBoys[0].id = "change_60"; coypBoys[0].name = "change_ay"; coypBoys[0].girl.id = "change_girl_30"; coypBoys[0].girl.name = "change_girl_al"; for(int i=0,len = boys.length;i<len;i++){ System.out.println("the origin of id :" + boys[i].id); System.out.println("the origin of name :" + boys[i].name); System.out.println("the origin of girl id :" + boys[i].girl.id); System.out.println("the origin of girl name :" + boys[i].girl.name); } for(int i=0,len = coypBoys.length;i<len;i++){ System.out.println("the copy of id :" + coypBoys[i].id); System.out.println("the copy of name :" + coypBoys[i].name); System.out.println("the copy of girl id :" + coypBoys[i].girl.id); System.out.println("the copy of girl name :" + coypBoys[i].girl.name); }}

執行結果:

the origin of id :60the origin of name :aythe origin of girl id :30the origin of girl name :althe copy of id :change_60the copy of name :change_aythe copy of girl id :change_girl_30the copy of girl name :change_girl_al

上面例子中,我們利用 apache 提供的工具類 SerializationUtils 進行深度clone,避免重復造輪子。有一點需要注意的是,Boy 和 Girl 類都要實現 Serializable 接口。具體如下:

程序清單 2-1 class Boy implements Serializable{ public String id; public String name; public Girl girl; Boy(String id,String name,Girl girl){ this.id = id; this.name = name; this.girl = girl; }}class Girl implements Serializable{ public String id; public String name; Girl(String id,String name){ this.id = id; this.name = name; }}

我們把 //Boy[] coypBoys = boys.clone();注釋打開,運行程序,結果如下:

the origin of id :change_60the origin of name :change_aythe origin of girl id :change_girl_30the origin of girl name :change_girl_althe copy of id :change_60the copy of name :change_aythe copy of girl id :change_girl_30the copy of girl name :change_girl_al

可以證實,普通的clone只是淺拷貝而已。

一維數組替換二維數組,提高性能

在項目開發中,如果有碰到二維數組,我們要機智的把它轉化為一維數組。因為一維數組比較容易理解,而且性能會比二維數組高

@Testpublic void test(){ int arr[][] = new int[1000][1000]; long startTime = System.currentTimeMillis(); System.out.println("start time is :" + startTime); for(int i=0;i<1000;i++){ //在for循環中進行方法調用,影響性能 for(int j=0;j<arr[0].length;j++){ arr[i][j] = j; } } long endTime = System.currentTimeMillis(); System.out.println("consume time is : " + (endTime - startTime)); // -------------------------------------------------------------- startTime = System.currentTimeMillis(); System.out.println("start time is :" + startTime); //這里是重點 int len = arr[0].length; for(int i=0;i<1000;i++){ for(int j=0;j<len;j++){ arr[i][j] = j; } } endTime = System.currentTimeMillis(); System.out.println("consume time is : " + (endTime - startTime));}

運行結果:

start time is :1487563038580consume time is : 19start time is :1487563038600consume time is : 9

如果二維數組沒辦法轉化為一維數組,那么我們要極力避免在循環體內進行方法調用,如上面例子中的arr[0].length,每循環一次都會執行一次length方法,執行時長也多出10ms。因此,我們要把arr[0].length抽出來,減少方法執行次數。

考慮用集合,棧和隊列來代替數組

我們建議用集合,棧和隊列等按順序存取元素的數據結構來取代數組。在之前,我們提過:對于存放基本類型,優先選擇用數組。而對于存放其他類型的數據,我們建議用集合,棧和隊列。具體原因如下:在數組里隨機訪問就像在程序里隨機使用goto語句一樣,這樣的訪問很容易變得難以管理且容易出錯。要證明其是否正確也困難。

讀書感悟

來自山下英子《斷舍離》

斷絕不需要的東西、舍棄多余的廢物、脫離對物品的執念。斷=斷絕想要進入自己家的不需要的東西。舍=舍棄家里到處泛濫的破爛兒。離=脫離對物品的執念,處于游刃有余的自在的空間。斷舍離,就是透過整理物品了解自己,整理內心的混沌,讓人生舒適的行動技術。換句話說,就是利用收拾家里的雜物來整理內心的廢物,讓人生轉而開心的方法。要是自己能隨便湊合著用一個東西,那別人也會用隨便的態度來對待你。斷舍離的主角并不是物品,而是自己,而時間軸永遠都是現在。選擇物品的竅門,不是“能不能用”,而是“我要不要用”,這一點必須銘刻在心。不管東西有多貴,有多稀有,能夠按照自己是否需要來判斷的人才夠強大。能夠放開執念,人才能更有自信。這就是讓物品當了主角的狀態……物品原本是因為“我用”才有價值。可多數人都說“眼鏡可以用”,“筷子可以用”,拿物品當了主語。這是把主角的位子拱手讓給了物品,把焦點聚集在物品上的狀態……收納這些東西,不過是在做垃圾分類。

經典故事

【甲向乙訴苦:“上星期,一粒沙子鉆進了我妻子的眼睛,花50元請醫生才把它清理出來。”乙不屑地說:“那算得了什么,上星期,一件皮大衣入了我妻子的眼,我花費了3000元。”

永遠不要以為自己的境遇是最值得說的,你的聽眾會認為他的境遇更值得說,因為人是以自我為中心的動物。】

大神文章

【1】Thinking in Java (書籍) 【2】Agile Java(書籍) 【3】編寫高質量代碼:改善Java程序的151個建議(書籍) 【4】Java程序性能優化 讓你的Java程序更快、更穩定(書籍) 【5】Effective Java中文版 第2版.Joshua Bloch(書籍)

其他

如果有帶給你一絲絲小快樂,就讓快樂繼續傳遞下去,歡迎點贊、頂、歡迎留下寶貴的意見、多謝支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 伊春市| 深水埗区| 富锦市| 汶川县| 麟游县| 九寨沟县| 博罗县| 富川| 年辖:市辖区| 永新县| 澄江县| 兴义市| 英德市| 资中县| 靖西县| 莆田市| 北辰区| 崇左市| 清水河县| 都昌县| 新河县| 武陟县| 陇南市| 南通市| 平潭县| 谢通门县| 济阳县| 开鲁县| 惠州市| 普定县| 鹤峰县| 当阳市| 南平市| 北辰区| 孟津县| 大安市| 都江堰市| 冷水江市| 镇赉县| 马公市| 霍城县|