java字符串相关详解

    科技2022-07-11  92

    java中常用类

    String,StringBuffer,Stringbuilder特性字符串相关的类


    String,StringBuffer,Stringbuilder特性

    String:位字符串,使用""引起来表示,字符串值存放在常量池中,不可被修改String: 声明为final的,不可被继承String实现了Serializable接口:表示字符串是支持序列化的 实现Comparable接口:表示String可以比较大小String内部定义了final char[] value用于存储字符串数据String:代表不可变的字符序列,简称不可变性 当字符串重新赋值时,将会新开辟一块内存区域,不能改变原有的值当对原有的字符串进行拼接操作时,也要重新指定一块内存区域,不能对原有的value值进行操作当使用replace(old:"",new:"")对String字符进行改变是,也要指定一块新的内存区域
    String的常用方法

    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,影响效率)

    字符串相关的类

    String对象的创建 String s1=“Hello”;//通过字面量的方式String s2=new String();通过new加构造器的方式String s3=new String(String original);//创建指定长度的数组String s4=new String(char[] a);String s5=new String(char[] a,startIndex,int count);//startIndex//数组的指引下标,count表示取出 几个放到s1中 String s1="Hello"和String s1=new String(“Hello”)的比较 String s1="Hello"; String s2="Hello"; String s3=new String("Hello"); String s4=new String("Hello"); System.out.println(s1==s2);//true System.out.println(s3==s4);//false System.out,println(s1==s3);//false

    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 } }
    Processed: 0.015, SQL: 8