cyn's blog cyn's blog
首页
  • java开发知识
  • 开发问题记录
  • 计算机网络
  • 数据结构与算法
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 实用技巧
个人简历
GitHub (opens new window)
首页
  • java开发知识
  • 开发问题记录
  • 计算机网络
  • 数据结构与算法
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 实用技巧
个人简历
GitHub (opens new window)
  • java技术

    • Java 快读快输出
      • 为什么要用快读快输出?
      • StreamTokenizer类的使用
      • PrintWriter类的使用
    • 自定义比较器
    • session和token有什么区别?
    • HashMap为什么比数组查询快
    • int和Integer区别详解
    • String和StringBuffer
    • 接口和抽象类区别
    • 小数计算都是不精确的
    • 判断数组、字符串、集合为空和null
    • 布隆过滤器
    • Java实体类实现Serializable接口?(序列化)
    • java.util.Arrays.asList()
    • URI_URL
    • volatile和synchronized的区别
    • Nginx+Tomcat实现负载均衡、动静分离集群
    • nginx常用命令
  • 开发问题记录

    • 关闭端口号占用的进程
    • 前后端跨域问题
    • java调用外部程序Runtime.getRuntime().exec
    • 静态资源映射,访问、上传到服务器本地
  • java开发
  • java技术
cyn
2023-04-27
目录

Java 快读快输出

# 为什么要用快读快输出?

用Scanner类读入,简单熟练,但当数据比较大的时候(个人经验,洛谷数据过万,PTA数据过两千,建议使用快读),我们快读主要是使用io包的StreamTokenizer类。当数据的数量级为10^5时,用StreamTokenizer类差不多好像是要比Scanner快个300ms左右。 在算法实现中300ms 是一个非常大的数字了,它极有可能让你在TLE和AC之间无限试探。 快输出用的是io包的PrintWriter类,它比常规的输出也是快不少的,也是AC的一大法宝

# StreamTokenizer类的使用

用StreamTokenizer 快读读的数范围不能抄过1e16!否则可能会导致double转long丢失精度!一行一行读的建议直接用BufferedReader

下面介绍他的用法 (1)在使用他前,要导入io包 (2)在使用这个类时,函数要throws IOException (3)StreamTokenizer re = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); (4)每一次读入之前都要用**nextToken()**方法获取下一个数据 (5)读取数据的方法: sval方法读取字符串类型(以空格或者换行分隔),一次只能读一个字符串, nval方法读取数字类型数据。读取数字类型的数据时,默认为double类型,所以在读入的时候要强制转换类型

import java.io.*;
public class test {
	public static void main(String args[]) throws IOException{
		StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); 
		st.nextToken();
		String str = st.sval;
		st.nextToken();
		double num1 =  st.nval;
		st.nextToken();
		int num2 = (int)st.nval;
		st.nextToken();
		long num3 = (long)st.nval;
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14

只想读字符串: 当只读字符串的时候就不需要加StreamTokenizer类,可以直接写成 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 也不需要nextToken方法

import java.io.*;
public class test {
	public static void main(String args[]) throws IOException{

		BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
		String x = re.readLine();
		System.out.println(x);
	}
}
1
2
3
4
5
6
7
8
9

字符串和数字混合读取:

import java.io.*;
public class test {
	public static void main(String args[]) throws IOException{
		BufferedReader re = new BufferedReader(new InputStreamReader(System.in));
		StreamTokenizer r = new StreamTokenizer(re);
		r.nextToken(); int n = (int)r.nval;
		re.readLine(); //读掉数字后面的回车
		String x = re.readLine();
		System.out.println(n+" "+x);
//		输入 
//		3
//		afadfa
//		输出
//		3 afadfa
	}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# PrintWriter类的使用

把平时的输出的_System.out_替换成对应的快输出的_实例对象名_,最后记得 flush()

import java.io.*;
public class test {
	public static void main(String args[]){
		PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
		pw.print();
		pw.println();
		pw.printf();
		pw.flush();
	}
}
1
2
3
4
5
6
7
8
9
10

#

编辑 (opens new window)
上次更新: 2023/05/26, 15:58:27
自定义比较器

自定义比较器→

Theme by Vdoing | Copyright © 2023-2023 cyn | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式