重温《JAVA编程思想》----2017.1.16 字符串类(无正则表达式)

1.String对象不变:

String对象是不变的(只读性,指向它的任何引用都不会改变它的值,它也不会对其他引用有什么影响)String类中的每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。最初的String对象没有任何变化。

 

 

2.重载+StringBuilder

我们可以联想一种情况:

String apple = Apple;

String fruit = Orange+apple+Banana+............+Tomato;

1我们可以知道,String对象不变,+操作对修改String的值,如果我们的+操作

没有经过“特殊处理”的话,那么我们上述的过程需要生成很多的String对象,有 Orange,Banana,Tomato等等,这样的方式会产生很多需要垃圾回收的中间对象(因为 最后要的是fruit对象),所以这样的做法是效率低下的。

 

所以,编译器对String类的++=操作进行了优化,优化的核心是:编译器自动引 入了StringBuilder类,+操作就是调用StringBuilder.append()方法,最后调用 StringBuilder.toString()方法。这样其实只生成了一次StringBuilder对象,就构成了最 终的String,效率更好,占用堆内存更少。

 

 

 

关于StringBuidler的问题:

 

既然编译器对我们的String操作进行了优化,那么我们是不是应该肆无忌惮的使用String对象呢? 答案是否定的:

 

 

public static String evertTime(String[] content){

String result ="String:";

for(int i=0;i<content.length;i++){

result +=content[i];

}

return  result;

}

 

 

 

public static String once(String[] content){

StringBuilder builder = new StringBuilder();

for(int i=0;i<content.length;i++){

builder.append(content[i]);

}

return  builder.toString();

}

 

 

比较:在书中写道,第一种方法的JVM编译代码显示,其中有一个循环体,并且在执行一定程度的时候返回到循环起始点,也就是在循环中循环多次,每次循环都会创建1StringBuilder对象,而第二种方法就是只循环1次,只生成1StringBuidler对象;

 

结论:当你为一个类编写toString()方法的时候,如果字符操作比较简单,直接相信编译器就好,如果你的字符操作里有循环,你最好自己创建1StringBuidler对象,自己来构造最终的结果。但是如果你自己想走捷径:append(a+:+b),那么编译器就会为你创建另一个新的StringBuilder(这里可以理解为只要有一连串的+操作,编译器就会为我们创建新的StringBuidler)

 

3.String操作:String操作有一个规律,就是所有改变String内容的操作,都新生成一个String对象,如果内容没发生改变,只是返回原对象的引用而已。

 

 

几个方法:

charAt();----取得位置上的char

startsWith();--boolean

endsWith();--boolean

indexOf();

subString();

concat();--连接String

replace();

trim();--删除String两端空白,返回新String对象,若没变,则返回原始String对象。

 

4.System,out,piintf()System.out.format():

int x = 10;

double y = 1.22d;

System.out.printf("Bod is %d and %f \n", x,y);

System.out.format("Bod is %d and %f \n", x,y);

 

 

 

 

 

5.Formatter:

Java中,所有新的格式化功能都由Formatter类提供,它就是一个翻译器,它可以把你的格式化字符串翻译成所需要的结果。

Formatterxxx)构造器中可以传递一个参数,告知它最终结果可以传到哪里,最常用的是PrintStream,OutputStreamFile

 

Formatter f = new Formatter(System.out); --构造器中标明结果最终传向哪里。

f.format("Bod is %d and %f \n", x,y);

 String.format()是一个static方法,生成格式化的String对象但是它的内部还是靠着Formatter类实现的。

 

 

 

6.格式化说明符:

 

%[-][width][.precision]类型

 

 

默认情况,数据右对齐,-让他左对齐。

widtn表明数据最小长度,不够自动空格补齐

.precision String类型的时候表示字符长度,在浮点型的时候表示小数点位数

最后再加上想要的类型 s x h b 等等。

 

d 整数型

c Unicode字符型

b Boolean

s String

f 浮点型

E 浮点数 科学计数

x 整数型 16进制

h 散列码 16进制

 

 

7.StringReader把String转化为可读的流对象。

 

 

8.扫描输入:从文件中或标准输入读取数据一般的解决办法是读取一行文本,例如BufferReader的readLine();

            Java SE5新增了Scanner类,他具有很好的扫描功能。Scanner构造器可以接受任何类型的输入对象,File,InputStream,String或者Readable(具有read()方法的某种东西)等等。有了Scanner,所有的输入、分词以及翻译的操作都隐藏在更种类型的next方法中。nextInt(),nextDouble()等等。

     Scanner有一个假设,在输入结束时抛出IoException。

猜你喜欢

转载自blog.csdn.net/mypromise_tfs/article/details/54599169
今日推荐