Java参数传递

Java
最近使用Java语言实现一些服务,Java语言在传递参数时与C++不同,C++传递参数有三种格式(传值,传指针,传引用),按道理来说Java也应该有传值和传引用之分。然而,Java不同的是传递参数时,传值和引用的格式相同,没有特殊字符作为标记(C++,&)。这样就给很多程序员们带来了一定的困扰。首先请看如下代码和运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public static void main(String[] args) {
// TODO Auto-generated method stub
int n = 0;
StringBuffer sb1 = new StringBuffer("00");
StringBuffer sb2 = new StringBuffer("00");
sb3 = new StringBuffer("00");
change_int(n);
System.out.println(n);
change_String1(sb1);
System.out.println(sb1);
change_String2(sb2);
System.out.println(sb2);
change_String3(sb3);
System.out.println(sb3);
}

public static void change_int(int n) {
n = 1;
}

public static void change_String1(StringBuffer s) {
s.append("11");
}

public static void change_String2(StringBuffer s) {
s = new StringBuffer("00");
s.append("11");
}

public static void change_String3(StringBuffer s) {
s.append("33");
s = new StringBuffer("00");
s.append("11");
}

运行结果如下所示:
result
下面我们分析一下产生这样运行结果的原因。
Java在传递参数时,全部传的是引用,但是在传基本类型时,等号的赋值相当于重新声明了一个参数,比如在chang_String2函数中的StringBuffer若改成String类型,在函数内部重新赋值给String的话,运行该函数时,原来的值是不变的。
所以我们可以认为函数传入基本类型的参数时,是传的参数的拷贝,而传入一个对象时,是传入的引用。如果在函数内部对传入的引用进行更改,则原参数就会跟着变化,如果不改变传入的引用处的值,则不变,可以对比change_String2和change_String3两个函数。

Java_Entity

简介

Map是Java中的借口,Map.Entry是Map的一个内部借口。java.util.Map.Entry接口主要就是在遍历Map的时候用到。
Map提供了一些常用方法,如keySet(), entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry。它表示Map中的一个实体(一个key-value对)。接口中有getKey(), getValue()方法。

示例

1
2
3
4
5
List<ServerAddress> addrs = new ArrayList<ServerAddress>();
Set<Entry<String, Integer>> entrySet = addressMap.entrySet();
for (Entry<String, Integer> entry : entrySet) {
addrs.add(new ServerAddress(entry.getKey(), entry.getValue()));
}