您的位置:首页 > 编程语言 > Java开发

java核心技术复习笔记(二)

2017-03-27 21:18 579 查看

构建字符串:

采用字符串连接的方式达到此目的的效率比较低。每次链接一个新的字符串,都需要构建一个新的String 对象,既费时间又费空间。
StringBuilder builder = new StringBuilder();
每次需要添加一部分内容时,就调用append方法。
builder.append(ch);//appends a single character
builder.append(str);//appends a string
需要创建一个String对象,其中包含了构建器中字符序列。
String completedString = builder.toString();

StringBuilder类中包含的重要方法。
java.lang.StringBuilder 5.0
StringBuilder();
制造一个空的字符串构建器。
int length();
返回构建器或缓冲器中的代码单元数量。
StringBuilder append(String str)
追加一个字符串并返回this。
StringBuilder appendCodePoint(int cp);
追加一个代码点,并将其转换为一个或两个代码单元并返回this。
void setCharAt(int i,char c);
将第i个代码单元设置为c。
StringBuilder insert(int offset,String str);
在offset位置插入一个字符串并返回this。
StringBuilder delete(int startIndex,int endIndex);
删除偏移量从startIndex到-endIndex-1的代码单元并返回this。
String toString();
返回一个与构建器或缓冲期内容相同的字符串。


3.7输入输出

程序需要使用GUI收集用户的输入


读取输入:

与打印输出到“标准输出流”相不同,读取标准输入流需要构造一个Scanner对象,并与System.in“标准输入流”关联。
Scanner in = new Scanner(System.in);
此时便可以使用Scanner类的各种方法实现输入操作了。
String name = in.nextLine();//nextLine方法将输入一行。
String firstName = in.next();//想要读取一个单词
String age = in.nextInt();//想要读取一个整数

类似的,想要读取下一个浮点数,就调用nextDouble方法。
Scanner类定义在java.util.*包中。

因为输入可见的,所以Scanner类不适用于从控制台读取代码。java SE6 引入了Console类以实现这个目的。想要读取一个密码,采用下列代码:
Console cons = System.console();
String username = cons.readLine("User name :");
char[] passwd = cons.readPassword("Password:");
为了安全起见,返回的密码存放在一维字符数组中,而不是字符串中。对密码进行处理后,应该马上用一个填充值覆盖数组元素。采用Console对象处理输入,不如Scanner方便。每次只能读取一行输入,而没有能够读取一个单词或一个整数值的方法。

Scanner(InputStream in);
用给定的输入流创建一个Scanner对象;
String nextLine();
读取下一行内容;
String next();
读取下一个单词(以空格作为分隔符);
int nextInt();
double nextDouble();
读取并转换下一个表示整数或浮点数的字符序列。
boolean hasNext();
检测输入中是否还有其他单词。
boolean hasNextInt();
boolean hasNextDouble();
检测是否还有表示整数或浮点数的下一个字符序列

java.lang.System1.0;
static Console  console()6
如果有可能进行交互操作,就通过控制台为交互的用户返回一个    Console对象,否则返回null。
static char[] readPassword(String prompt,Object args);
static String readLine(String prompt,object ...args);
显示字符串prompt并且读取用户输入,知道输入行结束。Args参数可以用来输入格式。有关这部分内容将在下一节中介绍。


格式化输出:

可以使用System.out.print(x)将数值输出到控制台上。这条命令将以x对应的数据类型所允许的最大非零数字位数位数打印输出x。
double  x= 10000.0/3.0;
System.out.print(x);
打印3333.333333333335;
调用System.out.printf("%8.2f",x);
printf中可以使用多个参数:
System.out.printf("Hello ,%s.next year,you'll be %d",name,age);

