参考链接: 交换两个字符串,而无需在Java中使用第三个用户定义的变量
上篇文章介绍了用System.currentTimeMillis()方法检测运行时间的用法,这篇文章结合两个实际例子,看一下实际效果;同时体会这两个例子给出的不同算法之间的差别。
1. 字符串叠加
在《Thinking in java》里,作者着重强调了,字符串叠加的时候,尽量使用StringBuilder,相对于直接使用String.append()可以提高效率。那么究竟差别有多少,我们来看下面的例子:
public static void main(String[]args)
{
String str="";
long starTime=System.currentTimeMillis();
//计算循环10000的时间
for(int i=0; i<10000; i++)
{
str=str+i;
}
long endTime=System.currentTimeMillis();
long Time=endTime-starTime;
System.out.println(Time);
StringBuilder bulider=new StringBuilder("");
starTime=System.currentTimeMillis();
for(int j=0; j<10000000; j++)
{
bulider.append(j);
}
endTime=System.currentTimeMillis();
Time=endTime-starTime;
System.out.println(Time);
}
这样的输出效果,在我的电脑上是二者差不多,300多毫秒!这个差距惊到我了!
2.两个变量交换数据
首先介绍一下三种变量交换数据的方法:
(1)借用中间值(最经典的方法了)
int x = 10,y = 5;
int temp = x;
x = y;
y = temp;
(2)加减交换
int x =10,y=5; //定义两个变量
x = x + y; //求二者和;
y = x - y; //x的值赋给y;
x = x - y; //y的值赋给x;
这种方法不用单独创建额外的变量,弊端在于如果 x 和 y 的数值过大的话,超出 int 的值会损失精度。
(3)异或运算
利用的原理是:一个数异或同一个数两次,结果还是那个数
int x =5,y=10; //定义两个变量
x = x^y;
y = x^y; //y=(x^y)^y
x = x^x; //x=(x^y)^x
这样不会超出int范围。
(4)运行效率
下面看下三者的运行速度如何:
public static void main(String[]args)
{
int x = 10, y = 5;
long starTime=System.currentTimeMillis();
//计算循环10000的时间
for(int i=0; i<1000000; i++)
{
int temp = x;
x = y;
y = temp;
}
long endTime=System.currentTimeMillis();
long Time=endTime-starTime;
System.out.println(Time);
starTime=System.currentTimeMillis();
//计算循环10000的时间
for(int i=0; i<1000000; i++)
{
x = x + y; //求二者和;
y = x - y; //x的值赋给y;
x = x - y; //y的值赋给x;
}
endTime=System.currentTimeMillis();
Time=endTime-starTime;
System.out.println(Time);
starTime=System.currentTimeMillis();
//计算循环10000的时间
for(int i=0; i<1000000; i++)
{
x = x^y;
y = x^y; //y=(x^y)^y
x = x^x; //x=(x^y)^x
}
endTime=System.currentTimeMillis();
Time=endTime-starTime;
System.out.println(Time);
}
看运行结果: 哈哈,实际结果相差不大!看来这几种方式运行效率差不多,差的是内存开支等问题吧!
3.参考链接
java如何计算程序运行时间:https://zhidao.baidu.com/question/560976550653732724.html 两个变量交换的四种方法(Java):http://www.cnblogs.com/Brad-Lee/p/5808299.html Java 位运算(移位、位与、或、异或、非):http://aijuans.iteye.com/blog/1850655
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。