4 String类02 String类下的方法

java没有给String提供展示字符串地址的方式,只是提供了展示内容的方式,所以System.out.println(s);输出的是字符串内容而不是字符串地址.

1.charAt(int index);返回的是字符串相对应下标的字符值

String str="adbf";

System.out.println(str.charAt(3)); //f

2.length() ;返回字符串长度 

for(int i=0;i<str.length();i++)

{

System.out.println(str.charAt(i)); 

}

3.toCharArray();将此字符串转换为一个新的字符数组 和底层的字符数组内容一致

char[] cs=str.toCharArray();

4.String(char[] value) 字符数组转成一个新的字符串就是看String类的构造方法支持不支持

分配一个新的 String,它代表了目前包含在字符数组参数字符序列。  
String s=new String(cs);
sop(s);
5.String(char[] value, int offset, int count)
分配一个包含字符与字符数组数组参数的新 String
String s=new String(cs,0,4);
sop(s);
 
 
6.比较字符串的大小,返回的是比较后的结果 首先比较第一个字符,如果第一个字符相等,差值就等于0,然后就两个字符串往后比较第二个字符,依次下去.
如果其中一个字符串移位结束了,就把来给你个字符的长度差进行返回
compareTo() 如果返回值是整数表明前面的字符串对象大于后面的字符串对象,如果返回值是负数前面的字符串对象小于后面的字符串对象。
int compareTo(String anotherString)
比较两个字符串的字典。
int compareToIgnoreCase(String str)
按字典顺序比较两个字符串,忽略大小写的差异。 

 String str1="aedfd";

String str2="aedfdef";

str1.compareTo(str2); //-1

原码:

 public int compareTo(String anotherString) {
        int len1 = value.length;  
        int len2 = anotherString.value.length;
        int lim = Math.min(len1, len2); //两个字符串长度中最小值
        char v1[] = value; //将底层的字符数组赋值给一个新的字符数组
        char v2[] = anotherString.value;

        int k = 0;
        while (k < lim) {
            char c1 = v1[k];
            char c2 = v2[k];
            if (c1 != c2) { //如果两个字符不相等
                return c1 - c2; //返回两个字符的差值
            }
            k++;
        }
        return len1 - len2; //短的字符遍历完成了,返回s1的字符串长度-s2的字符串长度
    }

 7.

String concat(String str)
将指定的字符串,拼接到此字符串的末尾。

底层是通过字符数组的扩容来完成的来完成字符串之间的拼接

+和concat 区别

1.+底层依赖于StringBuilder拼接 concat依赖于数组的扩容(底层依赖于数组的复制)

2.+可以拼接任意数据,concat只能拼接字符串

8.contains 字串是否包含在字符串中如果在返回true,如果不在返回false

9.endsWith 字符串是否以指定字符串结尾

10startsWith 以指定字符串开头

