java的数组下标:    Array[<indexx>]这个<index>是int类型的,我试过用long型表示下标:
    char array[] = new array[10];
    long i = 1;
    array[i] = '\n';
根本通不过编译,我觉得这样的设计太不行了,因为我用来表示长度、大小的全是long型,但是坑爹的java只允许int表示下标,我表示...C/C++就真的自由,公司需要Java我才学的Java,不料这么...我想大家肯定会跟我说为什么要用long表示,int就够了。
我想说,long表示下标我都觉得不够,动辄上亿的数据量,以TB、PB、为单位的数据量,int能用个鬼。
别觉得不切实际,以后大家的硬盘、内存的容量不知道会大到什么程度,存储啊、用于分析什么什么的需要的容量更是天文数字,CPU的单位也进入64了,我估计128、512也不远了。int21亿的表示范围已经不够用了。问大家有没有什么能编译器支持long表示下标的选项什么的,有什么方法能让long表示下标的都行,谢谢大家了。

解决方案 »

  1.   

    你一下要查询出这么多数据 可以 估计jdk当时考虑性能的问题 不会让数据会很大吧
    换list吧
      

  2.   

     你可以把数组改成列表。就像你说的数据很大,数组用起来不算好吧。你定义数组的时候要定义长度。即使你用了动态改变数组长度的语句(我不建议用)也会很消耗内存。你可以用HashMap<key,values>这种方式。
    在JDK中集成了许多在这个散列表中增,删,改,查的方法。用起来很方便。比数组的便利好多了。
      

  3.   

    int java.lang.Integer.MAX_VALUE = 2147483647 [0x7fffffff]A constant holding the maximum value an int can have, 231-1.我想说,long表示下标我都觉得不够,动辄上亿的数据量,以TB、PB、为单位的数据量,int能用个鬼。Integer最大值是21多亿,你觉得对于数组还不够用么?
    就算你用C++,就算有上亿的数据就算你有这样的需求,你会把21多亿的数据一次性加载到内存里面来处理吗?
      

  4.   

    你为啥用数组呢,list完全可以么。要不lz就自己写个容器,用n个数组表示。
      

  5.   

    君子善假于物也。而这个基础是你必须先认识清楚这些“物”。以楼主所说情形,你是这个基本功还没做好。无论你是用C++还是JAVA,这都是没什么可辩驳的。相反,你用C++的东西来套在JAVA上,那就是你自己的不对了,不是吗。
      

  6.   

    List底层也是用数据来实现的噢。
    所以最大索引值和数组是一样的。
      

  7.   

    老兄,不要老想着用数组,java的特性那么多,比如说用集合啊,方便的多啊……随便的存多少
      

  8.   

    java开发中很少用数组的,一般用对象的形式比较好
      

  9.   

    long下标都不够你还用数组!!
      

  10.   

    楼上很多说用List,是指LinkedList或其他的,不是ArrayList吧。
      

  11.   


    const int64_t i64=2222222222222L;
        char cs[i64];
    C/C++表示,一样不行。
    有的编译器可能能编译过去,但运行出错。
      

  12.   

    顺便和楼主说一句:32位系统下,C/C++的long和int是一样长地,一般来说C的数组下标也是int。
      

  13.   

    楼上有人说List的,应该最看一下List的API。
    E get(int index)
      

  14.   

    各有所用,lz你选择错了。java中对集合分的较细的 array只能用来承载小数据量的集合,大的用集合类了:List、Set、Map...
    根据使用场景合理选择。
      

  15.   

    还是有些人不明白,说什么何必用数组或者何必搞这么大的数组,还谈到性能问题。我来回答:1.不要迷信Java的封装,说白了还是char *array;之类的。列表?集合类?
      NO,这些封装真正要用时,根本没用。一般来说,像每秒上亿条数据查询、
      排序TB级的数据,这么大的数据量分析、查询本来应该是要用C的,但是
      因为要适应Linux/Unix/M$多种平台,所以才用Java。Java的性能我其实是
      看好的。但是这个下标问题让人蛋疼。真的,C的灵活性非常舒服,Java满
      地的类/对象/封装。类最大的缺点就是用无法表达现实世界的面向对象来强
      制开发者面向对象(你知道一个类改一点能影响多少地方吗)
      数组就是个例子,别提什么列表/集合,都是一层层的封装,没区别,线性/非线性
      而已。Java固定了int的大小,long各个数据类型的范围,不过这么重要的
      数组却载在int上面,狠狠的抽了我一脸。2.小则百万,大则千亿这就是目前的数据量,请大家看远一点,无论如何,
      Java把数组大小固定在int(21亿)我觉得非常不妥。3.有些超高要求的应用,必须面临内存划分,只有数组是最理想的,静态数组
      效率最高。完了,说着说着我都不知道自己在扯什么东西了
      

  16.   


    面向对象和封装从来不是给你做提升运行效率的,任何的封装只会降低那么一点效率,换来的是代码的可读和安全性,你这动辄要开几个G内存的东西还是用C实现吧,不过我也很想问一个数组就开这么大,用C做海量数据分析的程序员都是这么干的么?一下子开个T级别的数组?没认真研究过Java就这里嚷嚷……
      

  17.   

    这不是在误导人么?
    你认为List,Set,Map能承载多大?楼主已经明确的说了,Int的最大值都满足不了的数组。
    你认为List,Set,Map可以满足吗?
    你回去看看。
    List get
          size 这些方法需要什么,会返回什么。
      

  18.   

     
    您在大型机上写代码吗?一次开TB数组? 把这段话放C 区也让人笑话。
      

  19.   

    谁说是一个数组了,我从头到尾没说用一个数组装,我只是对Java的数组下标不能用long表示感到很无奈
      

  20.   

    另外,我向广大C程序员表示对不起,影响了你们的声誉。
    我表示我的言语不代表C程序员的观点。我的问题只是“Java的[数组下标]不能用long型变量表示”
      

  21.   

    LZ,入乡随俗吧。毕竟是32位机,int是32位的,已经尽力了。如果再加大,实现起来代价可能是相当惊人的,否则java的设计者不会放着long不用而只选int的。你想想,仅用于下标就要占用8个字节,寄存器就要用两个,再加数据访问的消耗,这是什么概念?
      

  22.   


    蛋疼
    想当喷子也得掂量掂量自己
    既然不是一个数组,每个数组中你也存不到21亿个元素,追求用long坐下标有什么用,
    就算让你用long坐下标,你用得着么,你用long做下标本来是你的毛病,不管什么语言,
      

  23.   

    “,动辄上亿的数据量,以TB、PB、为单位的数据量”,关键是你需要一下子把这么多数据都放到内存里吗?
      

  24.   

    数组是连续分配的内存,对于32位系统,寻址的限制,操作系统可以分配给JVM堆的连续内存<2G, 实际数值要更小一些,所以JVM的数组使用int已经足够用了,当然64位系统可以分配更大的堆。像楼上说的多维数组也可以。但我觉得如果真的需要那么大的数组,还是要重新衡量一下架构方案,就算是操作系统,分配连续大内存也是一个重量级的操作,可以想象各种挪腾
      

  25.   

    最近经常换语言,最重要的一个体会就是,不要轻易使用一种语言的思想一成不变地指导另一种语言的学习与开发,每种语言都有自己的思想比如:
    c++的异常机制是鸡肋,但在java中异常机制是普遍使用的重要的机制
    java一贯使用继承,而c#更多使用组合代替继承
    ...
      

  26.   

    呵呵~自己看吧 http://topic.csdn.net/u/20110909/22/b78a8691-abdc-46c6-8bd3-e5bdcf433448.html其中最核心的
      

  27.   


    我想说的是:
    首先,楼主先做一个确定,在你当前使用的机器,linux吧,分配一个2^63-1个元素的数组并给最后一个元素赋值,看看结果其次,借用上面连接的一句话,“难道我要处理1TB的数据就要用1TB的内存吗?”naive啊!任何语言的入门级别的人都喜欢这么干,根本不懂算法
      

  28.   

    char类型只能存储一个字符!‘\n’在这个里面,java会作为两个字符看待的!这个跟string,在string
    ‘\n’是一个转义字符,最后作一个字符处理!
      

  29.   

    我说的和算法无关,别扯。这只是个数组下标问题而已。谁会蛋疼的建一个大型数组。long i;
    byte a = new a[100];
    a[i] = 'a';这段给我通过都行啊,就是这么限制。
    自动把i转成int都行啊反正又没溢出。我都习惯用long不用int了,不管是下标还是什么,或许是强迫症吧,
    又或者单纯的看int不爽?楼主2?
      

  30.   

    http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.13
    写着:
    The index expression undergoes unary numeric promotion (§); the promoted type must be int.然后LZ就开始想怎么滴把i自动从long转成int了,,,,
      

  31.   

    然后问题是,既然你不建大数组,用long做下标干嘛?
      

  32.   

    可能真是单纯的看int不爽,强迫症吧..
    我用的整形变量是都是long...
      

  33.   

    C语言的 long型是占4个字节吧,java里的int型也是占4个字节,long型就8个字节了,貌似好像是这样
      

  34.   

    为什么大家都建议他用list呢?我真不理解,为什么数组要用long呢?你们觉得内存很大么,可以随便使用么?难道不觉得当你的下标超过int能够表示的范围的时候,难道不会内存溢出么?我也真不知道,楼主什么样的业务会有这样的要求,难道你启动jvm的时候,内存都是上G的还是上T的么?我虽然不知道你用C/C++的时候为什么要使用这么大的内存,但是这个需求本身就是有问题的。
      

  35.   

    我也并不是要弄这么大的数组,只是单纯的想用long型变量来表示下标而已...
    这是一个很无聊的吐槽。。
      

  36.   


    是啊,挺无聊的,我不过是看你说动则GB或者TB的数据量,然后跟数组的下标联系起来,然后说Int不够用,我才吐着个曹的。其实我可以理解,你可能没有真正处理过大数据量以及高并发的问题才这么说的。
    还有,内存无论怎么发展,无论变得多大,总是不够用的,因为相应的,到了那个时候程序本身也会随着变得巨大起来。更何况,int的位宽也会随着将来的发展而改变,也许以后int就会变成64位或者128位了,不过那是以后的事情了。
    还有pc的发展不会像你想象的那么快的,16到32 32到64 每次位宽的提升,差不多都用了10年的时间,我想64到128,差不多也要这么多时间,并不是说硬件生产商没有那种技术,而是为此位宽的提升都意味着要抛弃之前位宽的程序,对于新位宽的支持,必须重新开发编译器和软件(至少要重新编译),而且现在已经有128位的处理芯片,只不过在专业的平台上。
      

  37.   

    为什么不建议用List,因为如果int下标不满足楼主的需求,其实List也肯定满足不了。就比如List取值,size,get方法都是用的Int,呵呵。那也就是List所存的数据也不可以超过int的上限。
    不知道我这样理解有没有问题。当然我要在喷一下,只是因为单纯的想要用long而来这吐,没有理由的浪费内存,这种程序员实在太扯了。