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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

关于java数组拷贝的性能

發布時間:2024/1/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于java数组拷贝的性能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java 提供的System.arrayCopy()方法比自己寫的數組copy要快.

查看其源代碼:

  • public?static?native?void?arraycopy(Object?src,??int??srcPos,
  • ????????????????????????????????????????Object?dest,?int?destPos,
  • ????????????????????????????????????????int?length);
  • 可以看到被定義為native方法...速度比自己寫的普通方法要快.

    ?

    在jdk1.6中加入了新的數組拷貝方法.Arrays.copyOfRange().

    其源代碼:

  • ?public?static?byte[]?copyOfRange(byte[]?original,?int?from,?int?to)?{
  • ????????int?newLength?=?to?-?from;
  • ????????if?(newLength?<?0)
  • ????????????throw?new?IllegalArgumentException(from?+?"?>?"?+?to);
  • ????????byte[]?copy?=?new?byte[newLength];
  • ????????System.arraycopy(original,?from,?copy,?0,
  • ?????????????????????????Math.min(original.length?-?from,?newLength));
  • ????????return?copy;
  • ????}
  • ?

    其實就是System.arraycopy..暈死.

    ?

    別為做的測試:

  • /*******************************************************************************
  • ?*
  • ?*?比較賦值與System.arraycopy誰快
  • ?*
  • ?*?復制的內容越多,System.arraycopy優勢更明顯
  • ?*
  • ?*?Author:?Java
  • ?*
  • ?*?Modified:?2007.09.16
  • ?*
  • ?******************************************************************************/
  • public?final?class?WhoFaster
  • {
  • ??public?static?void?main(?String[]?args?)
  • ??{
  • ????/*/
  • ????int?begin=100;?
  • ????int?length=12;?
  • ????String?temp="12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"黑客帝國忍者神龜變形金剛"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890";?
  • ????int?times=10000000;??//千萬
  • ????/*/
  • ????int?begin=100;?
  • ????int?length=120;?
  • ????String?temp="12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"黑客帝國忍者神龜變形金剛"
  • ???????????????+"黑客帝國忍者神龜變形金剛"
  • ???????????????+"黑客帝國忍者神龜變形金剛"
  • ???????????????+"黑客帝國忍者神龜變形金剛"
  • ???????????????+"黑客帝國忍者神龜變形金剛"
  • ???????????????+"黑客帝國忍者神龜變形金剛"
  • ???????????????+"黑客帝國忍者神龜變形金剛"
  • ???????????????+"黑客帝國忍者神龜變形金剛"
  • ???????????????+"黑客帝國忍者神龜變形金剛"
  • ???????????????+"黑客帝國忍者神龜變形金剛"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890"
  • ???????????????+"12345678901234567890";?
  • ????int?times=1000000;??//百萬
  • ????//*/?
  • ????char[]?oldArray=temp.toCharArray();?
  • ????char[]?newArray=null;?
  • ????long?start=0L;?
  • ????
  • ????//
  • ????//?單純賦值
  • ????//
  • ????
  • ????newArray=new?char[length];?
  • ????start=System.currentTimeMillis();?
  • ????for(?int?i=0;?i<times;?i++?)
  • ???????{
  • ?????????for(?int?j=0;?j<length;?j++?)
  • ????????????{
  • ??????????????newArray[j]=oldArray[begin+j];
  • ????????????}
  • ???????}?
  • ????System.out.println(?new?String(?newArray?)+" "+(?System.currentTimeMillis()-start?)?);?
  • ????
  • ????//
  • ????//?System.arraycopy
  • ????//
  • ????
  • ????newArray=new?char[length];?
  • ????start=System.currentTimeMillis();?
  • ????for(?int?i=0;?i<times;?i++?)
  • ???????{
  • ?????????System.arraycopy(?oldArray,?begin,?newArray,?0,?length?);
  • ???????}?
  • ????System.out.println(?new?String(?newArray?)+" "+(?System.currentTimeMillis()-start?)?);
  • ??}
  • }?
  • ?

    其結論:

    在第一種情況,循環千萬,一個900,一個1000,兩者相差100毫秒

    第二種情況就拉大了,循環千萬,一個6700,一個2200,相差4500毫秒

    為防止JVM將字符數組作為常量保存在內存中,我分別屏蔽運行,效果一樣。

    也就是說,對于很短的字符串復制,單純賦值略快,可以忽略

    對于很長的字符串復制,用單純賦值就是臟代碼

    總結

    以上是生活随笔為你收集整理的关于java数组拷贝的性能的全部內容,希望文章能夠幫你解決所遇到的問題。

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