牛客网java 自定义标签编程n个学生,n个标签分组,相同的分在一组,有多少种分法

java(29)
来源:牛客网
老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.&
输入包括多组测试数据。
每组输入第一行是两个正整数N和M(0 & N &= 30000,0 & M & 5000),分别代表学生的数目和操作的数目。
学生ID编号从1编到N。
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩
接下来又M行,每一行有一个字符C(只取‘Q’或‘U’),和两个正整数A,B,当C为'Q'的时候, 表示这是一条询问操作,他询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少
当C为‘U’的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
对于每一次询问操作,在一行里面输出最高成绩.
class Main {
&&&&public
static void
main(String[] args) {
&&&&&&&&int
&&&&&&&&int
&&&&&&&&int
&&&&&&&&Scanner in =
new Scanner(System.in);
&&&&&&&&while(in.hasNext()){
&&&&&&&&&&&&&&&&N = in.nextInt();
&&&&&&&&&&&&&&&&M = in.nextInt();&&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&int[] score =
new int[N];
&&&&&&&&&&&&for(i=0; in.hasNext() && i&N; i++){
&&&&&&&&&&&&&&&&score[i] = in.nextInt();
&&&&&&&&&&&&}
&&&&&&&&&&&&&
&&&&&&&&&&&&String c =
&&&&&&&&&&&&&
&&&&&&&&&&&&for(i=0; in.hasNext() && i& M; i++){
&&&&&&&&&&&&&&&&c& = in.next();
&&&&&&&&&&&&&&&&A = in.nextInt();
&&&&&&&&&&&&&&&&B = in.nextInt();&&
&&&&&&&&&&&&&&&&process(c,A,B,score);
&&&&&&&&&&&&}
&&&&&&&&&&&&&
&&&&private
static void
process(String c, int
int[] score) {
&&&&&&&&int
begin,&&&&&
&&&&&&&&if(c.equals(&Q&)){
&&&&&&&&&&&&end = Math.max(a, b);
&&&&&&&&&&&&begin = Math.min(a, b)-1;
&&&&&&&&&&&&int
max = score[begin];
&&&&&&&&&&&&for(int
i=i&i++){
&&&&&&&&&&&&&&&&if(max&score[i]){
&&&&&&&&&&&&&&&&&&&&max = score[i];
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&System.out.println(max);
&&&&&&&&}else
if(c.equals(&U&)){
&&&&&&&&&&&&score[a-1] =
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:14319次
排名:千里之外
原创:16篇
转载:22篇
(1)(2)(3)(13)(12)(7)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'&figure&&img src=&/v2-7c2e79f77b78787ccb69c_b.jpg& data-rawwidth=&800& data-rawheight=&432& class=&origin_image zh-lightbox-thumb& width=&800& data-original=&/v2-7c2e79f77b78787ccb69c_r.jpg&&&/figure&&p&无规矩不成方圆,无规范不能协作。近万名阿里Java技术精英的经验总结,并经历了多次大规模一线实战检验及完善,铸就了高含金量的《阿里巴巴Java开发手册》,并向业界开放。&/p&&p&该手册以Java开发者为中心视角,划分为编程规约、异常日志规约、MYSQL规约、工程规约、安全规约五大块,再根据内容特征,细分成若干二级子目录。根据约束力强弱和故障敏感性,规约依次分为强制、推荐、参考三大类。此套规范不仅能让代码一目了然,更有助于加强团队分工与合作、真正提升效率。 &/p&&p&&b&「阿里巴巴编码规范」认证&/b&&/p&&p&阿里云大学携手手册项目组,推出「阿里巴巴编码规范」认证,通过50道题目,来检测你的编码习惯与《阿里巴巴Java开发手册》有哪些异同之处。考试通过还将发放阿里云大学官方认证——「阿里巴巴编码规范」。学习、考试、认证一体,展示你的编码水平与风格。&/p&&p&学习&认证:&a href=&/?target=http%3A///m/30791/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阿里巴巴编码规范-阿里云大学&i class=&icon-external&&&/i&&/a&&/p&&figure&&img src=&/v2-8e7b737e2a7ddec40b53cb_b.jpg& data-rawwidth=&1000& data-rawheight=&667& class=&origin_image zh-lightbox-thumb& width=&1000& data-original=&/v2-8e7b737e2a7ddec40b53cb_r.jpg&&&/figure&&p&&br&&/p&&p&知乎话题:&a href=&/question/& class=&internal&&如何评价阿里近期发布的Java编码规范?&/a&&/p&&p&&br&&/p&&figure&&img src=&/v2-30deaade70f9a3632778_b.jpg& data-rawwidth=&595& data-rawheight=&842& class=&origin_image zh-lightbox-thumb& width=&595& data-original=&/v2-30deaade70f9a3632778_r.jpg&&&/figure&&p&&/p&
无规矩不成方圆,无规范不能协作。近万名阿里Java技术精英的经验总结,并经历了多次大规模一线实战检验及完善,铸就了高含金量的《阿里巴巴Java开发手册》,并向业界开放。该手册以Java开发者为中心视角,划分为编程规约、异常日志规约、MYSQL规约、工程规…
&p&以下是我个人收集的视频,按学习顺序排下&/p&&p&&b&1、JavaSE学习视频&/b& &a href=&///?target=http%3A///s/1bp3g6rd& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1bp3g6r&/span&&span class=&invisible&&d&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&&br&&/p&&p&&b&2、javaweb的学习视频&/b& &a href=&///?target=http%3A///s/1jHF3pem& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1jHF3pe&/span&&span class=&invisible&&m&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&&br&&/p&&p&3、&b&HTML+CSS+JS+JavaWeb+Oracle+五大框架+两大项目全套90天视频&/b&&/p&&p&链接:&a href=&///?target=http%3A///s/1qXMs4Fy& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1qXMs4F&/span&&span class=&invisible&&y&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:et6c&/p&&p&&br&&/p&&p&4&b&.Android十一天教程(在学习了javaSE的基础上,可以直接学)&/b&&/p&&p&链接:&a href=&///?target=http%3A///s/1slx4qPB& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1slx4qP&/span&&span class=&invisible&&B&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:qrm0&/p&&p&&br&&/p&&p&5.&b&Android一些必看书籍&/b&&/p&&p&链接:&a href=&///?target=http%3A///s/1jIGFuVs& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1jIGFuV&/span&&span class=&invisible&&s&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:semz&/p&&p&&br&&/p&&p&6.&b&java目前比较火的三大框架(springmvc+spring+mybatis)&/b&&/p&&p&链接:&a href=&///?target=http%3A///s/1misUFiS& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1misUFi&/span&&span class=&invisible&&S&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:hgrv&/p&&p&&br&&/p&&p&&b&7.java面试题库&/b&&/p&&p&链接:&a href=&///?target=http%3A///s/1pKNa4SN& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1pKNa4S&/span&&span class=&invisible&&N&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:0d0h&/p&&p&&br&&/p&&p&8.&b&数据结构(进阶)&/b&&/p&&p&链接:&a href=&///?target=http%3A///s/1cLFtE2& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1cLFtE2&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a& 密码:x4dg&/p&&p&&br&&/p&&p&&b&9.java项目二十套(视频+代码)(进阶)&/b&&/p&&p&链接:&a href=&///?target=http%3A///s/1bo3ghav& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1bo3gha&/span&&span class=&invisible&&v&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:71hk&/p&&p&&br&&/p&&p&&b&10.架构师学习视频(高阶)&/b&&/p&&p&链接:&a href=&///?target=http%3A///s/1o8UeuYQ& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/s/1o8UeuY&/span&&span class=&invisible&&Q&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a& 密码:7n06&/p&&p&&br&&/p&&figure&&img src=&/v2-6bcec379e_b.png& data-rawwidth=&1269& data-rawheight=&1270& class=&origin_image zh-lightbox-thumb& width=&1269& data-original=&/v2-6bcec379e_r.png&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&接下来的日子会持续的搜集视频,并不断分享,可以关注一下我的知乎动态。&/p&&p&分享不易,如果觉得不错,点个赞呗。&/p&
以下是我个人收集的视频,按学习顺序排下1、JavaSE学习视频
2、javaweb的学习视频
3、HTML+CSS+JS+JavaWeb+Oracle+五大框架+两大项目全套90天视频链接: …
&h2&开胃菜&/h2&&p&先看一张网上流传的&a href=&/?target=http%3A//java.io& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&java.io&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&包的类结构图:&/p&&figure&&img src=&/v2-ce7fea9d_b.png& data-rawwidth=&687& data-rawheight=&763& class=&origin_image zh-lightbox-thumb& width=&687& data-original=&/v2-ce7fea9d_r.png&&&/figure&&p&&br&&/p&&p&当你看到这幅图的时候,我相信,你跟我一样内心是崩溃的。&/p&&p&有些人不怕枯燥,不怕寂寞,硬着头皮看源码,但是,能坚持下去全部看完的又有几个呢!&/p&&p&然而,就算源码全部看完看懂,过不了几天,脑子里也会变成一团浆糊。&/p&&p&因为这里的类实在太多了。可能我们反复看,反复记,也很难做到清晰明白。&/p&&p&他就像是一块超级硬的骨头,怎么啃都啃不烂。&/p&&p&面对这样的做法,要坚决对他说,&b&NO&/b&。&/p&&p&&br&&/p&&h2&记不住,怎么办?&/h2&&p&我的做法是找出他们的共性,给他们分类,只记典型,触类旁通。&/p&&p&上面的图虽然有分类,但是还不够细,而且没有总结出方便记忆的规律,所以我们要重新整理和归类。&/p&&p&这篇文章中,使用了两种分时给他们分组,目的是更全面的了解共性,帮助记忆。&/p&&p&&br&&/p&&h2&分类一:按操作方式(类结构)&/h2&&ul&&li&&b&字节流和字符流:&/b&&/li&&ul&&li&字节流:以字节为单位,每次次读入或读出是8位数据。可以读任何类型数据。&/li&&li&字符流:以字符为单位,每次次读入或读出是16位数据。其只能读取字符类型数据。&/li&&/ul&&li&&b&输出流和输入流:&/b&&/li&&ul&&li&输出流:从内存读出到文件。只能进行写操作。&/li&&li&输入流:从文件读入到内存。只能进行读操作。&/li&&/ul&&/ul&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&注意:这里的出和入,都是相对于系统内存而言的。
&/code&&/pre&&/div&&ul&&li&&b&节点流和处理流:&/b&&/li&&ul&&li&节点流:直接与数据源相连,读入或读出。&/li&&li&处理流:与节点流一块使用,在节点流的基础上,再套接一层,套接在节点流上的就是处理流。&/li&&/ul&&/ul&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&为什么要有处理流?直接使用节点流,读写不方便,为了更快的读写文件,才有了处理流。
&/code&&/pre&&/div&&p&&br&&/p&&p&&b&按操作方式分类结构图:&/b&&/p&&p&根据以上分类,以及jdk的说明,我们可以画出更详细的类结构图,如下:&/p&&p&&br&&/p&&figure&&img src=&/v2-6a6fd07ae_b.png& data-rawwidth=&852& data-rawheight=&1278& class=&origin_image zh-lightbox-thumb& width=&852& data-original=&/v2-6a6fd07ae_r.png&&&/figure&&p&&br&&/p&&p&&b&分类说明&/b&&/p&&ul&&li&&b&1. 输入字节流InputStream&/b&:&br&输入字节流的继承图可见上图,可以看出:&/li&&ul&&li&FileInputStream: 是三种基本的介质流,它们分别从Byte 数组、StringBuffer、和本地文件中读取数据。&/li&&li&ByteArrayInputStream:&/li&&li&PipedInputStream: 是从与其它线程共用的管道中读取数据。PipedInputStream的一个实例要和PipedOutputStream的一个实例共同使用,共同完成管道的读取写入操作。主要用于线程操作。&/li&&li&ObjectInputStream 和所有FilterInputStream 的子类都是装饰流(装饰器模式的主角)&/li&&/ul&&li&&b&2. 输出字节流OutputStream:&br&&/b&输出字节流的继承图可见上图,可以看出:&/li&&ul&&li&FIleOutputStream:是两种基本的介质流&/li&&li&ByteArrayOutputStream: 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。&/li&&li&PipedOutputStream:是向与其它线程共用的管道中写入数据。&/li&&li&ObjectOutputStream 和所有FilterOutputStream 的子类都是装饰流。&/li&&/ul&&/ul&&blockquote&字节流的输入和输出对照图:&/blockquote&&figure&&img src=&/v2-ae25d3d56dd_b.png& data-rawwidth=&440& data-rawheight=&412& class=&origin_image zh-lightbox-thumb& width=&440& data-original=&/v2-ae25d3d56dd_r.png&&&/figure&&p&&br&&/p&&p&&br&&/p&&ul&&li&&b&3. 字符输入流Reader:&br&&/b&在上面的继承关系图中可以看出:&/li&&ul&&li&FileReader:&/li&&li&PipedReader:是从与其它线程共用的管道中读取数据&/li&&li&CharArrayReader:&/li&&li&CharReader、StringReader 是两种基本的介质流,它们分别将Char 数组、String中读取数据。&/li&&li&BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它Reader 对象。&/li&&li&FilterReader 是所有自定义具体装饰流的父类,其子类PushbackReader 对Reader 对象进行装饰,会增加一个行号。&/li&&li&InputStreamReader: 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将FileInputStream 转变为Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和InputStream 中的类使用一致。后面会有Reader 与InputStream 的对应关系。&/li&&/ul&&/ul&&p&&br&&/p&&ul&&li&&b&4. 字符输出流Writer:&br&&/b&在上面的关系图中可以看出:&/li&&ul&&li&FileWriter:&/li&&li&PipedWriter:是向与其它线程共用的管道中写入数据&/li&&li&CharArrayWriter:&/li&&li&CharArrayWriter、StringWriter 是两种基本的介质流,它们分别向Char 数组、String 中写入数据。&/li&&li&BufferedWriter 是一个装饰器,为Writer 提供缓冲功能。&/li&&li&PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。&/li&&li&OutputStreamWriter: 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类(具体可以研究一SourceCode)。功能和使用和OutputStream 极其类似,后面会有它们的对应图。&/li&&/ul&&/ul&&blockquote&字符流的输入和输出对照图:&/blockquote&&p&&br&&/p&&figure&&img src=&/v2-1da0abde228af8_b.png& data-rawwidth=&430& data-rawheight=&486& class=&origin_image zh-lightbox-thumb& width=&430& data-original=&/v2-1da0abde228af8_r.png&&&/figure&&p&&br&&/p&&ul&&li&&b&5. 字符流与字节流转换&/b&&/li&&ul&&li&转换流的特点:&/li&&/ul&&/ul&&ol&&li&其是字符流和字节流之间的桥梁;&/li&&li&可对读取到的字节数据经过指定编码转换成字符;&/li&&li&可对读取到的字符数据经过指定编码转换成字节;&/li&&/ol&&ul&&li&何时使用转换流?&/li&&/ul&&ol&&li&当字节和字符之间有转换动作时;&/li&&li&流操作的数据需要编码或解码时。&/li&&/ol&&ul&&li&具体的实现:&/li&&/ul&&p&InputStreamReader:输入&i&流转到读流;&/i&&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&String&/span& &span class=&n&&fileName&/span&&span class=&o&&=&/span& &span class=&s&&&d:&&/span&&span class=&o&&+&/span&&span class=&n&&File&/span&&span class=&o&&.&/span&&span class=&na&&separator&/span&&span class=&o&&+&/span&&span class=&s&&&hello.txt&&/span&&span class=&o&&;&/span&
&span class=&n&&File&/span& &span class=&n&&file&/span&&span class=&o&&=&/span&&span class=&k&&new&/span& &span class=&n&&File&/span&&span class=&o&&(&/span&&span class=&n&&fileName&/span&&span class=&o&&);&/span&
&span class=&n&&Writer&/span& &span class=&n&&out&/span&&span class=&o&&=&/span&&span class=&k&&new&/span& &span class=&n&&OutputStreamWriter&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&FileOutputStream&/span&&span class=&o&&(&/span&&span class=&n&&file&/span&&span class=&o&&));&/span&
&span class=&n&&out&/span&&span class=&o&&.&/span&&span class=&na&&write&/span&&span class=&o&&(&/span&&span class=&s&&&hello&&/span&&span class=&o&&);&/span&
&span class=&n&&out&/span&&span class=&o&&.&/span&&span class=&na&&close&/span&&span class=&o&&();&/span&
&/code&&/pre&&/div&&p&OutputStreamWriter:&i&输出流转到写流;&/i&&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&n&&String&/span& &span class=&n&&fileName&/span&&span class=&o&&=&/span& &span class=&s&&&d:&&/span&&span class=&o&&+&/span&&span class=&n&&File&/span&&span class=&o&&.&/span&&span class=&na&&separator&/span&&span class=&o&&+&/span&&span class=&s&&&hello.txt&&/span&&span class=&o&&;&/span&
&span class=&n&&File&/span& &span class=&n&&file&/span&&span class=&o&&=&/span&&span class=&k&&new&/span& &span class=&n&&File&/span&&span class=&o&&(&/span&&span class=&n&&fileName&/span&&span class=&o&&);&/span&
&span class=&n&&Reader&/span& &span class=&n&&read&/span&&span class=&o&&=&/span&&span class=&k&&new&/span& &span class=&n&&InputStreamReader&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&FileInputStream&/span&&span class=&o&&(&/span&&span class=&n&&file&/span&&span class=&o&&));&/span&
&span class=&kt&&char&/span&&span class=&o&&[]&/span& &span class=&n&&b&/span&&span class=&o&&=&/span&&span class=&k&&new&/span& &span class=&kt&&char&/span&&span class=&o&&[&/span&&span class=&mi&&100&/span&&span class=&o&&];&/span&
&span class=&kt&&int&/span& &span class=&n&&len&/span&&span class=&o&&=&/span&&span class=&n&&read&/span&&span class=&o&&.&/span&&span class=&na&&read&/span&&span class=&o&&(&/span&&span class=&n&&b&/span&&span class=&o&&);&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&out&/span&&span class=&o&&.&/span&&span class=&na&&println&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&String&/span&&span class=&o&&(&/span&&span class=&n&&b&/span&&span class=&o&&,&/span&&span class=&mi&&0&/span&&span class=&o&&,&/span&&span class=&n&&len&/span&&span class=&o&&));&/span&
&span class=&n&&read&/span&&span class=&o&&.&/span&&span class=&na&&close&/span&&span class=&o&&();&/span&
&/code&&/pre&&/div&&blockquote&这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。&/blockquote&&h2&分类二:按操作对象&/h2&&p&&b&按操作对象分类结构图:&/b&&/p&&p&&br&&/p&&figure&&img src=&/v2-1a7a2ae7ed9a13910aecebbed9a00e72_b.png& data-rawwidth=&1006& data-rawheight=&748& class=&origin_image zh-lightbox-thumb& width=&1006& data-original=&/v2-1a7a2ae7ed9a13910aecebbed9a00e72_r.png&&&/figure&&p&&br&&/p&&p&&br&&/p&&p&&b&分类说明:&/b&&/p&&ul&&li&对文件进行操作(节点流):&/li&&ul&&li&FileInputStream(字节输入流),&/li&&li&FileOutputStream(字节输出流),&/li&&li&FileReader(字符输入流),&/li&&li&FileWriter(字符输出流)&/li&&/ul&&li&对管道进行操作(节点流):&/li&&ul&&li&PipedInputStream(字节输入流),&/li&&li&PipedOutStream(字节输出流),&/li&&li&PipedReader(字符输入流),&/li&&li&PipedWriter(字符输出流)。&br&PipedInputStream的一个实例要和PipedOutputStream的一个实例共同使用,共同完成管道的读取写入操作。主要用于线程操作。&/li&&/ul&&li&字节/字符数组流(节点流):&/li&&ul&&li&ByteArrayInputStream,&/li&&li&ByteArrayOutputStream,&/li&&li&CharArrayReader,&/li&&li&CharArrayWriter;&br&是在内存中开辟了一个字节或字符数组。&/li&&/ul&&/ul&&blockquote&除了上述三种是节点流,其他都是处理流,需要跟节点流配合使用。&/blockquote&&ul&&li&Buffered缓冲流(处理流):&/li&&ul&&li&BufferedInputStream,&/li&&li&BufferedOutputStream,&/li&&li&BufferedReader,&/li&&li&BufferedWriter,&br&是带缓冲区的处理流,缓冲区的作用的主要目的是:避免每次和硬盘打交道,提高数据访问的效率。&/li&&/ul&&li&转化流(处理流):&/li&&ul&&li&InputStreamReader:把字节转化成字符;&/li&&li&OutputStreamWriter:把字节转化成字符。&/li&&/ul&&li&基本类型数据流(处理流):用于操作基本数据类型值。&/li&&ul&&li&DataInputStream,&/li&&li&DataOutputStream。&br&因为平时若是我们输出一个8个字节的long类型或4个字节的float类型,那怎么办呢?可以一个字节一个字节输出,也可以把转换成字符串输出,但是这样转换费时间,若是直接输出该多好啊,因此这个数据流就解决了我们输出数据类型的困难。数据流可以直接输出float类型或long类型,提高了数据读写的效率。&/li&&/ul&&li&打印流(处理流):&/li&&ul&&li&PrintStream,&/li&&li&PrintWriter,&br&一般是打印到控制台,可以进行控制打印的地方。&/li&&/ul&&li&对象流(处理流):&/li&&ul&&li&ObjectInputStream,对象反序列化;&/li&&li&ObjectOutputStream,对象序列化;&br&把封装的对象直接输出,而不是一个个在转换成字符串再输出。&/li&&/ul&&li&合并流(处理流):&/li&&ul&&li&SequenceInputStream:可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。&/li&&/ul&&/ul&&p&&br&&/p&&h2&典型使用案例&/h2&&ul&&li&&b&1. 复制文件:&/b&&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&cm&&/**&/span&
&span class=&cm&& * 复制文件:一边读,一边写&/span&
&span class=&cm&& */&/span&
&span class=&kd&&class&/span& &span class=&nc&&hello&/span& &span class=&o&&{&/span&
&span class=&kd&&public&/span& &span class=&kd&&static&/span& &span class=&kt&&void&/span& &span class=&nf&&main&/span&&span class=&o&&(&/span&&span class=&n&&String&/span&&span class=&o&&[]&/span& &span class=&n&&args&/span&&span class=&o&&)&/span& &span class=&kd&&throws&/span& &span class=&n&&IOException&/span& &span class=&o&&{&/span&
&span class=&k&&if&/span& &span class=&o&&(&/span&&span class=&n&&args&/span&&span class=&o&&.&/span&&span class=&na&&length&/span& &span class=&o&&!=&/span& &span class=&mi&&2&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&out&/span&&span class=&o&&.&/span&&span class=&na&&println&/span&&span class=&o&&(&/span&&span class=&s&&&命令行参数输入有误,请检查&&/span&&span class=&o&&);&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&exit&/span&&span class=&o&&(&/span&&span class=&mi&&1&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&n&&File&/span& &span class=&n&&file1&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&File&/span&&span class=&o&&(&/span&&span class=&n&&args&/span&&span class=&o&&[&/span&&span class=&mi&&0&/span&&span class=&o&&]);&/span&
&span class=&n&&File&/span& &span class=&n&&file2&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&File&/span&&span class=&o&&(&/span&&span class=&n&&args&/span&&span class=&o&&[&/span&&span class=&mi&&1&/span&&span class=&o&&]);&/span&
&span class=&k&&if&/span& &span class=&o&&(!&/span&&span class=&n&&file1&/span&&span class=&o&&.&/span&&span class=&na&&exists&/span&&span class=&o&&())&/span& &span class=&o&&{&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&out&/span&&span class=&o&&.&/span&&span class=&na&&println&/span&&span class=&o&&(&/span&&span class=&s&&&被复制的文件不存在&&/span&&span class=&o&&);&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&exit&/span&&span class=&o&&(&/span&&span class=&mi&&1&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&n&&InputStream&/span& &span class=&n&&input&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&FileInputStream&/span&&span class=&o&&(&/span&&span class=&n&&file1&/span&&span class=&o&&);&/span&
&span class=&n&&OutputStream&/span& &span class=&n&&output&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&FileOutputStream&/span&&span class=&o&&(&/span&&span class=&n&&file2&/span&&span class=&o&&);&/span&
&span class=&k&&if&/span& &span class=&o&&((&/span&&span class=&n&&input&/span& &span class=&o&&!=&/span& &span class=&kc&&null&/span&&span class=&o&&)&/span& &span class=&o&&&&&/span& &span class=&o&&(&/span&&span class=&n&&output&/span& &span class=&o&&!=&/span& &span class=&kc&&null&/span&&span class=&o&&))&/span& &span class=&o&&{&/span&
&span class=&kt&&int&/span& &span class=&n&&temp&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span&
&span class=&k&&while&/span& &span class=&o&&((&/span&&span class=&n&&temp&/span& &span class=&o&&=&/span& &span class=&n&&input&/span&&span class=&o&&.&/span&&span class=&na&&read&/span&&span class=&o&&())&/span& &span class=&o&&!=&/span& &span class=&o&&(-&/span&&span class=&mi&&1&/span&&span class=&o&&))&/span& &span class=&o&&{&/span&
&span class=&n&&output&/span&&span class=&o&&.&/span&&span class=&na&&write&/span&&span class=&o&&(&/span&&span class=&n&&temp&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&span class=&n&&input&/span&&span class=&o&&.&/span&&span class=&na&&close&/span&&span class=&o&&();&/span&
&span class=&n&&output&/span&&span class=&o&&.&/span&&span class=&na&&close&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&ul&&li&说明:&/li&&ul&&li&流在使用结束后,一定要执行关闭操作,即调用close( )方法。&/li&&li&FileInputStream.read():&br&这个方法是对这个流一个一个字节的读,返回的结果就是这个字节的int表示方式;&br&当已经没有内容时,返回的结果为-1;&/li&&li&FileOutputStream.write():&br&将内容写到文件。&/li&&/ul&&li&&b&2.
不使用FIle,将流中的字符转换大写小:&/b&&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span& &span class=&kd&&public&/span& &span class=&kd&&static&/span& &span class=&kt&&void&/span& &span class=&nf&&main&/span&&span class=&o&&(&/span&&span class=&n&&String&/span&&span class=&o&&[]&/span& &span class=&n&&args&/span&&span class=&o&&)&/span& &span class=&kd&&throws&/span& &span class=&n&&IOException&/span& &span class=&o&&{&/span&
&span class=&n&&String&/span& &span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&s&&&ROLLENHOLT&&/span&&span class=&o&&;&/span&
&span class=&n&&ByteArrayInputStream&/span& &span class=&n&&input&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&ByteArrayInputStream&/span&&span class=&o&&(&/span&&span class=&n&&str&/span&&span class=&o&&.&/span&&span class=&na&&getBytes&/span&&span class=&o&&());&/span&
&span class=&n&&ByteArrayOutputStream&/span& &span class=&n&&output&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&ByteArrayOutputStream&/span&&span class=&o&&();&/span&
&span class=&kt&&int&/span& &span class=&n&&temp&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span&
&span class=&k&&while&/span& &span class=&o&&((&/span&&span class=&n&&temp&/span& &span class=&o&&=&/span& &span class=&n&&input&/span&&span class=&o&&.&/span&&span class=&na&&read&/span&&span class=&o&&())&/span& &span class=&o&&!=&/span& &span class=&o&&-&/span&&span class=&mi&&1&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&kt&&char&/span& &span class=&n&&ch&/span& &span class=&o&&=&/span& &span class=&o&&(&/span&&span class=&kt&&char&/span&&span class=&o&&)&/span& &span class=&n&&temp&/span&&span class=&o&&;&/span&
&span class=&n&&output&/span&&span class=&o&&.&/span&&span class=&na&&write&/span&&span class=&o&&(&/span&&span class=&n&&Character&/span&&span class=&o&&.&/span&&span class=&na&&toLowerCase&/span&&span class=&o&&(&/span&&span class=&n&&ch&/span&&span class=&o&&));&/span&
&span class=&o&&}&/span&
&span class=&n&&String&/span& &span class=&n&&outStr&/span& &span class=&o&&=&/span& &span class=&n&&output&/span&&span class=&o&&.&/span&&span class=&na&&toString&/span&&span class=&o&&();&/span&
&span class=&n&&input&/span&&span class=&o&&.&/span&&span class=&na&&close&/span&&span class=&o&&();&/span&
&span class=&n&&output&/span&&span class=&o&&.&/span&&span class=&na&&close&/span&&span class=&o&&();&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&out&/span&&span class=&o&&.&/span&&span class=&na&&println&/span&&span class=&o&&(&/span&&span class=&n&&outStr&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&ul&&li&说明:&/li&&ul&&li&流在使用结束后,一定要执行关闭操作,即调用close( )方法。&/li&&/ul&&/ul&&p&&br&&/p&&ul&&li&&b&3. 使用管道流在多个线程间通信&/b&:&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&cm&&/**&/span&
&span class=&cm&& * 消息发送类&/span&
&span class=&cm&& * */&/span&
&span class=&kd&&class&/span& &span class=&nc&&Send&/span& &span class=&kd&&implements&/span& &span class=&n&&Runnable&/span& &span class=&o&&{&/span&
&span class=&kd&&private&/span& &span class=&n&&PipedOutputStream&/span& &span class=&n&&out&/span& &span class=&o&&=&/span& &span class=&kc&&null&/span&&span class=&o&&;&/span&
&span class=&kd&&public&/span& &span class=&nf&&Send&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&n&&out&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&PipedOutputStream&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&n&&PipedOutputStream&/span& &span class=&nf&&getOut&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&out&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&run&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&n&&String&/span& &span class=&n&&message&/span& &span class=&o&&=&/span& &span class=&s&&&hello , Rollen&&/span&&span class=&o&&;&/span&
&span class=&k&&try&/span& &span class=&o&&{&/span&
&span class=&n&&out&/span&&span class=&o&&.&/span&&span class=&na&&write&/span&&span class=&o&&(&/span&&span class=&n&&message&/span&&span class=&o&&.&/span&&span class=&na&&getBytes&/span&&span class=&o&&());&/span&
&span class=&o&&}&/span& &span class=&k&&catch&/span& &span class=&o&&(&/span&&span class=&n&&Exception&/span& &span class=&n&&e&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&e&/span&&span class=&o&&.&/span&&span class=&na&&printStackTrace&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&k&&try&/span& &span class=&o&&{&/span&
&span class=&n&&out&/span&&span class=&o&&.&/span&&span class=&na&&close&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span& &span class=&k&&catch&/span& &span class=&o&&(&/span&&span class=&n&&Exception&/span& &span class=&n&&e&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&e&/span&&span class=&o&&.&/span&&span class=&na&&printStackTrace&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&span class=&cm&&/**&/span&
&span class=&cm&& * 接受消息类&/span&
&span class=&cm&& */&/span&
&span class=&kd&&class&/span& &span class=&nc&&Recive&/span& &span class=&kd&&implements&/span& &span class=&n&&Runnable&/span& &span class=&o&&{&/span&
&span class=&kd&&private&/span& &span class=&n&&PipedInputStream&/span& &span class=&n&&input&/span& &span class=&o&&=&/span& &span class=&kc&&null&/span&&span class=&o&&;&/span&
&span class=&kd&&public&/span& &span class=&nf&&Recive&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&input&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&PipedInputStream&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&n&&PipedInputStream&/span& &span class=&nf&&getInput&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&k&&return&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&input&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&run&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&kt&&byte&/span&&span class=&o&&[]&/span& &span class=&n&&b&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&kt&&byte&/span&&span class=&o&&[&/span&&span class=&mi&&1000&/span&&span class=&o&&];&/span&
&span class=&kt&&int&/span& &span class=&n&&len&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&o&&;&/span&
&span class=&k&&try&/span& &span class=&o&&{&/span&
&span class=&n&&len&/span& &span class=&o&&=&/span& &span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&input&/span&&span class=&o&&.&/span&&span class=&na&&read&/span&&span class=&o&&(&/span&&span class=&n&&b&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span& &span class=&k&&catch&/span& &span class=&o&&(&/span&&span class=&n&&Exception&/span& &span class=&n&&e&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&e&/span&&span class=&o&&.&/span&&span class=&na&&printStackTrace&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&k&&try&/span& &span class=&o&&{&/span&
&span class=&n&&input&/span&&span class=&o&&.&/span&&span class=&na&&close&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span& &span class=&k&&catch&/span& &span class=&o&&(&/span&&span class=&n&&Exception&/span& &span class=&n&&e&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&e&/span&&span class=&o&&.&/span&&span class=&na&&printStackTrace&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&out&/span&&span class=&o&&.&/span&&span class=&na&&println&/span&&span class=&o&&(&/span&&span class=&s&&&接受的内容为 &&/span& &span class=&o&&+&/span& &span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&String&/span&&span class=&o&&(&/span&&span class=&n&&b&/span&&span class=&o&&,&/span& &span class=&mi&&0&/span&&span class=&o&&,&/span& &span class=&n&&len&/span&&span class=&o&&)));&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&span class=&cm&&/**&/span&
&span class=&cm&& * 测试类&/span&
&span class=&cm&& */&/span&
&span class=&kd&&class&/span& &span class=&nc&&hello&/span& &span class=&o&&{&/span&
&span class=&kd&&public&/span& &span class=&kd&&static&/span& &span class=&kt&&void&/span& &span class=&nf&&main&/span&&span class=&o&&(&/span&&span class=&n&&String&/span&&span class=&o&&[]&/span& &span class=&n&&args&/span&&span class=&o&&)&/span& &span class=&kd&&throws&/span& &span class=&n&&IOException&/span& &span class=&o&&{&/span&
&span class=&n&&Send&/span& &span class=&n&&send&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&Send&/span&&span class=&o&&();&/span&
&span class=&n&&Recive&/span& &span class=&n&&recive&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&Recive&/span&&span class=&o&&();&/span&
&span class=&k&&try&/span& &span class=&o&&{&/span&
&span class=&c1&&//管道连接&/span&
&span class=&n&&send&/span&&span class=&o&&.&/span&&span class=&na&&getOut&/span&&span class=&o&&().&/span&&span class=&na&&connect&/span&&span class=&o&&(&/span&&span class=&n&&recive&/span&&span class=&o&&.&/span&&span class=&na&&getInput&/span&&span class=&o&&());&/span&
&span class=&o&&}&/span& &span class=&k&&catch&/span& &span class=&o&&(&/span&&span class=&n&&Exception&/span& &span class=&n&&e&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&e&/span&&span class=&o&&.&/span&&span class=&na&&printStackTrace&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&k&&new&/span& &span class=&n&&Thread&/span&&span class=&o&&(&/span&&span class=&n&&send&/span&&span class=&o&&).&/span&&span class=&na&&start&/span&&span class=&o&&();&/span&
&span class=&k&&new&/span& &span class=&n&&Thread&/span&&span class=&o&&(&/span&&span class=&n&&recive&/span&&span class=&o&&).&/span&&span class=&na&&start&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&ul&&li&&b&4. 使用缓冲区从键盘上读入内容:&/b&&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kd&&public&/span& &span class=&kd&&static&/span& &span class=&kt&&void&/span& &span class=&nf&&main&/span&&span class=&o&&(&/span&&span class=&n&&String&/span&&span class=&o&&[]&/span& &span class=&n&&args&/span&&span class=&o&&)&/span& &span class=&kd&&throws&/span& &span class=&n&&IOException&/span& &span class=&o&&{&/span&
&span class=&n&&BufferedReader&/span& &span class=&n&&buf&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&BufferedReader&/span&&span class=&o&&(&/span&
&span class=&k&&new&/span& &span class=&n&&InputStreamReader&/span&&span class=&o&&(&/span&&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&in&/span&&span class=&o&&));&/span&
&span class=&n&&String&/span& &span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&kc&&null&/span&&span class=&o&&;&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&out&/span&&span class=&o&&.&/span&&span class=&na&&println&/span&&span class=&o&&(&/span&&span class=&s&&&请输入内容&&/span&&span class=&o&&);&/span&
&span class=&k&&try&/span&&span class=&o&&{&/span&
&span class=&n&&str&/span& &span class=&o&&=&/span& &span class=&n&&buf&/span&&span class=&o&&.&/span&&span class=&na&&readLine&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&&span class=&k&&catch&/span&&span class=&o&&(&/span&&span class=&n&&IOException&/span& &span class=&n&&e&/span&&span class=&o&&){&/span&
&span class=&n&&e&/span&&span class=&o&&.&/span&&span class=&na&&printStackTrace&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&out&/span&&span class=&o&&.&/span&&span class=&na&&println&/span&&span class=&o&&(&/span&&span class=&s&&&你输入的内容是:&&/span& &span class=&o&&+&/span& &span class=&n&&str&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&ul&&li&&b&5. 将系统输出定向到文件:&/b&&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kd&&public&/span& &span class=&kd&&static&/span& &span class=&kt&&void&/span& &span class=&nf&&main&/span&&span class=&o&&(&/span&&span class=&n&&String&/span&&span class=&o&&[]&/span& &span class=&n&&args&/span&&span class=&o&&)&/span& &span class=&kd&&throws&/span& &span class=&n&&IOException&/span& &span class=&o&&{&/span&
&span class=&n&&File&/span& &span class=&n&&file&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&File&/span&&span class=&o&&(&/span&&span class=&s&&&/Users/liuluming/Documents/hello.txt&&/span&&span class=&o&&);&/span&
&span class=&c1&&// 此刻直接输出到屏幕&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&out&/span&&span class=&o&&.&/span&&span class=&na&&println&/span&&span class=&o&&(&/span&&span class=&s&&&hello&&/span&&span class=&o&&);&/span&
&span class=&k&&try&/span& &span class=&o&&{&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&setOut&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&PrintStream&/span&&span class=&o&&(&/span&&span class=&k&&new&/span& &span class=&n&&FileOutputStream&/span&&span class=&o&&(&/span&&span class=&n&&file&/span&&span class=&o&&)));&/span&
&span class=&o&&}&/span& &span class=&k&&catch&/span& &span class=&o&&(&/span&&span class=&n&&FileNotFoundException&/span& &span class=&n&&e&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&e&/span&&span class=&o&&.&/span&&span class=&na&&printStackTrace&/span&&span class=&o&&();&/span&
&span class=&o&&}&/span&
&span class=&n&&System&/span&&span class=&o&&.&/span&&span class=&na&&out&/span&&span class=&o&&.&/span&&span class=&na&&println&/span&&span class=&o&&(&/span&&span class=&s&&&这些内容在文件中才能看到哦!&&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&h2&&b&其他类:File&/b&&/h2&&p&File类是对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹。 File类保存文件或目录的各种元数据信息,包括文件名、文件长度、最后修改时间、是否可读、获取当前文件的路径名,判断指定文件是否存在、获得当前目录中的文件列表,创建、删除文件和目录等方法。
&/p&&h2&&b&其他类:RandomAccessFile&/b&&/h2&&p&该对象并不是流体系中的一员,其封装了字节流,同时还封装了一个缓冲区(字符数组),通过内部的指针来操作字符数组中的数据。 该对象特点:&/p&&ol&&li&该对象只能操作文件,所以构造函数接收两种类型的参数:a.字符串文件路径;b.File对象。&/li&&li&该对象既可以对文件进行读操作,也能进行写操作,在进行对象实例化时可指定操作模式(r,rw)。&/li&&/ol&&blockquote&&b&注意:&/b&&br&该对象在实例化时,如果要操作的文件不存在,会自动创建;如果文件存在,写数据未指定位置,会从头开始写,即覆盖原有的内容。 可以用于多线程下载或多个线程同时写数据到文件&/blockquote&
开胃菜先看一张网上流传的包的类结构图: 当你看到这幅图的时候,我相信,你跟我一样内心是崩溃的。有些人不怕枯燥,不怕寂寞,硬着头皮看源码,但是,能坚持下去全部看完的又有几个呢!然而,就算源码全部看完看懂,过不了几天,脑子…
记不住太正常了。计算机相关技术书籍,动不动就六七百页,还有不少上千页,有的甚至一千页都写不完,还要分卷。就我了解的Java 技术栈,要学的东西很多,一般情况下,每一样东西都至少有一本几百页的书,如果没有就更可怜了,你还得花更多时间去看项目文档,自己总结。这么多东西,谁要是记得住,他不是人,是神,至少在我心目中是神。&br&可是,该如何面对这种学了就忘造成的恐慌呢?我的看法是,&br&1.专注一个方向。不要既搞前端,又搞后端,既学Java ,又学php ,做前后端都不满足,还要去搞移动端。专注能让我们更快在一个领域游刃有余,可以减少恐慌。&br&2.要记住那么多东西,也不是才工作一年的人可以做到的。从了解到会用,从会用到熟练使用,从熟练使用到掌握原理,都需要时间。需要坦然面对忘记。&br&3.在一个领域耕耘久了,你才知道哪些知识对你是正真重要的,有的放矢。就像看论文,一篇论文写的还不错,你觉得这篇论文中的知识很重要,但是只有你知道了究竟有多少其他论文引用了这篇论文,你才知道它具体有多重要。这时,你才明白,哪些只需要了解,哪些需要会用,哪些需要熟练使用,哪些需要掌握原理。有些东西,忘了也不可惜。
记不住太正常了。计算机相关技术书籍,动不动就六七百页,还有不少上千页,有的甚至一千页都写不完,还要分卷。就我了解的Java 技术栈,要学的东西很多,一般情况下,每一样东西都至少有一本几百页的书,如果没有就更可怜了,你还得花更多时间去看项目文档…
&p&就当前一直到Java SE 9的Java而言,其实“内部类”是一个基本上只存在于Java语言层面,而不存在于JVM层面的一个概念。JVM并不关心一个类是顶层类还是内部类;在VM层面上唯一能表现类的嵌套关系的就是在Class文件里有记录的很少量的反射信息,会通过Java的反射API暴露出来(例如 java.lang.Class.getEnclosingClass()),但JVM自身在运行程序的时候并不需要也不使用这个信息。&/p&&p&所以这是怎么做到的?其实是Java语言编译器(例如javac、ECJ)在将Java源码编译到Class文件的过程中,将内部类做了“解糖”,给其添加一些必要的转换之后将其提升为跟顶层类一样的形式,然后后面就不再有内部类与否的区别了。于是JVM就不用关心什么是内部类了。&/p&&p&这方面又可以放我的老演示稿的传送门了:&a href=&///?target=http%3A//www.valleytalk.org/wp-content/uploads/2011/05/Java_Program_in_Action_.pdf& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://www.&/span&&span class=&visible&&valleytalk.org/wp-conte&/span&&span class=&invisible&&nt/uploads/2011/05/Java_Program_in_Action_.pdf&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&,其中第51页的Lower阶段就涉及了这个。&/p&&p&既然如此,JVM加载内部类的时机其实就跟加载任何类(包括顶层类与内部类)的时机一样:要表现为是在第一次主动使用时加载。主动使用包括new、getstatic、putstatic、invokestatic,以及Class.forName()作为一种特例。&/p&&p&在未来的Java版本里,有机会要引入一种新的结构叫做Nestmate,用于在编译时和运行时一致地描述类的嵌套关系,让JVM能够理解类的嵌套关系并做正确的处理(例如可访问性检查)。今年的JVMLS 2017上Karen大大的演讲对这方面讲得非常透彻了,请参考她的演讲:Frontiers of Access Controls: Modules and Nestmates&/p&&p&(你土鳖链接是 Ju2oqc6-mxE )&/p&
就当前一直到Java SE 9的Java而言,其实“内部类”是一个基本上只存在于Java语言层面,而不存在于JVM层面的一个概念。JVM并不关心一个类是顶层类还是内部类;在VM层面上唯一能表现类的嵌套关系的就是在Class文件里有记录的很少量的反射信息,会通过Java的反…
&p&看到题主是学习移动开发的,学习算法的目的是找工作需要,应该是应届生。&/p&&p&那么&b&,算法学习的最低目标就是通过校招求职的笔试、面试。&/b&&/p&&p&具体如何去备考呢?牛妹详细介绍一下校招笔试面试的算法通关秘籍:&/p&&p&&br&&/p&&p&&b&1、熟悉在线判题系统(Online Judge)&/b&&/p&&p&现在多数互联网IT企业的笔试编程题是在线判题,OJ系统跟本地编译存在一定的区别,比较常见的区别举几点:&/p&&p&· OJ需要循环输入输出&/p&&p&· 注意输入输出的格式&/p&&p&· 不提供测试用例&/p&&p&· 测试用例会有多组&/p&&p&&br&&/p&&p&熟悉在线判题系统对于笔试非常重要!非常重要!非常重要!&/p&&p&推荐一个视频和帖子供参考:&/p&&p&· &a href=&///?target=https%3A///courses/7& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&OJ(编程在线判题)入门介绍&i class=&icon-external&&&/i&&/a&&/p&&p&· &a href=&///?target=https%3A///discuss/8632& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&(经验贴)那些年在编程题中踩过的坑_技术交流&i class=&icon-external&&&/i&&/a&&/p&&p&&br&&/p&&p&&b&2、熟悉常考算法题型&/b&&/p&&p&校招最常考的算法类型主要是以下几类:&/p&&p&· 暴力枚举&/p&&p&· 动态规划&/p&&p&· DFS/BFS&/p&&p&· 数学问题&/p&&p&· 模拟现实&/p&&p&· 贪心算法&/p&&p&· 字符串算法&/p&&p&&br&&/p&&p&具体可以看一下我之前的一个回答:&/p&&p&&a href=&/question//answer/& class=&internal&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/question/2496&/span&&span class=&invisible&&4987/answer/&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&br&&/p&&p&&b&3、多多练习相关题目&/b&&/p&&p&&b&算法是绝对需要刷题的&/b&,大家最常刷的是这两个题库:&/p&&p&· &a href=&///?target=https%3A///ta/coding-interviews& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&剑指Offer&i class=&icon-external&&&/i&&/a&&/p&&p&· &a href=&///?target=https%3A///ta/leetcode& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&leetcode在线编程&i class=&icon-external&&&/i&&/a&&/p&&p&&br&&/p&&p&除此之外,还可以刷一下&b&企业的历年笔试真题&/b&:&/p&&p&· &a href=&///?target=https%3A///contestRoom%3FmutiTagIds%3D134& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阿里巴巴&i class=&icon-external&&&/i&&/a&&/p&&p&· &a href=&///?target=https%3A///contestRoom%3FmutiTagIds%3D138& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&腾讯&i class=&icon-external&&&/i&&/a&&/p&&p&· &a href=&///?target=https%3A///contestRoom%3FmutiTagIds%3D139& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&百度&i class=&icon-external&&&/i&&/a&&/p&&p&· &a href=&///?target=https%3A///contestRoom%3FmutiTagIds%3D151& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&京东&i class=&icon-external&&&/i&&/a&&/p&&p&· &a href=&///?target=https%3A///contestRoom%3FmutiTagIds%3D149& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&网易&i class=&icon-external&&&/i&&/a&&/p&&p&· &a href=&///?target=https%3A///contestRoom%3FmutiTagIds%3D239& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&华为&i class=&icon-external&&&/i&&/a&&/p&&p&· &a href=&///?target=https%3A///contestRoom%3FmutiTagIds%3D239_179& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&美团&i class=&icon-external&&&/i&&/a&&/p&&p&· &a href=&///?target=https%3A///contestRoom%3FmutiTagIds%3D239_179& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&滴滴&i class=&icon-external&&&/i&&/a&&/p&&p&· &b& href=&&a href=&///?target=https%3A///contestRoom& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/contestRoo&/span&&span class=&invisible&&m&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&&更多:100家名企笔试真题&/b&&/p&&p&&br&&/p&&p&&b&如果你的算法基础很薄弱,推荐两个视频课程供学习&/b&:&/p&&p&· &a href=&///?target=https%3A///live/124& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&牛课堂算法精讲直播讲座(2017)&i class=&icon-external&&&/i&&/a&&/p&&p&· &a href=&///?target=https%3A///study/vod/1/intro& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&直通BAT:面试算法精讲课&i class=&icon-external&&&/i&&/a&&/p&&p&&/p&
看到题主是学习移动开发的,学习算法的目的是找工作需要,应该是应届生。那么,算法学习的最低目标就是通过校招求职的笔试、面试。具体如何去备考呢?牛妹详细介绍一下校招笔试面试的算法通关秘籍: 1、熟悉在线判题系统(Online Judge)现在多数互联网IT企…
&p&前边两节课,我介绍了Java中的访问者模式,与Java的双重分派不同,C++在运行时识别一个对象的具体类型是需要一定的开销的,这个开销就是虚函数。&/p&&p&我们来仿照Java的访问者模式写一遍与之相对应的代码,看看会是什么效果:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&cp&&#include&/span&&span class=&cpf&&&iostream&&/span&&span class=&cp&&&/span&
&span class=&k&&using&/span& &span class=&k&&namespace&/span& &span class=&n&&std&/span&&span class=&p&&;&/span&
&span class=&k&&class&/span& &span class=&nc&&Visitor&/span&&span class=&p&&;&/span&
&span class=&k&&class&/span& &span class=&nc&&Animal&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&kt&&void&/span& &span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&n&&Visitor&/span& &span class=&o&&*&/span& &span class=&n&&v&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&&span class=&n&&cout&/span& &span class=&o&&&&&/span& &span class=&s&&&emmm..&&/span& &span class=&o&&&&&/span& &span class=&n&&endl&/span&&span class=&p&&;};&/span&
&span class=&p&&};&/span&
&span class=&k&&class&/span& &span class=&nc&&Dog&/span& &span class=&o&&:&/span& &span class=&k&&public&/span& &span class=&n&&Animal&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&kt&&void&/span& &span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&n&&Visitor&/span& &span class=&o&&*&/span& &span class=&n&&v&/span&&span class=&p&&);&/span&
&span class=&p&&};&/span&
&span class=&k&&class&/span& &span class=&nc&&Cat&/span& &span class=&o&&:&/span& &span class=&k&&public&/span& &span class=&n&&Animal&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&kt&&void&/span& &span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&n&&Visitor&/span& &span class=&o&&*&/span& &span class=&n&&v&/span&&span class=&p&&);&/span&
&span class=&p&&};&/span&
&span class=&k&&class&/span& &span class=&nc&&Fox&/span& &span class=&o&&:&/span& &span class=&k&&public&/span& &span class=&n&&Animal&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&kt&&void&/span& &span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&n&&Visitor&/span& &span class=&o&&*&/span& &span class=&n&&v&/span&&span class=&p&&);&/span&
&span class=&p&&};&/span&
&span class=&k&&class&/span& &span class=&nc&&Visitor&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Animal&/span& &span class=&o&&*&/span& &span class=&n&&animal&/span&&span class=&p&&)&/span& &span class=&p&&{&/span& &span class=&n&&cout&/span& &span class=&s&&&hooa~&&/span& &span class=&o&&&&&/span& &span class=&n&&endl&/span&&span class=&p&&;}&/span&
&span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Dog&/span& &span class=&o&&*&/span& &span class=&n&&animal&/span&&span class=&p&&)&/span& &span class=&p&&{}&/span&
&span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Cat&/span& &span class=&o&&*&/span& &span class=&n&&animal&/span&&span class=&p&&)&/span& &span class=&p&&{}&/span&
&span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Fox&/span& &span class=&o&&*&/span& &span class=&n&&animal&/span&&span class=&p&&)&/span& &span class=&p&&{}&/span&
&span class=&p&&};&/span&
&span class=&k&&class&/span& &span class=&nc&&Speaker&/span& &span class=&o&&:&/span& &span class=&k&&public&/span& &span class=&n&&Visitor&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Animal&/span& &span class=&o&&*&/span& &span class=&n&&pa&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&pa&/span&&span class=&o&&-&&/span&&span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Dog&/span& &span class=&o&&*&/span& &span class=&n&&pd&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&cout&/span& &span class=&o&&&&&/span& &span class=&s&&&wang~&&/span& &span class=&o&&&&&/span& &span class=&n&&endl&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Cat&/span& &span class=&o&&*&/span& &span class=&n&&pc&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&cout&/span& &span class=&o&&&&&/span& &span class=&s&&&miao~&&/span& &span class=&o&&&&&/span& &span class=&n&&endl&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Fox&/span& &span class=&o&&*&/span& &span class=&n&&pf&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&cout&/span& &span class=&o&&&&&/span& &span class=&s&&&woo~&&/span& &span class=&o&&&&&/span& &span class=&n&&endl&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&};&/span&
&span class=&kt&&void&/span& &span class=&n&&Dog&/span&&span class=&o&&::&/span&&span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&n&&Visitor&/span& &span class=&o&&*&/span& &span class=&n&&v&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&v&/span&&span class=&o&&-&&/span&&span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&kt&&void&/span& &span class=&n&&Cat&/span&&span class=&o&&::&/span&&span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&n&&Visitor&/span& &span class=&o&&*&/span& &span class=&n&&v&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&v&/span&&span class=&o&&-&&/span&&span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&kt&&void&/span& &span class=&n&&Fox&/span&&span class=&o&&::&/span&&span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&n&&Visitor&/span& &span class=&o&&*&/span& &span class=&n&&v&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&v&/span&&span class=&o&&-&&/span&&span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&kt&&int&/span& &span class=&n&&main&/span&&span class=&p&&()&/span& &span class=&p&&{&/span&
&span class=&n&&Animal&/span& &span class=&o&&*&/span& &span class=&n&&animals&/span&&span class=&p&&[]&/span& &span class=&o&&=&/span& &span class=&p&&{&/span&&span class=&k&&new&/span& &span class=&n&&Dog&/span&&span class=&p&&(),&/span& &span class=&k&&new&/span& &span class=&n&&Cat&/span&&span class=&p&&(),&/span& &span class=&k&&new&/span& &span class=&n&&Fox&/span&&span class=&p&&()};&/span&
&span class=&n&&Speaker&/span& &span class=&n&&s&/span&&span class=&p&&;&/span&
&span class=&k&&for&/span& &span class=&p&&(&/span&&span class=&kt&&int&/span& &span class=&n&&i&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span& &span class=&n&&i&/span& &span class=&o&&&&/span& &span class=&k&&sizeof&/span&&span class=&p&&(&/span&&span class=&n&&animals&/span&&span class=&p&&)&/span& &span class=&o&&/&/span& &span class=&k&&sizeof&/span&&span class=&p&&(&/span&&span class=&n&&Animal&/span& &span class=&o&&*&/span&&span class=&p&&);&/span& &span class=&n&&i&/span&&span class=&o&&++&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&s&/span&&span class=&p&&.&/span&&span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&animals&/span&&span class=&p&&[&/span&&span class=&n&&i&/span&&span class=&p&&]);&/span&
&span class=&p&&}&/span&
&span class=&k&&return&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&我们来编译运行这个程序看一下效果:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# g++ -o s speaker.cpp
&/code&&/pre&&/div&&p&怎么样?结果和你预料的一样吗?&/p&&p&为什么会这样呢?这是因为C++语言不同于Java,C++全部是静态类型,也就是说C++在编译阶段就已经决定了调用哪个函数,而不是在运行阶段决定的。具体来说,&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&s.visit(animals[i]);
&/code&&/pre&&/div&&p&这一行语句,调用的方法一定是&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&
&span class=&kt&&void&/span& &span class=&nf&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Animal&/span& &span class=&o&&*&/span& &span class=&n&&pa&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&pa&/span&&span class=&o&&-&&/span&&span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&&p&这一点与Java还是一样的,还比较容易理解,但接下来,accept方法就有所有不同了。在Java中,调用pa的accept方法,会根据pa的具体类型进行动态分派,但在C++中,却不会这样。当编译器分析到这里,它看到的pa就是Animal *类型的,那么pa-&accept就会静态绑定到Animal::accept方法,而不会根据pa的真实类型去做动态分派(我们也叫它运行时识别)。&/p&&p&那在C++中怎么解决这个问题呢?答案就是虚函数,在函数的定义前加上virtual关键字,那么这个函数在继承体系中,就具备了动态分派,或者叫做运行时识别的能力。简单来说,就是这样:&/p&&div class=&highlight&&&pre&&code class=&language-cpp&&&span&&/span&&span class=&k&&class&/span& &span class=&nc&&Visitor&/span&&span class=&p&&;&/span&
&span class=&k&&class&/span& &span class=&nc&&Animal&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&n&&Visitor&/span& &span class=&o&&*&/span& &span class=&n&&v&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&&span class=&n&&cout&/span& &span class=&o&&&&&/span& &span class=&s&&&emmm..&&/span& &span class=&o&&&&&/span& &span class=&n&&endl&/span&&span class=&p&&;};&/span&
&span class=&p&&};&/span&
&span class=&k&&class&/span& &span class=&nc&&Dog&/span& &span class=&o&&:&/span& &span class=&k&&public&/span& &span class=&n&&Animal&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&n&&Visitor&/span& &span class=&o&&*&/span& &span class=&n&&v&/span&&span class=&p&&);&/span&
&span class=&p&&};&/span&
&span class=&k&&class&/span& &span class=&nc&&Cat&/span& &span class=&o&&:&/span& &span class=&k&&public&/span& &span class=&n&&Animal&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&n&&Visitor&/span& &span class=&o&&*&/span& &span class=&n&&v&/span&&span class=&p&&);&/span&
&span class=&p&&};&/span&
&span class=&k&&class&/span& &span class=&nc&&Fox&/span& &span class=&o&&:&/span& &span class=&k&&public&/span& &span class=&n&&Animal&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&n&&Visitor&/span& &span class=&o&&*&/span& &span class=&n&&v&/span&&span class=&p&&);&/span&
&span class=&p&&};&/span&
&span class=&k&&class&/span& &span class=&nc&&Visitor&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Animal&/span& &span class=&o&&*&/span& &span class=&n&&animal&/span&&span class=&p&&)&/span& &span class=&p&&{}&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Dog&/span& &span class=&o&&*&/span& &span class=&n&&animal&/span&&span class=&p&&)&/span& &span class=&p&&{}&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Cat&/span& &span class=&o&&*&/span& &span class=&n&&animal&/span&&span class=&p&&)&/span& &span class=&p&&{}&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Fox&/span& &span class=&o&&*&/span& &span class=&n&&animal&/span&&span class=&p&&)&/span& &span class=&p&&{}&/span&
&span class=&p&&};&/span&
&span class=&k&&class&/span& &span class=&nc&&Speaker&/span& &span class=&o&&:&/span& &span class=&k&&public&/span& &span class=&n&&Visitor&/span& &span class=&p&&{&/span&
&span class=&k&&public&/span&&span class=&o&&:&/span&
&span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Animal&/span& &span class=&o&&*&/span& &span class=&n&&pa&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&pa&/span&&span class=&o&&-&&/span&&span class=&n&&accept&/span&&span class=&p&&(&/span&&span class=&k&&this&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Dog&/span& &span class=&o&&*&/span& &span class=&n&&pd&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&cout&/span& &span class=&o&&&&&/span& &span class=&s&&&wang~&&/span& &span class=&o&&&&&/span& &span class=&n&&endl&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Cat&/span& &span class=&o&&*&/span& &span class=&n&&pc&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&cout&/span& &span class=&o&&&&&/span& &span class=&s&&&miao~&&/span& &span class=&o&&&&&/span& &span class=&n&&endl&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&k&&virtual&/span& &span class=&kt&&void&/span& &span class=&n&&visit&/span&&span class=&p&&(&/span&&span class=&n&&Fox&/span& &span class=&o&&*&/span& &span class=&n&&pf&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&n&&cout&/span& &span class=&o&&&&&/span& &span class=&s&&&woo~&&/span& &span class=&o&&&&&/span& &span class=&n&&endl&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&};&/span&
&/code&&/pre&&/div&&p&可以看到,整个程序其他的地方全都没改,只是把accept方法和visit方法变成了virtual而已。那么我们再运行这个程序看一下:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&# g++ -o v visitor.cpp
&/code&&/pre&&/div&&p&这一次就能正确地打印了。&/p&&h2&双重分派的缺点&/h2&&p&有同学可能会有疑惑,为什么C++不默认把动态分派做为一种语言特性,而是要通过virtual关键字来手动打开呢?(大家理解一下,其他Java就是把动态分派做为默认的语言特性,相当于说Java中所有的方法都是virtual的)&/p&&p&这主要是出于性能上的考虑。因为C++是要直接编译生成二机制机器码的(初学者的话,就理解成汇编代码吧),在编译阶段就能确定知道我要调用的函数是哪一个,那就把这个函数的地址直接填到 call 指令那里,这样无疑是最快的。而如果是动态分派的话,就需要在运行时维护一些额外的数据结构(后面我会介绍Java对象和C++对象在内存中的布局,这样大家就能明白这个需要额外维护的数据结构是什么了)。而维护这个数据结构,会使性能受到很大的影响。所以在C++中开启virtual是一件需要进行权衡和取舍的事情。&/p&&p&而反观Java,由于Java的优化编译是运行时执行的,能把这些额外的数据结构最后优化到JIT代码中去,反倒不用担心这个问题了。从这里也可以看出,那些觉得Java运行速度慢的人,很多人并不了解事情的真相,只是人云亦云罢了。Java的快或者慢都必须拿到特定的场景下去讨论,Java有时比C++运行更快,也不是不可能。&/p&&h2&JVM中的实际例子&/h2&&p&我的课程中的设计模式都是分开来讲的,用到哪一部分就讲哪一部分。当时,会讲访问者模式是因为在GC算法中,使用了OopClosure这一个典型的访问者模式。我们还是再回到出发点上来。&/p&&p&我们看这节课中的例子,&a href=&/p/& class=&internal&&Copy GC(3) : JVM中的实现&/a&:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&void DefNewGeneration::
oop_since_save_marks_iterate_v(OopsInGenClosure* cl) {
cl-&set_generation(this);
// 前面的注释讲了_saved_mark_word在eden和from中是没有用的。
// 下面第一,第三行删掉也不会出错。这两行算是遗留代码了。
eden()-&oop_since_save_marks_iterate_v(cl);
// 只有这一行有用。
to()-&oop_since_save_marks_iterate_v(cl);
from()-&oop_since_save_marks_iterate_v(cl);
cl-&reset_generation();
save_marks();
&/code&&/pre&&/div&&p&oop_since_save_marks_iterate_v的作用就是遍历to space中的每一个对像。这和我们例子中,遍历数组,对数组中的每一个对像执行visit方法是一样的。现在呢,Visitor的实例就是代码中的cl。cl 的类型是 OopsInGenClosure,它继承自 OopClousre,而OopClosure的定义是这样的:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&class OopClosure : public Closure {
virtual void do_oop(oop* o) = 0;
virtual void do_oop_v(oop* o) { do_oop(o); }
virtual void do_oop(narrowOop* o) = 0;
virtual void do_oop_v(narrowOop* o) { do_oop(o); }
&/code&&/pre&&/div&&p&这个定义就是说,如果你想对现在正在访问的对象 o 做什么操作的话,那就把这个操作封装到一个Closure中。而对于ScanClosure中的do_oop_work做了什么,我们已经在那一节课中分析过来。&/p&&p&好了,理解了访问者模式,再回过头来看ScanClosure,XXXClosure是不是就毫无压力了?&/p&&p&这节课就到这里。&/p&&p&作业:&/p&&p&再回过头把JVM中的GC算法重新看一遍,看看是不是融汇贯通了。&/p&&p&上一节课:&a href=&/p/& class=&internal&&访问者模式&/a&&/p&&p&下一节课:&/p&&p&课程目录:&a href=&/p/?refer=hinus& class=&internal&&课程目录&/a&&/p&&p&&/p&
前边两节课,我介绍了Java中的访问者模式,与Java的双重分派不同,C++在运行时识别一个对象的具体类型是需要一定的开销的,这个开销就是虚函数。我们来仿照Java的访问者模式写一遍与之相对应的代码,看看会是什么效果:#include&iostream&
using namespace …
&p&追本溯源,理解场景。&/p&&p&比如我们讲排序,你可能会想到快排/归并/希尔等等,然而成熟的排序算法,不会是单一的一种算法。&/p&&p&比如我们讲存储,讲索引,会说B树,其实这个是配合机械磁盘特性来讲的,多次查询的效率远低于一次查询连续的数据,磁头要来回移动,而SSD顺序读取和随机读取是一样的,B树其实没有那么有优势了。&/p&&p&然而索引只有B树么,hash也可以做索引,那么相比B树的缺陷是什么,hash怕碰撞,要解决冲突,不能做索引排序等等一堆限}

我要回帖

更多关于 java 自定义标签 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信