11.equal 先比较地址值是否相等,如果不等就把两个字符串对象转成两个字符数组,首先判断类是否一致,再判断长度是否一致,依次判断两个字符数组对应位置的字符是否一样,如果全部一样才返回true

  public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) { //value是底层字符数组,先比较字符长度
                char v1[] = value;            char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

12.getbytes

 无论那张码表都默认兼容 ISO8859-1 (西欧码表) 就是前256的字符都是占1个字节

GB2312(简体中文 2个字节 ) BIG5(繁体中文 2个字节) GBK(国标表 2个字节)

Unicode编码体系(u8(三个字节)、u16(两个字节)、u32等。

.java文件进行存储时,默认采用的时u8进行编码的,.class在内存时用的是u16进行编码

char c=‘中’

当上诉代码中的字符存储在.java文件中时默认按u8进行编码,对.java文件进行编译生成.class文件加载到内存中进行执行.此时这个代码中字符默认按u16进行编码。内存执行完成之后要把内存的字节转成字符输出到程序中,如果指定就按指定的来,如果没有指定编码就按默认系统平台码来进行编码,默认系统平台码(window中文版  gbk ,linux u8)

getBytes()--可以根据指定的码表来返回一个字节数组或者不指定码表就按默认系统平台码来进行编码返回一个字节数组 new String(byte[] bs,int offeset,int length) --把部分字节数组可以按照指定的码表进行转换成新的字符转对象,如果不指定码表,就按默认系统码进行转换

        //字符串
        String str="字符串";
        //没有指定具体的码表就是按默认的系统平台码来编码(window 中文下时GBK)
        byte[] bs=str.getBytes();
        //指定特定编码
        byte[] ba=str.getBytes("utf-8");
        System.out.println(bs.length); //6
        System.out.println(ba.length);//9 utf-8 一个字符占3个字节
        //将byte数组转成新的字符串
        String s=new String(bs);
        //byte转换的时候需要和转换过来编码一致,否则会有乱码 ,如果不指定就是默认系统平台码
        String s1=new String(ba,"utf-8");//字符串
        System.out.println(s1);
        //可以转换一部分的字节数组的信息为一个新的字符串对象
        String s3=new String(ba,0,3,"utf-8"); 
        System.out.println(s3);//

13.hashCode() 返回的是字符串对象的哈希码值,重写这个hashcode方法根据字符串元素内容以及原来的顺序。

    public int hashCode() {
        int h = hash; //hash默认为0
        if (h == 0 && value.length > 0) {
            char val[] = value;

            for (int i = 0; i < value.length; i++) {//遍历字符串转换的字符数组中的元素 
                h = 31 * h + val[i];
            }
            hash = h;      //这个字符串内容一致,hashCode值一致
        }
        return h;
    }
  String string="abc";
  System.out.println(string.hashCode()); //96354

14indexOf()

int indexOf(int ch)
返回在指定字符的第一个发生的字符串中的索引。
int indexOf(int ch, int fromIndex)
返回在指定字符的第一个发生的字符串中的索引,在指定的索引处开始搜索。
int indexOf(String str)
返回指数在这个字符串指定的子字符串中第一个出现的。
int indexOf(String str, int fromIndex)
返回此字符串的指定子字符串中第一个出现在索引中,从指定索引处开始。 ·
//返回新串在原串中第一次出现的下标值(新串第一个字符出现的原串下标值)
  System.out.println(str.indexOf("egn")); //2
  //查不到结果就会返回-1 
  System.out.println(str.indexOf("egn2")); //-1
  //指定下标来获取第二个egn,包含起始下标往后查找
  System.out.println(str.indexOf("egn",3)); //8

15 intern 把字符串对象的引用转向到常量池

    String str1="abc";//str1指向常量池
    String str2=new String("abc"); //str2指向堆
    System.out.println(str1==str2); //false
    str1=str1.intern();
    System.out.println(str1==str2); //false
    //把字符串对象的引用转向到常量池
    str2=str2.intern();
    System.out.println(str1==str2); //true

16.isEmpty(); 判断字符串对象是否是空串

String string="";//内存有空间但是没有元素
System.out.println(string.isEmpty()); //true

 17 replace 替换

String str="qewrhsdibibaibiba";
//把原串中所有的指定字符替换成新字符并返回一个新的字符串
System.out.println(str.replace("b"," +"));//qewrhsdi +i +ai +i +a

18.substring 

String str="qewrhsdibibaibiba";
//给定起始下标,从下标开始往后截取成一个新的字符串返回
System.out.println(str.substring(5));//sdibibaibiba
//范围是左包右不包
System.out.println(str.substring(5,8));//sdi

19trim 对字符串的前面或者尾部出现的空格进行删除但是不针对中间出现的空格

String str=" qewrhsdib ibaibiba "; 
System.out.println(str+"a");// qewrhsdib ibaibiba a
System.out.println(str.trim()+"a");//qewrhsdib ibaibibaa

20valueof 首先是静态方法,可以String点出来,valueof 把大部分的数据类型转换为字符串,转引用类型的时候,调用的是object的tostring()方法

int[] arr= {2,3,4};
char[] cs= {'2','3','4'};
System.out.println(String.valueOf(arr));//[I@15db9742
//输出的是数组内存地址值 通过底层的Valueof调用object的tostring 转换为数组对象的地址值进行输出
System.out.println(arr); //输出的是地址 [I@15db9742
//直接输出的
System.out.println(cs); //234 主要原因是println
System.out.println(s2);//1
原文地址:https://www.cnblogs.com/xuwangqi/p/11174635.html