java操作符与引用

1.java引用

java的函数调用与C的方式不一样,C语言默认的是传值操作,这样对于没有经验的程序员来说,他们编写的代码在调用函数的时候会进行对象值复制,有些不必要的这样做的时候会降低程序的效率,java默认的是传引用,下面的代码说明这一点:
public class MyClass {
	int i;
}
public static void fun(MyClass myClass){
		myClass.i = 10;
	}
	
	public static void main(String[] args) {
		MyClass myClass = new MyClass();
		myClass.i = 100;
		System.out.println("输入函数之前的myClass,i: " + myClass.i);
		fun(myClass);
		System.out.println("输入函数之后的myClass,i: " + myClass.i);
	}
在函数里面改变了对象的属性,外面也跟着改变了,猜猜下面代码的输出:
	public static void fun(MyClass myClass){
		myClass.i = 10;
	}
	public static void fun0(MyClass myClass){
		myClass = new MyClass();
		myClass.i = 10;
	}
	public static void main(String[] args) {
		MyClass myClass = new MyClass();
		myClass.i = 100;
		System.out.println("输入函数之前的myClass,i: " + myClass.i);
		fun(myClass);
		System.out.println("输入函数之后的myClass,i: " + myClass.i);
		myClass.i = 100;
		System.out.println("输入函数fun0之前的myClass,i: " + myClass.i);
		fun0(myClass);
		System.out.println("输入函数fun0之后的myClass,i: " + myClass.i);
	}
输出如下:
输入函数之前的myClass,i: 100
输入函数之后的myClass,i: 10
输入函数fun0之前的myClass,i: 100
输入函数fun0之后的myClass,i: 100
我们发现明明改变了传入的参数,但是函数外面还是没有改变,其实是因为我们并没有改变传入的参数,改变的是传入的引用,我对java的内部存储也不是很了解,堆栈什么的,但是这个解释大概如下:
//11.png

2.逻辑操作符短路现象


短路就是在能确定整个逻辑表达式的时候不再计算下面的代码值。
下面的代码说明这个问题
public static boolean test0() {
		System.out.println("test0");
		return true;
	}

	public static boolean test1() {
		System.out.println("test1");
		return true;
	}

	public static boolean test2() {
		System.out.println("test2");
		return false;
	}

int length = 100;
		long start = System.currentTimeMillis();
		for(int i = 0;i < length;i++){
			boolean a = test0() &&&& test1() &&&& test2();
		}
		long mid = System.currentTimeMillis();
		for(int i = 0;i < length;i++){
			boolean b = test2() &&&& test1() &&&& test0();
		}
		long end = System.currentTimeMillis();
		System.out.println("优化之前的结果是:" + (mid - start));
		System.out.println("优化之后的结果是:" + (end - mid));

优化之前的结果是:6
优化之后的结果是:2


这样的优化是有意义的,可以让程序的速度得到提升,当确定整个表达式的值的时候就不需要再计算了,而对于我们这些使用者来说,也可以将这个特性加以利用,比如把最有可能为false的值放在&&&&操作符的前面,这样可以比放在后面节省时间。
相关内容:
前言
对象和类型
操作符和引用
流程控制语句
初始化和清理
访问控制
组合和继承
接口和多态
接口与抽象类
容器
异常
类型信息
泛型
数组
IO系统
枚举类型
注解
多线程
总结