黑马程序员技术交流社区

标题: 数组问题 [打印本页]

作者: (_演绎、青春    时间: 2014-5-26 12:03
标题: 数组问题
本帖最后由 (_演绎、青春 于 2014-5-26 12:19 编辑

int [ ] arr = new int [ ] {3,1,6,8,2,5};
int [ ] arr = {3,1,6,8,2,5};

它们两个是不是一个意思啊,一个性质啊?都是在堆内存里面建立的?
省去new int [ ]也可以的吗?
作者: 夏日蓝雪    时间: 2014-5-26 14:56
两个表达式创建的实体都是在堆里,它们的区别如下:
int [ ] arr = new int [ ] {3,1,6,8,2,5};//在堆内存中重新开辟一块空间
int [ ] arr = {3,1,6,8,2,5};//虚拟机先查找有没有{3,1,6,8,2,5}这个实体,有,则arr直接指向实体,没有,则重新创建实体。
作者: 张辉玉    时间: 2014-5-26 15:11
楼上说的很对
作者: code2014    时间: 2014-5-26 15:51
学习学习~~
作者: 向前看向前走    时间: 2014-5-26 16:01
夏日蓝雪 发表于 2014-5-26 14:56
两个表达式创建的实体都是在堆里,它们的区别如下:
int [ ] arr = new int [ ] {3,1,6,8,2,5};//在堆内存 ...


应该是一样的,怎么可能去查找实体,数组创建分配空间,都是新建的空间,难道有其它数组也是这个值,它们两个会指向同一个分配空间
   只是写法的不同而己
作者: 夏日蓝雪    时间: 2014-5-27 17:59
本帖最后由 夏日蓝雪 于 2014-5-27 18:01 编辑
向前看向前走 发表于 2014-5-26 16:01
应该是一样的,怎么可能去查找实体,数组创建分配空间,都是新建的空间,难道有其它数组也是这个值,它们 ...

这个问题应该类同于 String str="abc"与 String str1=new String("abc")的区别吧?String类也相当于数组,而有没有new这一关键字,最主要区别就体现在是否在堆区重新创建了实体。是不是?
作者: (_演绎、青春    时间: 2014-5-27 19:36
夏日蓝雪 发表于 2014-5-27 17:59
这个问题应该类同于 String str="abc"与 String str1=new String("abc")的区别吧?String类也相当于数组, ...

我还没看到你说的那呢 呵呵
作者: Jero    时间: 2014-5-27 19:40
2楼对java理解很透彻。学习了。
作者: 夏日蓝雪    时间: 2014-5-27 19:47
(_演绎、青春 发表于 2014-5-27 19:36
我还没看到你说的那呢 呵呵

nothing,共同努力,共同进步!
作者: yinxjfly    时间: 2014-5-27 19:56
学习了!
作者: (_演绎、青春    时间: 2014-5-28 16:26
夏日蓝雪 发表于 2014-5-27 19:47
nothing,共同努力,共同进步!

:handshake:loveliness:
作者: 汤姆纳斯    时间: 2014-5-28 20:28
学习了,正在学数组。
作者: lin'    时间: 2014-5-29 09:01
可以的,创建数组有可以创建时赋值的方式也有不赋值的方式,创建时赋值new int(strinag)可以默认不写,写了也是一样
作者: ↘ふ紫铯幽夢    时间: 2014-5-29 09:20
int[] arr={1,2,3,4}这中方式只适用于数组的初始化,也就是说当你写了int[] arr={1,2,3,4}后,在写arr={2,4,6,8}后就会报错。而 int [] arr = new int[]{}这种方式不会。
作者: EDDY_Liang    时间: 2014-5-29 09:36
夏日蓝雪 发表于 2014-5-26 14:56
两个表达式创建的实体都是在堆里,它们的区别如下:
int [ ] arr = new int [ ] {3,1,6,8,2,5};//在堆内存 ...

int [ ] arr = new int [ ] {3,1,6,8,2,5};
虚拟机先查找有没有{3,1,6,8,2,5}这个实体,有,则arr直接指向实体,没有,则重新创建实体。
还有这一层含义的吗??毕老师怎么没说过啊??
作者: 27ZJQ    时间: 2014-5-30 17:12
2楼说的到底对不对?
作者: 邵景伦    时间: 2014-5-30 17:45
int [ ] arr = new int [ ] {3,1,6,8,2,5};//在栈内存中开辟空间存放变量arr,在堆内存中开辟空间分配首地址,并创建连续区间,初始化。首地址赋值给arr
int [ ] arr = {3,1,6,8,2,5};//在常量池中存放{3,1,6,8,2,5},在栈内存中开辟空间存放变量arr,初始化。首地址赋值给arr
作者: 黄梁梦想享    时间: 2014-5-30 23:35
常量池这概念还没到,我是该信2楼的初级黑马还是相信17楼的中级黑马呢?
作者: chenzhiyuan    时间: 2014-6-3 13:30
夏日蓝雪 发表于 2014-5-26 14:56
两个表达式创建的实体都是在堆里,它们的区别如下:
int [ ] arr = new int [ ] {3,1,6,8,2,5};//在堆内存 ...

学习了。。。。
作者: 汤姆纳斯    时间: 2014-6-3 14:28
学习了。
作者: blackstones1    时间: 2014-6-3 15:08
还好 不知道谁对谁错

作者: 玉冰竹    时间: 2014-6-3 15:14
学习了,刚开始我也以为是一样的,看了二楼的解释想通了。
作者: 郝义涛    时间: 2014-6-3 15:24
这么跟你说,String a = "abcd"; 和String a = new String("abcd"); ,,这和你说的性质是一样的,如果不new,String先会从常量池中找是否有“abcd”,若有,则指向他,若没有,建立一个,而对于new,则是在堆中从新建立一个abcd的内存区。
希望对你有所帮助!
作者: 、海    时间: 2014-6-3 22:11
两个是一样的,写法不同而已。
作者: (_演绎、青春    时间: 2014-6-5 16:28
x923601616 发表于 2014-6-3 14:06
java的悖论 java建立的时候 想做成一切皆对象的(这点c#做到了)
但是又继承了很多面向过程的语法 比如int类 ...

很透彻,谢哥们儿:handshake
作者: 谭荣强    时间: 2014-6-10 21:27
好多细节都是新手发现的
作者: 夏日蓝雪    时间: 2014-6-12 17:27
亲自试验了一下,代码如下:

class Practise
   {
   public static void main(String[] args)
   {
           int [] arr = new int[]{3,1,6,8,2,5};
           int [] arr1 ={3,1,6,8,2,5};
           System.out.println(arr.equals(arr1));//结果false
          
           String[] aa=new String[]{"aa","bb","cc"};
           String[] bb={"aa","bb","cc"};
           System.out.println(aa.equals(bb));//结果false
          
           String a="abc";
           String b=new String("abc");
           String c=new String("abc");
           System.out.println(a==b);//结果false
           System.out.println(a.equals(b));//结果true
           System.out.println(b.equals(c));//结果true
           System.out.println(a.equals(c));//结果true
   }
   }
    实验证明,String类是一个特殊的类,只有它存在我在二楼解释的区别;
而其他类即使是字符类型的数组也没有区别,只是写法上的不同而已。
    确实是我理解有误,在这里向所有被我误导的同胞们道歉,同时要感谢不一样的颜色对我的点评,才让我发现自己对知识理解的错误。

作者: 夏日蓝雪    时间: 2014-6-12 17:30
chenzhiyuan 发表于 2014-6-3 13:30
学习了。。。。

sorry,关于数组的一个小问题,我的回答有误,请重新看一下28楼的解释。
作者: 夏日蓝雪    时间: 2014-6-12 17:31
Jero 发表于 2014-5-27 19:40
2楼对java理解很透彻。学习了。

sorry,关于数组的一个小问题,我的回答有误,请重新看一下28楼的解释。
作者: Super__kids    时间: 2014-6-12 18:02
最后一个问题是:可以。他们两是同样的内容,但是存储的位置不一样。一个存new的地址,一个存实体
作者: alive    时间: 2014-6-12 22:41
C:\Users\Administrator\Desktop\QQ截图20140612223734.png
空间地址不一样,所以说是两个对象,不会到堆里去找有没有实体
作者: (_演绎、青春    时间: 2014-6-14 23:26
夏日蓝雪 发表于 2014-6-12 17:31
sorry,关于数组的一个小问题,我的回答有误,请重新看一下28楼的解释。

谢谢你。解答太完美了:handshake
作者: 夏日蓝雪    时间: 2014-6-14 23:33
(_演绎、青春 发表于 2014-6-14 23:26
谢谢你。解答太完美了

:handshake,不客气。
作者: 钟翠翠    时间: 2014-6-27 17:24
越看越糊涂了 谁的答案是正确的呀
作者: 那片天空    时间: 2014-6-27 17:58
学习下,看看涉及到什么样的问题才给技术分

作者: 苏-L-w    时间: 2014-7-1 21:17
    学习了!
作者: rekirt    时间: 2014-7-1 22:17
出现new字应该是创建对象了,没有new应该不是创建对象的,具体不清楚。。
作者: 双皮奶    时间: 2014-7-19 10:31
被整死了
作者: 静水流华    时间: 2014-8-31 20:49
夏日蓝雪 发表于 2014-5-26 14:56
两个表达式创建的实体都是在堆里,它们的区别如下:
int [ ] arr = new int [ ] {3,1,6,8,2,5};//在堆内存 ...

直观些看,System.out.println(arr);System.out.println(arr1);会发现打印的哈希值是不一样的
作者: 王成萌    时间: 2014-12-4 20:22
int[] a=new int[] {2,3,4,5,6}和int [] a1= {2,3,4,5,6} 区别其实是:第一个其实在内存中开辟了两个空间即是指向了两个对象,第二个只指向了一个对象,和字符串String类似,String b="abc"   String c=new String("abc");所以用a.equals(a1)会返回false,但是在字符串中用b.equals(c)会返回true是因为在String类中已经重新定义了Object类中的equals()方法,比较的是其中的值而不是地址了。(参考)
作者: 青衫禅客    时间: 2014-12-14 00:08
夏日蓝雪 发表于 2014-6-12 17:27
亲自试验了一下,代码如下:

class Practise

是因为String类中的equals方法是被覆写过的
作者: 励志Java_鸿政    时间: 2015-1-10 11:13
学习了,这样的帖子恨有价值
作者: DxxD    时间: 2015-3-9 10:14
夏日蓝雪 发表于 2014-6-12 17:27
亲自试验了一下,代码如下:

class Practise

学习了。。。。谢谢
作者: 严晗哲    时间: 2015-5-14 23:21
int[] arr = int[]{2,3,4,5,6}:在堆内存中先开辟了一个空间,然后这个空间有个默认的长度值,在读取后面{}中的内容,给数组长度重新赋值。

int[] arr = {2,3,4,5,6}:在同样堆内存中开辟一个空间,但是直接就把长度赋值为5
不知道对不对?

作者: 307323665    时间: 2015-5-26 18:44
夏日蓝雪 发表于 2014-5-27 17:59
这个问题应该类同于 String str="abc"与 String str1=new String("abc")的区别吧?String类也相当于数组, ...

String str="abc"其实就等于  String str=new String("abc");   str对象一旦创建,就会在推内存中有个“abc”当你下次再去  str1 =new String("abc")的时候,其实就只是把  内存中已经有的abc的内存地址的引用给了str1




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2