免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2495 | 回复: 3
打印 上一主题 下一主题

Arrays源码理解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-15 21:37 |只看该作者 |倒序浏览
Arrays源码理解



1.equals


Java代码
  1. public static boolean equals(int[] a, int[] a2){
  2.         if (a==a2)
  3.             return true;
  4.         if (a==null || a2==null)
  5.             return false;
  6.         int length = a.length;
  7.         if (a2.length != length)
  8.             return false;
  9.         for (int i=0; i<length; i++)
  10.             if (a[i] != a2[i])
  11.                 return false;
  12.         return true;
  13.     }
复制代码
先判断a和a2是否为统一个变量,再判断非空、长度,再挨个比较。char[] byte[] long[] short[] 都是这样比较的
    Object[]     利用 o1.equals(o2)
    float[]        利用 (Float.floatToIntBits(a)!=Float.floatToIntBits(a2),各自将小数生成一个int型的数字,然后比较。这个我很奇怪为什么不直接用==比较,直接比较也可以出结果??
    double[]     利用 (Double.doubleToLongBits(a)!=Double.doubleToLongBits(a2)),将小数装便成long型数字比较,同样奇怪??

2.fill
     public static void fill(int[] a, int fromIndex, int toIndex, int val)
     先检查a的长度,起点和终点越界的问题。有问题报错。
     遍历复制
     boolean,double,float,Object,byte,char,short,long 都一模一样

3.copyOf
      public static int[] copyOf(int[] original, int newLength)
      先新建一个newLength的数组,再利用 System.arraycopy复制,复制的位置从0到Math.min(original.length, newLength)
      byte,short,long,char,float,double,boolean

4.二分查找binarySearch


Java代码
  1. private static int binarySearch0(int[] a, int fromIndex, int toIndex,int key) {
  2.     int low = fromIndex;
  3.     int high = toIndex - 1;

  4.     while (low <= high) {
  5.         int mid = (low + high) >>> 1;
  6.         int midVal = a[mid];

  7.         if (midVal < key)
  8.         low = mid + 1;
  9.         else if (midVal > key)
  10.         high = mid - 1;
  11.         else
  12.         return mid; // key found
  13.     }
  14.     return -(low + 1);  // key not found.
  15. }
复制代码
这个移位很有特色,本来我怀疑low+high会超出范围,但是0111 1111 1111 1111 + 0111 1111 1111 1111 = 1111 1111 1111 1110 无符号移位 0111 1111 1111 1111,结果正好正确。,当然,如果写成int sum =(low+high); int midVal=sum>>>1.就错了。

    对了,这个方法只能查有序的数组,无序的查不到。

5.sort()  
    看了一会没看懂,网上说:int,float等原型数据的数组采用快速排序,对Object对象数组采用归并排序 。所以等到时总结排序的时候一起理解一下。

论坛徽章:
0
2 [报告]
发表于 2011-08-24 17:30 |只看该作者
本帖最后由 ppk1984 于 2011-08-24 17:35 编辑

浮点数IEEE754-1985的标准规定float和double这样进行比较,java浮点数采用的此标准。
二分查找的前提就是集合已经排序。

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
3 [报告]
发表于 2011-08-26 12:14 |只看该作者
谢谢。

论坛徽章:
0
4 [报告]
发表于 2011-08-30 19:48 |只看该作者
回复 1# 三里屯摇滚


    由于计算机内部的浮点数是由二进制的负次方拼合得到,因此属于不绝对准确的数据,一般要通过判断差值在小范围之内或者转化为标准整数来进行比较的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP