int length();//返回字符串的长度 char charAt(int Index);返回索引处的字符 boolean isEmpty();//判断是否为空 String tolowercase();//将字符串中的字符全部转化为小写 String touppercase();//将字符串中所有字符转化为大写 boolean equals(Object obj); 判断字符串内容是否相等 boolean equalIgnorecase();'判断字符串内容是否相等,忽略大小写 String trim();//去掉字符串前后空格(注册登录时防止前后有空格) int compareTo(String anotherString);//比较两个字符串大小(联系人按照字母顺序排序) String substring(int beginIndex);//取出索引之后的字符串 String substring(int beginIndex,int endIndex);取出索引之间的字符串(左闭右开)
boolean endsWith(String suffix);//判断字符串以什么结尾 boolean startsWith(String prefix);//判断字符串以什么开始 boolean startsWith(String prefix,int toffset);判断在什么位置以什么字符串开始
int indexOf(String str);//判断str是否在字符串中出现,返回字符串出现的第一个位置,查不到返回-1 int indexOf(String str,int fromIndex);从索引fromIndex处开始查找,判断str是否在指定字符串中出现
String repalce(String oldchar,String newchar);//讲一个旧的字符转化为新的字符 String repalce(CharSequence target,CharSequence replacement);//将一个字符串转化为新的字符串 String repalceAll(String regex,String replacement);//regex表示正则公式,replacement表示替换掉字符串中正则表示出的字符串对象 boolean matches(String regex);告知此字符串是否匹配给定的正则表达式内容 String[] split(String regex);//根据给定的正则表达式拆封字符串
String与其他结构之间的转换 String—>基本数据类型,包装类 :通过调用包装类的静态方法parsexxx(str); @text public void test1(){ String str="123"; int num=Integer.parseInt(str); ... } 基本数据类型和包装类—>String:String.valueOf(xxx); String str1=String.valueOf(num); String—>char[]:调用String的toCharArray(); char[]—>String:调用String的构造器 char[] charArray=str1.toCharArray(); String str2=new String(charArray); String—>byte[]之间的转换:调用getBytes()方法(编码过程) byte[]—>String之间的转换:调用String的构造方法(解码过程) 解码时要求解码使用的字符集一定要与编码使用的字符集一致 byte[] byte1=str2.getBytes(); String str4=new String(byte1); StringBuffer常用方法 增:append(),方法链:s1.append().append()…删:delete(int start,int end)改:replace(int start,int end,String str)/SetCharAt(int index,char ch)查:indexOf(String str)插:insert(int offset,String str)长度:length()反转:reverse() //字符串的反转操作 StringBuffer str1=new StringBuffer('abc'); str1.reserver(); System.out.println(str1);//cba String,StringBuffeer,StringBulider源码分析String:不可变的字符序列,底层使用Char[]型数组存储 StringBuffer:可变的字符序列,线程安全的,效率低,底层使用Char[]数组存储 StringBulider:可变的字符序列,线程不安全,效率高,底层使用Char[]型数组存储
String类源码分析 String str=new String();//底层实现为new了一个长度为零的Char[]型数组 String str1=new String(“abc”);//Char[] value=new Char[]{‘a’,‘b’,‘c’}StringBuffer str2=new StringBuffer();//Char[] value =new Char[16]; str2.append(‘a’);//value[0]=‘a’ str2.append(‘b’);//value[1]=‘b’ StringBuffer str3=new StringBuffer(‘abc’);//value=new Char[‘abc’.length()+16]扩容问题 如果要添加的底层数据数组存不下,就要考虑扩容底层数组,默认情况下,扩容为原来容量的2倍+2,同时见原来数组中已有的元素添加到扩容后的数组,相当于复制一个更大的数组存储。(开发中r如果需要扩容尽量少使用StringBuffer,影响效率)
s1和s2形式定义的字符串值保存在方法区的字符串常量池中,字符串常量池中定义的字符串为final类型,因此确定的字符串具有固定的地址。 new出来的字符串对象保存在堆空间中,一个字符串对象对应一个内存空间,不同地址指向不同的对象所以s3,s4地址不同
String a="Hello"; String b="World"; String s1="HelloWrold"; String s2="Hello"+"World"; String s3=a+"World"; String s4="Hello"+b; String s5=a+b; System.out.println(s1==s2);//true:两个值都是自变量,定义在常量池中的同一个"HelloWorld" System.out.println(s1==s3);//false:当拼接有一个字符串对象变量时,结果在堆中 System.out.println(s3==s4);//false:结果在堆中,地址不相同 System.out.println(s4==s6);//false:结果在堆中地址不相同如果有结果调用intern()方法,则结果在常量值中
String s6=(a+b).intern(); System.out.println(s1==s6);//true补充:String s1=new String(“abc”);方式创建对象,在内存中创建了几个对象? 2个:一个为new出来放在堆空间的对象,一个为char[]型数组对应的常量池中的数据"abc"。
提升 public class StringText{ String str=new String("Hello"); char[] a={'a','b','c','d'}; public void change(String str,char a[]){ str="Hello1"; a[0]='w'; } public static void main(String[] args){ StringText s1=new StringText(); s1.change(s1.str,s1.a) System.out.println(s1.str);//输出为Hello System.out.println(s1.a);//输出为best } }