另外,还可以给出控制格式化输出的各种标志。表3-6列出了所有的标志![这里写图片描述](http://img.blog.csdn.net/20170327212543284?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGd5dTkzMDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
System.out.printf("%,.2f",10000.0/3.0);
3,333.33

可以使用s转换符格式化任意对象。对于任意实现了Formattable接口的对象都将调用formatTo方法;否则将调用toString方法,它可以将对象转换为字符串。
String.format方法创建一个格式化的字符串,而不打印输出;
出于完整性考虑,简略介绍printf方法中日期与时间的格式化选项。示例如下:
System.out.printf("%tc",new Date());
此语句打印的格式为:
Mon Feb 09 18:05:19 PST 2004
![这里写图片描述](http://img.blog.csdn.net/20170327214028309?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGd5dTkzMDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

![这里写图片描述](http://img.blog.csdn.net/20170327214130867?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGd5dTkzMDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
表中某些格式只给出了指定日期的部分信息。如果需要多次对日期操作才能实现对每一部分进行格式化的目的就太笨拙了。为此采用了一个格式化的字符串指出要被格式化的参数索引。索引必须紧跟在%后面,并以$终止。
System.out.printf("%1$s %2$tB %2$te ,%2$Y","Due date:",new Date());
打印Due date:February 9,2004
还可以使用<标志。它指示格式说明中的参数将被再次使用。也就是说,下列语句将产生与前面语句同样的输出结果。
System.out.printf("%s %tB %<te ,%<tY","Due date:",new Date());

图3-6给出了格式说明符的语法图
![这里写图片描述](http://img.blog.csdn.net/20170327215528341?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGd5dTkzMDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)


对文件输入与输出:

对文件进行读取,就需要一个用File对象构造一个Scanner对象
Scanner in = new Scanner(new file("myfile.txt"));
如果文件名中包含反斜杠符号,就要记住在每个反斜杠之前再额外加一个反斜杠:“c:\\mydirectory\\myfile.txt”.
想写入文件,就需要构造一个PrintWriter对象。在构造器中,只需要提供文件名:
PrintWriter out = new PrintWriter("myfile.txt");
如果文件不存在,则可以想输出到System.out一样使用print、println以及printf命令。
当指定相对文件名时,使用下面的方式找到路径的位置:
String dir =System.getProperty("user.dir");
也可以考虑使用绝对路径,例如:“c:\\mydirectory\\myfile.txt”或者"/home/me/mydirectory/myfile.txt"
正如上方所述,访问文件与使用System.in和System.out一样容易。
如果用一个不存在的文件构造Scanner,或者用一个不能被创建的文件名构造一个PrintWriter,那么就会发生异常。
java编译器认为这些异常会比“被0整除”异常更严重。这需要在main方法中用throws子句标记,如下所示:
public static void main(String[] args)throws FileNodFoudException
{
Scanner in = new Scanner(new File("myfile.txt"));
}

当采用命令行方式启动一个程序时,可以利用重定向将任意文件捆绑到System.in和 System.out:
java MyProg <myfile.txt>output.txt
这样就不必担心处理FileNotFoundException异常了

java.util.Scanner 5.0
Scanner (File f)
构造从给顶文件读取数据的Scanner。
Scanner (String data)
构造一个从给定字符串读取数据的Scanner。

java.io.PrintWriter 1.1
PrintWriter(File f)
构造一个将数据写入给定文件的PrinterWriter。
PrinterWriter(File fileName)
构造一个数据写入文件的PrinterWriter,文件名 由参数指定。

File(String fileName)
用给定文件名,构造一个描述文件的file对象。注意这个文件当前不必存在。


3.8控制流程

java的控制流程结构与c和c++一样,只有很少的例外情况。
没有goto语句;
变形的for循环,类似于C#中的foreach循环;


块作用域:

不能再嵌套的两个块儿中生命同名变量。

在c++中内层定义会覆盖外层定义的变量。这样,有可能会导致程序设计错误,因此在java中不允许这样做。


条件语句:

使用块(有时称为复合语句)可以在java程序结构中原本只放一条简单语句的地方放置多条语句。


循环:

while(condition)statement;
do statement while condition;


确定循环:

for语句;

与C++一样,尽管java允许在for循环的各个部分放置任何表达式,但有一条不成文的规则:for语句的三个部分,应该对同一计数器进行初始化,检测,更新。

在循环中,检测两个浮点数是否相等需要格外小心。下面的for循环:for(double i=10.0;i!=10;i+=0.1);可能永远也不会结束,由于舍入误差,永远也得不到精确值。


多重选择switch语句:

int choice = in.nextInt();
switch(choice){

case 2:
...
break;
case 3:
...
break;
case 4:
...
break;
default:
...
break;
}
case标签必须是整数或枚举常量,不能测试字符串
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java