Java优化时间空间的方法

1、函数的参数个数会影响运行速度

参数的数目直接影响调用函数的速度,参数越多,调用函数就越慢。

2、成员变量比局部变量占用空间更小

java中的成员变量和全局变量的区别:

成员变量(java中相当于C语言中的全局变量)

  • 成员变量定义在类中,在整个类中都可以被访问。
  • 成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
  • 成员变量有默认初始化值。

局部变量

  • 局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
  • 局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
  • 局部变量没有默认初始化值
在使用变量时需要遵循的原则为:就近原则
首先在局部范围找,有就使用;接着在成员位置找。

3、Java更快的输入输出

时间和空间都缩短为原来的1/3-1/5左右

定义输入和输出

StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

输入方式

in.nextToken();
int n = (int) in.nval;//相当于int n = in.nextInt();

输出方式

out.println("HelloWorld!");
out.printf("HelloWorld!");
out.print("HelloWorld!");out.flush();//代码最末

用法实例:oj-

P2249 【深基13.例1】查找

package 二分查找与二分答案;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;public class P2249查找 {static int[] a;static int n;public static void main(String[] args) throws IOException {StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));in.nextToken();n=(int)in.nval;//相当于int n = in.nextInt();in.nextToken();int m=(int)in.nval;a=new int [n+1];int[] b=new int [m+1];a[0]=-1;//有可能会要查找等于0的数,所以我们把第一个改成-1for(int i=1;i<=n;i++) {in.nextToken();a[i]=(int)in.nval;}for(int i=1;i<=m;i++) {in.nextToken();b[i]=(int)in.nval;out.print(find(b[i])+" ");}out.flush();}static int find(int x) {//参数的数目直接影响调用函数的速度,参数越多,调用函数就越慢.这题如果函数是两个参数,就会超时。int l=1,r=n;while(l<r) {int mid=l+(r-l)/2;if(a[mid]>=x)r=mid;// 如果中间值大于等于目标值就继续往左边找else l=mid+1;}if(a[l]==x)return l;else return -1;}
}

Java优化时间空间的方法

1、函数的参数个数会影响运行速度

参数的数目直接影响调用函数的速度,参数越多,调用函数就越慢。

2、成员变量比局部变量占用空间更小

java中的成员变量和全局变量的区别:

成员变量(java中相当于C语言中的全局变量)

  • 成员变量定义在类中,在整个类中都可以被访问。
  • 成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
  • 成员变量有默认初始化值。

局部变量

  • 局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
  • 局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
  • 局部变量没有默认初始化值
在使用变量时需要遵循的原则为:就近原则
首先在局部范围找,有就使用;接着在成员位置找。

3、Java更快的输入输出

时间和空间都缩短为原来的1/3-1/5左右

定义输入和输出

StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

输入方式

in.nextToken();
int n = (int) in.nval;//相当于int n = in.nextInt();

输出方式

out.println("HelloWorld!");
out.printf("HelloWorld!");
out.print("HelloWorld!");out.flush();//代码最末

用法实例:oj-

P2249 【深基13.例1】查找

package 二分查找与二分答案;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;public class P2249查找 {static int[] a;static int n;public static void main(String[] args) throws IOException {StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));PrintWriter out=new PrintWriter(new OutputStreamWriter(System.out));in.nextToken();n=(int)in.nval;//相当于int n = in.nextInt();in.nextToken();int m=(int)in.nval;a=new int [n+1];int[] b=new int [m+1];a[0]=-1;//有可能会要查找等于0的数,所以我们把第一个改成-1for(int i=1;i<=n;i++) {in.nextToken();a[i]=(int)in.nval;}for(int i=1;i<=m;i++) {in.nextToken();b[i]=(int)in.nval;out.print(find(b[i])+" ");}out.flush();}static int find(int x) {//参数的数目直接影响调用函数的速度,参数越多,调用函数就越慢.这题如果函数是两个参数,就会超时。int l=1,r=n;while(l<r) {int mid=l+(r-l)/2;if(a[mid]>=x)r=mid;// 如果中间值大于等于目标值就继续往左边找else l=mid+1;}if(a[l]==x)return l;else return -1;}
}