Java中读取输入方式的性能比较
程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这种情况我们就束手无策,请你看以下三种解决方法吧:
- 使用System.out.read()从控制台接收一个字符,只能针对一个字符的获取,同时,获取进来的变量的类型只能是char,当我们输入一个数字,希望得到的也是一个整型变量的时候,我们还得修改其中的变量类型,这样就显得比较麻烦。
- 用BufferedReader类和InputStreamReader类从控制台接收一个字符串,然后再对字符串进行处理。
- 最简单,最强大的,就是用Scanner类。
最常用的莫过于Scanner 类了,简单强大,但如果输入数据巨大的话,就另当别论了。下面看一个POJ上的查并集的例子。
用Scanner 读取数据
package Search_Union_Set; import java.util.Scanner;
/*Memory:5844K Time:4235MS*/
public class Poj_2524_WithScanner { static int MAXN = 50001;
static int pa[] = new int[MAXN];
static int rank[] = new int[MAXN];
static int count; static void make_set(int x) {
pa[x] = x;
rank[x] = 0;
} static int find_set(int x) {
int r = x, temp;
while (pa[r] != r)
r = pa[r];
while (x != r) {
temp = pa[x];
pa[x] = r;
x = temp;
}
return x;
} static void union_set(int x, int y) {
x = find_set(x);
y = find_set(y);
if (x == y)
return;
if (rank[x] > rank[y]) {
pa[y] = x;
} else {
pa[x] = y;
if (rank[x] == rank[y])
rank[y]++;
}
count--;
} public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n, m, x, y, i;
int time = 0;
while (true) {
n = sc.nextInt();
m = sc.nextInt();
count = n;
if (m == n && n == 0)
break;
if (m == 0) {
System.out.println("1");
continue;
}
for (i = 0; i < n; i++)
make_set(i);
for (i = 0; i < m; i++) {
x = sc.nextInt();
y = sc.nextInt();
union_set(x, y);
x = y;
}
time++;
System.out.println("Case " + time + ": " + count);
}
}
}
用BufferedReader类和InputStreamReader类从控制台接收
package Search_Union_Set; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/*Memory:5260K Time:719MS*/
public class Poj_2524_WithBufferedReader { static int MAXN = 50001;
static int pa[] = new int[MAXN];
static int rank[] = new int[MAXN];
static int count;
static void make_set(int x) {
pa[x] = x;
rank[x] = 0;
} static int find_set(int x) {
int r = x, temp;
while (pa[r] != r)
r = pa[r];
while (x != r) {
temp = pa[x];
pa[x] = r;
x = temp;
}
return x;
} static void union_set(int x, int y) {
x = find_set(x);
y = find_set(y);
if (x == y)
return;
if (rank[x] > rank[y])
{
pa[y] = x;
} else {
pa[x] = y;
if (rank[x] == rank[y])
rank[y]++;
}
count--;
} public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n, m, x, y, i;
int time = 0;
while (true) {
String str = br.readLine();
StringTokenizer stoken = new StringTokenizer(str, " ");
n = Integer.valueOf(stoken.nextToken());
m = Integer.valueOf(stoken.nextToken());
count = n;
if (m == n && n == 0)
break;
if (m == 0) {
System.out.println("1");
continue;
}
for (i = 0; i < n; i++)
make_set(i);
for (i = 0; i < m; i++) {
str = br.readLine();
stoken = new StringTokenizer(str, " ");
x = Integer.valueOf(stoken.nextToken());
y = Integer.valueOf(stoken.nextToken());
union_set(x, y);
x = y;
}
time++;
System.out.println("Case " + time + ": " + count);
}
}
}
用BufferedReader类和InputStreamReader类明显要比Scanner 快得多。
Scanner一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器。 Scanner 使用分隔符模式将其输入分解为标记,默认情况下该分隔符模式与空白匹配。然后可以使用不同的 next 方法将得到的标记转换为不同类型的值。
BufferedReader从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。 通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。 每次调用 InputStreamReader 中的一个 read() 方法都会导致从基础输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从基础流读取更多的字节,使其超过满足当前读取操作所需的字节。
版权声明:本文为博主原创文章,未经博主允许不得转载。
Java中读取输入方式的性能比较的更多相关文章
- Java中读取properties资源文件
一.通过ResourceBundle来读取.properties文件 /** * 通过java.util.resourceBundle来解析properties文件. * @param String ...
- Java中读取文件
Java中读取文件,去除一些分隔符,保存在多维数组里面 public void readFile(String filePath) { File file=new File(filePath); Ar ...
- java中读取特殊文件的类型
java中读取特殊文件的类型: 第一种方法(字符拼接读取): public static String getType(String s){ String s1=s.substring(s.index ...
- Java中读取.properties配置文件的通用类
由于Java中读取配置文件的代码比较固定,所以可以将读取配置文件的那部分功能单独作为一个类,以后可以复用.为了能够达到复用的目的,不能由配置文件中每一个属性生成一个函数去读取,我们需要一种通用的方法读 ...
- 五种方式让你在java中读取properties文件内容不再是难题
一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC ...
- java中基本输入输出流的解释(flush方法的使用)
转自:http://fsz521job.itpub.net/post/5606/34827 网络程序的很大一部分是简单的输入输出,即从一个系统向另一个系统移动字节.字节就是字节,在很大程度上,读服务器 ...
- Java Map各遍历方式的性能比较
1. 阐述 对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多.理由是:entrySet方法一次拿到所有key和value的集合:而keySet拿到的 ...
- C语言中的输入方式
在c语言中,有gets().scanf().getchar()等输入方式,但是不同的方式处理的方式不同. scanf()读取时遇见tab.space.enter时会结束读取,不会舍弃最后的回车符(即回 ...
- Java中如何输入一个字符
今天在QQ群上看见有人问如何在Java中输入一个字符的问题. 查了下有以下三种方法吧: char c = new java.util.Scanner(System.in).next().charAt( ...
随机推荐
- sgu 1348 Goat in the Garden 2【点到线段的距离】
链接: http://acm.timus.ru/problem.aspx?space=1&num=1348 http://acm.hust.edu.cn/vjudge/contest/view ...
- Swift来了,是不是能够入手IOS开发了?
在今天的WWDC2014上,苹果公布了一种全新的Swift.在苹果高管 Craig Federighi 的描写叙述中,Swift 在各个方面优于 Objective-C,也不会有那么多复杂的符号和表达 ...
- pinpoint本地开发——collector
本地启动collector 启动前准备 启动之前,要先确保本地已经可以正常package,install 必须保证install成功,才能进行后续步骤,无法install或者package参考[pin ...
- HDU - 4965 Fast Matrix Calculation 【矩阵快速幂】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4965 题意 给出两个矩阵 一个A: n * k 一个B: k * n C = A * B M = (A ...
- float后怎么居中
我们在用css float的时候,如何让文本水平居中真的很麻烦, [float]使div(或者其他标签)的宽度自适应其内容,但它却有个弊端:无法居中.[display:inline-block]也有同 ...
- uitableview 刷新一行
ios UITableview 刷新某一行 或 section //一个section刷新 NSIndexSet *indexSet=[[NSIndexSet alloc]initWith ...
- Nginx Rewrite语法详解
重写中用到的指令 if (条件) {} 设定条件,再进行重写 set #设置变量 return #返回状态码 return 403; break #跳出rewrite rewrite #重写 I ...
- LINQ 学习路程 -- 查询操作 where
1.where Filtering Operators Description Where Returns values from the collection based on a predicat ...
- hive启动时报错 java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D at org.apache.hadoop.fs.Path.initialize
错误提示信息如下 错误信息如下 [root@node1 bin]# ./hive Logging initialized -bin/lib/hive-common-.jar!/hive-log4j.p ...
- Mysql的链接超时异常CommunicationsException
原文是在博客上的:小重合之旅 链接如下:未经过作者同意,这里注明下. http://blog.csdn.net/bluesnail216/article/details/15810119 1,问题现象 ...