String
常量池:虚拟机必须为每个被装载的类型维护一个常量池,就是该类型用到的常量的一个有序集合,包括直接常量和对其他类型,字段和方法的符号引用。
String常量和String对象
String str1="abc"; //可能会创建一个或者不创建对象,如果"abc"这个字符串在常量池中不存在,就会在常量池中创建一个Strin对象,然后将str1指向这个对象;如果在常量池中存在"abc",则将"abc"的地址指向str1。
String str2=new String("abc"); //至少会创建一个对象,也可能创建两个对象。因为用到了new关键字,肯定会在堆中创建一个str2的String对象,他的值是"abc"。同时如果这个字符串在常量池中不存在,则会在常量池中创建这个String对象"abc"。
String s1=new String("kill"); //在堆中创建s1对象,常量池中没有"kill",创建常量池对象"kill"
String s2="kill";
System.out.println(s1);
System.out.println(s2);
System.out.println(s1==s2);//false 常量池的对象kill和堆中的对象kill
System.out.println(s1.intern()==s2); //true 字符串驻留 s1.intern()返回在常量池中kill的引用,所以与常量池中的所相等。
String s="q";
String ss=new String("q");
String sss=new String("q");
System.out.println(s==ss);//false 常量池的对象kill和堆中的对象kill
ss.intern(); //ss获取常量池中对象引用
sss=sss.intern(); //sss获取常量池中对象引用,并赋值给sss
System.out.println(s==ss);//false 只是调用,并没有为ss对象进行赋值
System.out.println(s==ss.intern()); //true
System.out.println(s==sss); //true
public native String intern(); //扩充常量池
//当一个String实例调用intern()方法时,程序会查找常量池中是否有相同Unicode的字符串常量,如果有,则返回常量池中该字符串的引用,如果没有,则在常量池中创建一个Unicode等于该实例的字符串并返回它的引用;
String s=new String(); 等效于 String s="";
String源码中无参构造器
public String(){
this.value="".value;
}
具体操作字符串
获取字符串
获取字符串长度 public int length(){return value.length}
根据位置获取字符串 public char charAt(int index){if((index<0)||(index>=value.length)){throw new StringIndexOutOfBoundsException(index);}return value[index];}
根据字符获取位置 int indexOf(int ch) int lastIndexOf(int ch)
获取部分子串 String substring(int beginIndex,int endIndex) //[)
转换字符串
将字符串变为字符串数组 String[] split(String regex){return split(regex,0)}
分割字符串 String[] split(String regex,int limit) //regex为字符串分割的标准,limit用来限制返回数组中元素的个数
将字符串变为字符数组 toCharArray()
将字符串变为字节数组 getBytes()
将字符串的字母转换大小写 toUppercase() toLowercase()
将字符串中的内容进行替换 String replace(char oldChar,char newChar)
将字符串两端去空格 trim()
将字符串进行连接 concat(String str)
判断字符串
两个字符串内容是否相同 boolean equals(Object obj)
字符串中是否包含指定字符 boolean contains(String str)
字符串是否以指定字符开头,结尾
startsWith(String prefix){return startsWith(prefix);}
endsWith(String suffix){return startsWith(suffix,value.length-suffix.value.length);}
字符串中某一下标的值是否是指定字符串 boolean startsWith(String prefix,int index)//比较原字符串下标之后的字符串与指定字符串是否相同
比较字符串
compareTo(String anotherString); //s.compareTo(ss); 比较s和ss的ASCll码的差值,
//compareTo(Object obj)方法是Comparable接口中的方法,当需要对类的对象进行排序时,该类需要实现Comparable接口,必须重写compareTo(T t)方法;String等类默认实现了该接口