JavaSE(javaAPI)Day012012/1/20====================JavaAPIJava系统类库Java类库Java核心的API(最常用的API类)字符串,集合,IO,线程,网络,反射等Swing(很少用)API都是类文件,在rt.jar中1String字符串String字符串=char[]+操作(toUpperCase(),concat())String的底层就是char[]数组,是char[]数组的封装类类:数据+相关的操作char数组只是数据,没有操作一串字符就是字符串:char[],String,StringBuilder1字符串字面量(直接量)都是String类型实例字符串常量publicstaticfinalStringTYPE=car;/////////常量字面量/直接量Stirng内部就是一个char[].2StringAPI有一个实现原则:对象内容永远不变也就是说:String对象永远不变.为性能提供极致的优化!StringAPI如果改变内容就返回新字符串,否则返回原字符串StringBuffer与StringBuilder的区别与比较1)StringBuffer是线程安全的可变字符序列。StringBuilder是一个可变的字符序列。2)StringBufferimportjava.util.Arrays;/**字符串数组与String类的原理*/publicclassP2_CharArrayDemo{publicstaticvoidmain(String[]args){System.out.println(Java可以将char[]作为字符串处理);char[]chs1={'北','京'};char[]chs2={'我','爱','你'};System.out.println(chs1);//北京System.out.println(char[]运算需要编程处理,如连接:);char[]chs3=Arrays.copyOf(chs1,chs1.length+chs2.length);//System.arraycopy(Objectsrc,intsrcPos,//Objectdest,intdestPos,intlength)//:从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。//System.arraycopy(src,srcPos,dest,destPos,length);System.arraycopy(chs2,0,chs3,chs1.length,chs2.length);System.out.println(chs3);//北京我爱你System.out.println(StringAPI提供了简洁的连接运算:);Strings1=北京;Strings2=我爱你;Strings3=s1.concat(s2);//StringAPI方法System.out.println(字符串转大写底层原理:);char[]chs4={'A','a','c','f'};char[]chs5=Arrays.copyOf(chs4,chs4.length);for(inti=0;ichs5.length;i++){charc=chs5[i];if(c='a'&&c='z'){chs5[i]=(char)(c+'A'-'a');//}}}}packageDay5;/**StringAPI方法演示:字符串对象是不变的*/publicclassP2_StringAPIDemo{publicstaticvoidmain(String[]args){System.out.println(StringAPI不改变String对象内容:);Strings1=ABCD;Strings2=Abcd;//字符串(原)对象是不变的!StringAPI不改变String对象内容Strings3=s1.toUpperCase();//不需要改变,返回原对象Strings4=s2.toUpperCase();//需要改变,返回新对象System.out.println(s1:+s1+,s3:+s3);System.out.println(s1==s3:+(s1==s3));System.out.println(s2:+s2+,s4+s4);System.out.println(s2==s4:+(s2==s4));System.out.println(String和char[]可以相互转换:);char[]chs={'我','爱','中','国'};Stringchina=newString(chs);System.out.println(china);Stringstr=龙年吉祥;chs=str.toCharArray();System.out.println(chs);//龙年吉祥}}/**理解String内存存储机制的一个经典程序*/publicclassP2_StringParamDemo{publicstaticvoidmain(String[]args){Strings=AA;char[]chs={'A','A'};test(s,chs);System.out.println(s);//AASystem.out.println(chs);//SA}publicstaticvoidtest(Stringstr,char[]chs){str=BC;chs[0]='S';chs=str.toCharArray();}}importjava.util.Arrays;/***StringBuilder一个可变的字符序列。*/publicclassP3_StringBufferVSStringBuilder{publicstaticvoidmain(String[]args){/**StringBuilder:变成算法维护的char[],使用与大量字符内容的操作*/char[]chs=newchar[4];//4个缓存空间intsize=0;//字符数量chs[size++]='中';chs[size++]='国';chs[size++]='北';chs[size++]='京';//char[]数组的变成算法(扩容)chs=Arrays.copyOf(chs,chs.length*2);chs[size++]='!';StringBuilderbuf=newStringBuilder(4);buf.append('国');buf.append('北');buf.append('京');buf.append('!');buf.insert(0,'中');System.out.println(************************************);}}/**StringBuilder和String的连接性能测试*/publicclassP4_StringBuilderVSStringDemo{publicstaticvoidmain(String[]args){Stringstr=Hello,;Stringstr2=str+World;//String字符串常量,创建之后不能再改变。System.out.println(str==str2);StringBuildersb=newStringBuilder();//falsesb.append('中');sb.append('国');sb.append('我');sb.append('爱');sb.insert(1,'你');StringBuildersb2=sb.replace(0,1,中国);//StringBuilder创建之后可以再改变。System.out.println(sb==sb2);//trueSystem.out.println(*************************************);/**String字符串常量,创建之后不能再改变;StringBuilder创建之后可以再改变。*当对String类进行连接时,会产生新的对象;*而对StringBuilder进行连接操作不会产生新的对象。*因此StringBuilder的连接操作比String块很多。*/System.out.println(testString(50000));//5063System.out.println(testStringBuilder(50000));//0}publicstaticlongtestString(intn){longstart=System.currentTimeMillis();Strings=;for(inti=0;in;i++){s+=A;}longend=System.currentTimeMillis();returnend-start;}publicstaticlongtestStringBuilder(intn){longstart=System.currentTimeMillis();StringBuilderbuf=newStringBuilder();for(inti=0;in;i++){buf.append(A);}longend=System.currentTimeMillis();returnend-start;}}3String字面量(直接量),如果相同,会替换为同一个String对象的引用,常量连接的结果也被优化为一个字符串.Strings=newString(abc);/***静态String字面量/常量的性能优化现象:*1)字面量和常量的连接运算在编译期间运行*2)String提供静态字符串常量池*3)运行期间String字面量/常量,尽量使用静态池中的*同一个实例。池中没有就在池中创建。*4)动态创建的字符串不能使用静态池优化性能。*/publicclassStaticStringDemo{publicstaticfinalintI=123;publicstaticfinalStringS=123ABC;publicstaticvoidmain(String[]args){Strings1=123ABC;//s1=123ABCStrings2=123+ABC;//s1=123ABCStrings3='1'+23ABC;//s1=123ABCStrings4='1'+'2'+'3'+ABC;//s1=150ABCStrings5=1+2+3+ABC;//s1=123ABCStrings6=123+ABC;//s1=123ABCStrings7=1+2+3+ABC;//s7=6ABCStrings8=S+;//s1=123ABCStrings9=I+ABC;//s1=123ABCStringss=ABC;//编译期,不处理,运算期间运算。Strings10=123+ss;//编译期,不处理,运算期间运算。Strings11=newString(123ABC);//运行期间运算。////newString(123ABC);运行期间运算Strings12=newString(123+ABC);System.out.println(s1=+s1);System.out.println(s2=+s2);System.out.println(s3=+s3);System.out.println(s4=+s4);System.out.println(s5=+s5);System.out.println(s6=+s6);System.out.println(s7=+s7);System.out.println(s8=+s8);System.out.println(s9=+s9);System.out.println(*************************);System.out.println(S==s1);//trueSys