可能重复:
Java是"传递引用"吗?
如果我们有大byte[]数组(如40Mb),我们想用方法发送它
method(array);
Run Code Online (Sandbox Code Playgroud)
数组会被复制吗?因此,Java env => 80Mb内存将增加另外40Mb ,对吗?
如果是,我们如何在调用方法后销毁'first'数组?
如果我实例化一个对象并将其传递给一个函数,在这个函数中我将该对象赋值为null.似乎从函数返回时,对象仍然存在.
我只想知道何时分配null,会发生什么.
它可能是一个非常简单的但它仍然让我感到困惑!
import java.util.ArrayList;
public class Sample {
ArrayList<Integer> i = new ArrayList<>();
ArrayList<Integer> j = new ArrayList<>();
/**
* @param args
*/
public static void main(String[] args) {
new Sample().go();
}
private void go() {
i.add(1);
i.add(2);
i.add(3);
j=i;
i.remove(0);
System.out.println(i + "asd" + j);
}
}
Run Code Online (Sandbox Code Playgroud)
我试着打印它:
[2, 3]asd[2, 3]
Run Code Online (Sandbox Code Playgroud)
当我改变时,为什么j会改变?虽然不是原始的!
我知道,在 Java 中,参数传递是通过原始类型的值和引用类型(对象)的引用进行的。为什么在下面的例子中,我认为是引用传递参数,方法交换后没有修改对象点?
public class Swap2 {
public static void swap(Point p1, Point p2) {
Point temp = p1;
p1 = p2;
p2 = temp;
System.out.println("p1.x " + p1.x);
System.out.println("p2.x " + p2.x);
}
/**
* @param args
*/
public static void main(String[] args) {
Point p1 = new Point(100,200);
Point p2 = new Point(300,400);
//System.out.println("p1=" + p1.toString());
System.out.println("p1=" + p1);
System.out.println("p2=" + p2);
swap( p1, p2 );
System.out.println("p1.x " + p1.x);
System.out.println("p1=" + p1);
System.out.println("p2=" + p2);
}
}
Run Code Online (Sandbox Code Playgroud) java中的Arraylist有一个方法调用clear().为什么我会选择使用明确的辞职参考?
list.clear()
Run Code Online (Sandbox Code Playgroud)
VS
list = new ArrayList() ?
Run Code Online (Sandbox Code Playgroud)
看起来list.clear()会慢一点,在第二种情况下,GC会处理清理并让我们的生活更轻松吗?
public class foo {
private int a[];
private int b;
public foo(){
a = new int[] {1,2};
b= 3;
}
public int[] getA(){
return this.a;
}
public int getB(){
return this.b;
}
Run Code Online (Sandbox Code Playgroud)
我注意到可以通过访问对象来更改A的值,如下所示:
foo f = new foo();
f.getA()[0] = 5; // f.a[0] changes to 5
Run Code Online (Sandbox Code Playgroud)
但是不可能做这样的事情:
f.getB = 5; // gives error
f.getA() = new int[]{2,3}; //gives error
Run Code Online (Sandbox Code Playgroud)
谁能解释一下这是如何工作的,以及如何防止用户更改数组单元格的值?
提前致谢.
在通话时有哪些对象可用于垃圾收集System.gc()?为什么?
public class GCTest {
static class A {
private String myName;
public A(String myName) {
this.myName = myName;
}
}
public static void main(String[] args) {
A a1 = new A("a1");
A a2 = new A("a2");
ArrayList list = new ArrayList();
list.add(a1);
A[] mas = new A[2];
mas[0] = a2;
a2 = a1;
clear(mas);
a1 = null;
a2 = null;
System.gc();
// some code
...
}
private static void clear(A[] mas) {
mas = null;
}
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试在java中创建一个交换函数,但为什么这不起作用?
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
Run Code Online (Sandbox Code Playgroud) 我有一个Cell对象列表,代表棋盘类内的棋盘游戏.
Cell boardGame[][] = new Cell[8][8];
Run Code Online (Sandbox Code Playgroud)
我需要一个临时单元来尝试玩家移动他并将其与其他单元格进行比较,所以我可以使用java pass-by-value来完成它.
test(board.boardGame);
board.printBoard();
private static void test(Cell[][] boardGame) {
Cell c = new Cell((new Soldier(ChessPiece.QUEEN, Color.WHITE)), 7, 4);
boardGame[7][7] = c;
}
Run Code Online (Sandbox Code Playgroud)
我在这里读了一些关于java的帖子,但显然我还没有100%抓住它.
我希望在棋盘上只看到一个白皇后,但我看到了两个.我知道如果你传递一个引用,你可以改变它的值,但是如果我传递数组本身,它的成员将不会被修改,除非我执行一个返回.
请帮助我更好地理解这个主题.谢谢
编辑:
我认为我不明白什么时候它叫属性而哪些它没有.如果你称之为"新",我会有所不同.
当它的另一个对象的一部分称为属性对吗?但是每个对象都可以作为另一个对象的一部分创建.我可以在dog类中创建一个新字符串,然后在动物类中创建dog类,然后在另一个类中创建它.所以只有顶级类在堆栈中?
举个例子:
public class Board { //fake class
int num= 0;
public void test(int i){
i = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
在另一个班级:
public class Main {
static void outsideTest(Board board){
board.num = 1;
}
public static void main(String[] args) {
Board board = new Board();
System.out.println(board.num);
board.test(board.num); …Run Code Online (Sandbox Code Playgroud) 我有三个ArrayLists:
一个用于按照输入的顺序存储用户输入,位于主类中.
第二个与第一个完全相同,但它被传递给一个remTrip被复制的方法并返回结果.
第三个是list1在下面的代码中,这是正在处理的代码.
public static ArrayList<String> remTrip( ArrayList<String> a){
//code here
ArrayList<String> list1 = a;
Collections.sort(list1);
//code to remove triplicates from the list and returns the result
}
Run Code Online (Sandbox Code Playgroud)
我想保持第ArrayList<String>一个按照它的顺序(即{"dog", "cat" , "tiger", "cat", "cat"}),但显然是对Collections.sort()所有ArrayLists 进行排序.
我如何只对列表中的一个进行排序而不对其他列表进行排序?