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( ...
随机推荐
- Python中的TCP编程,实现客户端与服务器的聊天(socket)
参考大神blog:自己再写一个 https://blog.csdn.net/qq_31187881/article/details/79067644
- 安装了包,pycharm却提示找不到包
这段时间,我爬虫爬到了一个论坛的数据,有个分析需要知道他的字符编码,因此使用到了 chardet,我在终端很顺利的安装了这个,但是在pycharm里使用的时候老是提示有错误,向下面这样: 其实这个是因 ...
- shell中替换json中指定的值
在linux中部署软件的时候,有时会遇到用shell动态改动json格式的配置文件,比如一下rabbitmq.json文件: { "rabbitmq": { "ssl&q ...
- MySQL root 密码重置
安全模式重置法 基本的思路是,以安全模式启动mysql,这样不需要密码可以直接以root身份登录,然后重设密码. 1. 停止 MySQL 服务 [molo.wu@shark mysql (master ...
- Demo Nec
/* 布局 */.g-va{width:1160px;margin:0 auto;} /* visual area */ /* 模块 */.m-nav{position:relative;height ...
- ajax删除当前行
$(function(){ $("tr #del").click(function(){ var id = $(this).attr("data-id"); v ...
- 算法(Algorithms)第4版 练习 2.3.25
代码实现: public static void sort(Comparable[] a) { StdRandom.shuffle(a);//eliminate dependence on inp ...
- sqoop job 增量导入
使用sqoop job做增量导入 在执行导入模式为 incremental 的sqoop job 时,sqoop会获取上次导入操作的 –check-column的value值,也就是说使用sqoop ...
- Hadoop- HDFS的API操作
1.引入依赖 <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop- ...
- java:Map借口及其子类
java:Map借口及其子类 Conllection是保存单值最大得父接口(即没有key的数据),那么Map是保存的内容是一对键值的数据,即KEY->VALUE的形式保存,如电话簿等. Map常 ...