查看: 4193| 回复: 24
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] Java问题: int[] 定义出来的东西是object,还是reference呀

🔗
匿名用户-70ATM  2021-1-16 07:39:19 |倒序浏览

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 匿名 于 2021-1-16 07:43 编辑

刚和同学刷题,leetcode 56, merge intervals


  1. class Solution {

  2.     public int[][] merge(int[][] intervals) {
  3.         
  4.         if (intervals == null | intervals[0] == null) return new int[][]{};
  5.         
  6.         ArrayList < int[] > temp = new ArrayList < > ();
  7.         PriorityQueue < int[] > pq = new PriorityQueue < > ((a, b) -> a[0] - b[0]);
  8.         
  9.         for (int[] interval: intervals) {
  10.             pq.add(interval);
  11.         }

  12.         int[] first = pq.poll();
  13.         
  14.         while (!pq.isEmpty()) {
  15.             
  16.             int[] second = pq.poll();
  17.             
  18.             if(first[1] < second[0]){
  19.             
  20.                 temp.add( first );
  21.                
  22.                 first = second;
  23.                
  24.             } else {
  25.                   
  26.                 first = new int[]{first[0], Math.max(first[1], second[1])};  
  27.             }
  28.         }
  29.         
  30.         temp.add(first);

  31.         int[][] res = new int[temp.size()][2];

  32.         for (int i = 0; i < temp.size(); i++) {

  33.             res[i] = temp.get(i);

  34.         }

  35.         return res;
  36.     }
  37. }
复制代码
[/i]


第32行,本来我写成 temp.add( new int[]{first[0], first[1]});  但后来发现,直接写成  temp.add(first) 也是可以的

所以,int[]  是一个obejct,不是一个reference吗?  

(通常来说,如果是reference的话,加进去后会被修改)


请教各位,什么时候是reference,什么时候是object?? 感谢






上一篇:一个多月刷完Leetcode SQL 准备二刷+开始刷算法
下一篇:求解200题,BFS超时
推荐
lyden999 2021-1-16 08:23:00 | 只看该作者
全局:
int[]是一个array object,所有的object的name都是引用,就是所谓的reference,所以不存在“什么时候是reference,什么时候是object”的说法

评分

参与人数 3大米 +3 收起 理由
JFreeman + 1 赞一个
ysz951 + 1 赞一个
14417335 + 1

查看全部评分

回复

使用道具 举报

推荐
Pizi-G 2021-1-16 14:11:37 | 只看该作者
全局:
我觉得你可能吧 object vs reference 想成了 C/cpp 的 变量 vs 指针了

如果你按 "变量 vs 指针" 想, 那肯定觉得奇怪了, "怎么可能我可以往一个指针上 .add() "

Java 里没有指针. reference 也不是指针的意思. 虽然在内部概念上有重合. 是指向了一个内存里的一个位置. 但是 reference 就是直接拿到那个 object. 不是说 java 里存在一种叫 object 的东西, 一种叫 reference 的东西. 而是 java 里你用的任何 object 都是 reference (相对于任何的 primary types 都是值 - 不是 reference). 比如下边例子:

pt1 = new Point(100, 100);
pt2 = pt1;  // 因为 object 是 reference, 所以这时 pt1 和 pt2 就是指向同一个 object
pt1.x = 200;  // 这时 pt2.x 也变成了 200

但是不是 reference 的情况 - primary types 就是
String a = "aaa";
String b = a;
b = "bbb";
System.out.println(a);  // 还是 aaa

评分

参与人数 4大米 +5 收起 理由
gyroid + 1 赞一个
ysz951 + 1 赞一个
ericwxr + 1 赞一个
JoshuaSu + 2 给你点个赞!

查看全部评分

回复

使用道具 举报

推荐
frankzhr 2021-1-20 08:43:01 | 只看该作者
全局:
In general, int[] array = new ArrayList<>(); 等号左边array可以理解成一个指针,存储在stack上,这个东西指向(refer to)等号右边的ArrayList这个Object, which is stored in Heap
回复

使用道具 举报

全局:
看你有没有new
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-70ATM  2021-1-16 08:11:38

如果new了,就是reference吗?
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-70ATM  2021-1-16 08:12:22

如果new了,就是reference对吗?
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-70ATM  2021-1-16 09:25:07
lyden999 发表于 2021-1-16 08:23
int[]是一个array object,所有的object的name都是引用,就是所谓的reference,所以不存在“什么时候是refe ...

那为啥我这里32行,可以加reference???
回复

使用道具 举报

🔗
tachy_9 2021-1-16 09:52:14 | 只看该作者
全局:
我印象里的Java内存模型解释应该是
你的first是array object的reference,array object本身存在堆里,first这个变量是存在栈里
你的想法是没错的,你的temp里的int[]因为是引用,所以类似first[0]=0,这种操作会改变temp里int array的element的值,但不会改变这个array本身(比如说array的长度,这个Java要求在定义的时候必须确定)
你的32行是把一个array的reference加到arraylist<int[]>里了
实际上楼上说的也对,Java因为不存在指针,而且所有东西都是object,所以你看到的一切变量只有两种:基本类型和对象的引用
回复

使用道具 举报

全局:
不明白楼主的问题,楼主指的object是什么?non-primitive类型,object不就是reference么。int[]是non-primitive,内存分配在栈里。
回复

使用道具 举报

地里匿名用户
🔗
匿名用户-70ATM  2021-1-16 11:09:44
tachy_9 发表于 2021-1-16 09:52
我印象里的Java内存模型解释应该是
你的first是array object的reference,array object本身存在堆里,firs ...

感谢同学。

“你的32行是把一个array的reference加到arraylist<int[]>里了”   --》 是的,我就这么想的,但是为何后面不会被后面改动,答案是对的?
回复

使用道具 举报

🔗
bzoot 2021-1-16 12:20:43 | 只看该作者
全局:
你的问题是不是`temp.add(first)`之后再修改`first`不会影响`temp`?
因为temp有自己的内存,`temp.add(first)`会影响`temp`的内存,但是无论什么时候操作`first`都不会影响`temp`。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表