我在SO上经历了一些Java问题.我必须说这里的内容写得非常好,SO上的Java人员可以真正抽出答案.
但我总是找到Java人的Java答案.这本身就很棒,但我是一个Java菜鸟.所以我并不关心"类型参数方差联合联合"的运作方式.它可能很方便,但现在......它不是.
Java for a noob(来自PHP和Python)什么是cheatcodes?
如果你可以链接到一个SO答案(可能在那里但我找不到)或者写出Java与其他语言不同的东西是什么?(在基础水平上)
有些人可能称之为Java Gotchas(虽然我找不到官方的)
可能重复:
Java是否通过引用传递?
List对象是否通过引用传递?换句话说,如果我将一个ArrayList (java.util.ArrayList)对象传递给一个类,它会在我更改它时自动更新吗?
我从编译器得到的错误是"赋值的左侧必须是变量".我的用例是深度复制,但并不真正相关.
在C++中,可以分配给*this.
问题不在于如何规避任务this.这很简单,但是决定不做this变量的背后有什么理由.
原因是技术性的还是概念性的?
我的猜测到目前为止 - 在随机方法中重建Object的可能性容易出错(概念性),但技术上可行.
编辑请限制"因为Java规范如此说"的变化.我想知道决定的原因
如何在不使用第三个变量(即temp变量)的情况下在Java中交换两个字符串变量?
String a = "one"
String b = "two"
String temp = null;
temp = a;
a = b;
b = temp;
Run Code Online (Sandbox Code Playgroud)
但这里有第三个变量.我们需要消除第三个变量的使用.
提供以下代码:
class A {
Boolean b;
A easyMethod(A a){
a = null;
return a;
}
public static void main(String [] args){
A a1 = new A();
A a2 = new A();
A a3 = new A();
a3 = a1.easyMethod(a2);
a1 = null;
// Some other code
}
}
Run Code Online (Sandbox Code Playgroud)
问题是之前有多少对象符合垃圾收集的条件// Some other code.
然后正确答案是(至少那是面试官的答案):2 - 布尔值,b因为它是一个包装器和a1.
你能帮我解释一下为什么a2而a3不是垃圾收集?
后期编辑:
谢谢你的回答,我会在那之后发一些面试反馈:).
public class program1{
public static void main(String args[]){
java.util.Vector vc=new java.util.Vector();
vc.add("111");
vc.add("222");
functioncall(vc);
vc.add("333");
System.out.println(vc);
}
public static void functioncall(java.util.Vector vc){
vc=null;
}
}
Run Code Online (Sandbox Code Playgroud)
上述程序的输出为[111,222,333].但是,当我运行以下程序时,输出为[333].当我们传递引用时会感到困惑,无论是按值调用还是按引用调用,它是如何工作的?为什么
public class program1{
public static void main(String args[]){
java.util.Vector vc=new java.util.Vector();
vc.add("111");
vc.add("222");
functioncall(vc);
vc.add("333");
System.out.println(vc);
}
public static void functioncall(java.util.Vector vc){
vc.removeAllElements();
}
}
Run Code Online (Sandbox Code Playgroud) 我不了解lambda的一些事情.
String s = "Hello World";
Function<Integer, String> f = s::substring;
s = null;
System.out.println(f.apply(5));
Run Code Online (Sandbox Code Playgroud)
为什么该f.apply方法仍然有效s = null.毕竟,StringGC应该删除该对象,因为没有指向该对象的指针.
还有一件事,为什么我不需要这里的退货声明?
Function<Integer, String> f = t -> t + "";
Run Code Online (Sandbox Code Playgroud) 我有一个HashMap:
private HashMap<String, Integer> cardNumberAndCode_ = new HashMap<String, Integer>();
Run Code Online (Sandbox Code Playgroud)
后来我这样做:
Integer balance = cardNumberBalance_.get(cardNumber);
System.out.println(balance);
balance = 10;
Integer newBalance = cardNumberBalance_.get(cardNumber);
System.out.println(newBalance);
Run Code Online (Sandbox Code Playgroud)
首先它打印1000,第二次打印1000,值不变.为什么java按值而不是通过引用返回Integer?
谁有权决定?
编辑:显然我没有成功地完善我的问题.
我不是在问Java的论证是如何传递的.我知道看起来像持有对象的变量实际上是一个包含对象引用的变量,并且该引用是按值传递的.这里有很多很好的解释(在链接的线程和其他线程中)和其他地方.
问题是关于术语传递的技术含义.(结束编辑)
我不确定这是否是SO的正确问题,如果没有道歉,但我不知道更好的地方.在这里的其他问题中已经说了很多,例如Java是"传递参考"还是"传递价值"?并通过引用或通过值传递?,但我没有找到该术语含义的权威答案.
我认为"通过引用传递"意味着"将引用(通常是指针)传递给对象",因此被调用者可以修改调用者看到的对象,而"按值传递"意味着复制对象,并让被调用者玩得开心(显而易见的问题:如果对象包含引用,深层复制或浅层).
唱FW变成了很多 的 地方 说: "按引用传递"的意思只是说,这里有一些说法,这意味着更多的,但仍然定义读
一种ParameterPassing模式,其中将实际参数的引用(或者如果你想在政治上不正确,指针)传递给形式参数; 当被调用者需要形式参数时,它取消引用指针以获取它.
我没有发现许多地方给出了更强的术语定义,在这个页面上,我发现"形式参数的左值设置为实际参数的左值".并且,如果我理解正确,这里使用相同的定义("形式参数仅作为实际参数的别名.")
事实上,我发现使用更强定义的唯一地方是反对这样一种观点,即在Java中,对象是通过引用传递的(这可能是由于我缺乏google-fu).
所以,如果我把事情弄清楚,那就是通过参考传递
class Thing { ... }
void byReference(Thing object){ ... }
Thing something;
byReference(something);
Run Code Online (Sandbox Code Playgroud)
根据第一个定义大致对应(在C中)
struct RawThing { ... };
typedef RawThing *Thing;
void byReference(Thing object){
// do something
}
// ...
struct RawThing whatever = blah();
Thing something = &whatever;
byReference(something); // pass whatever by reference …Run Code Online (Sandbox Code Playgroud) java ×10
reference ×2
c# ×1
hashmap ×1
lambda ×1
list ×1
parameters ×1
string ×1
swap ×1
terminology ×1
this ×1
value-type ×1