字符串
字符串(String)类型为常量,值改变时会直接新建对象,多次改变值时造成资源浪费(Java中有常量池机制缓解此问题),更好的使用stringbuffer
对字符串,equals比较的是值,==比较的是否是同一个对象
常量池:用于存放产生的常量,对string说,有值相同的则不会新建对象(String s= "123";不会新建,String s= new String("123");会新建对象),而是把指针放到同一对象(所以没有new的话,值相同,指向同一对象,==返回true.)
注:有new的话,一定是不同对象,不管值一样不一样。没有new(String s="123";)
public class StringEx
{
public static void main(String args[])
{
String s1="123";
String s2="123";
String s3=new String("123");
String s4=new String("123");
String s5=new String();
s5="123";//此操作会与常量池中存储的内容比较
System.out.println (s5==s1);
//输出:true
//s2="123";使s5对象的指针指向和s1(在常量池中)相同的地方
//原理:常量池中不会有重复的字符串
}
}
StringBuffer和StringBuilder
StringBuffer比String效率要高的多
对比StringBuffer和StringBuilder:
StringBuffer可应用于多线程,StringBuilder只能应用与单线程
StringBuilder略快于StringBuffer
s5="abc";
StringBuffer sb=new StringBuffer("abc");
s5.concat("123");//两种对象的连接字符方法不同
sb.append("123");
System.out.println (s5);
long l1=System.currentTimeMillis();//获得当前时间
for(int i=0;i<1000;i++)
{
s5=s5.concat(i+"");
}
long l2=System.currentTimeMillis()-l1;
long l3=System.currentTimeMillis();
for(int j=0;j<10000;j++)
{
sb=sb.append(j+"");
}
long l4=System.currentTimeMillis()-l3;
//证明StringBuffer比String效率要高的多
System.out.println ("Sring:"+l2+"\nStringBuffer:"+l4);
/*对比StringBuffer和StringBuilder:
*StringBuffer可应用于多线程,StringBuilder只能应用与单线程
*StringBuilder略快于StringBuffer
**/
StringBuilder sbd=new StringBuilder("abc");
long l5=System.currentTimeMillis();
for(int i=0;i<10000;i++)
{
sbd.append(i);
}
long l6=System.currentTimeMillis()-l5;
System.out.println (l6);
String s1="3a";
System.out.println(s1.matches("[0-9]."));//输出true
String s2="5";
s2.matches("[0-9].");//false
s2.matches("[0-9]?.");//true ?表示前边类型出现0或1次
String s3="5456895a";
s3.matches("[0-9]*.");//true *表示前边类型出现几次都可以
+表示大于一次
{n}表示出现n次
[ap]//是a或p,严格区分大小写
"43ap".matches("[0-9]+[ap]{2}");//true
String s3[]={"7aa","234234aa","45645ap","43aP","3PP"};
String ss="[0-9]+[aP]{2}";
for(String s2:s3)//表示把s3中的元素逐个取给s2
{
System.out.println (s2+":"+s2.matches(ss));
}
String s4="12ap345aq46ab345vr";
System.out.println(s4+""+s4.matches("([0-9]+[a-zA-Z]{2})+"));//[a-zA-Z]表示所有大小写字母
//"()+"表示括号内的内容可循环
[a-zA-Z]表示所有大小写字母
"()+"表示括号内的内容可循环
字符串的排序
Math
Math不可继承(为最终类),不可new对象(构造器是私有的)
Math.floor(double);//返回值为double,返回小于参数的最大整数
Math.floor(-5.6);//返回-6.0
Math.ceil(double);//返回大于参数的最小的double整数
Math.round(float/double);//返回int/long,四舍五入
Math。random();//返回[0.0,1.0)