本文共 5683 字,大约阅读时间需要 18 分钟。
源于Java中的一个类java.lang.String
我们先看看内存中的字符串对象的存在形式:
String s1="abcdef";
s1是一个对象的引用变量地址,“abcdef”是一个字符串对象
当我们进行字符串的拼接操作时,原来的字符串对象是不可以改变的,改变的是新产生的新的字符串,重新将字符串对象的地址赋给引用变量
String s2=s1+"xy";
当我们new String()的时候,在堆内存中开辟空间
String s3=new String(“xy”); 但是我们说过,直接双引号括起的字符串是在常量池中的,不可以改变的,但是我们new出来的对象实在堆中的,所以:String s3是指向了堆中存在的对象,保存它的引用地址
我们需要注意”abcdef” “xy” “abcdefxy”在方法区的常量池中每个字符串只有一个,因为字符串的值是不可改变的,可以改变的是变量地址的指向,也就是说s1,s2,s3的指向可以改变,但是不代表字符串的值可以改变String类的构造方法(简单的罗列几个常用的,剩下的很多看文档吧)
String s1=new String("hello");String s2="hello";String s3=new String(new byte[]{ 97,98,99});String s4=new String(new char[]{ 'a','b','c'}); System.out.println(s1); System.out.println(s2); System.out.println(s3); System.out.println(s4);
String str=new String("abcde"); //charAt 根据索引返回字符 从零开始 System.out.println(str.charAt(3)); //d //contains方法,判断源字符串中是否包含传入的参数字符串 System.out.println(str.contains("de"));//true System.out.println(str.contains("ed"));//false //endsWith方法判断是否以规定的字符串结尾 System.out.println(str.endsWith("de"));//true System.out.println(str.endsWith("ed"));//false ===================================================================================== //比较两个字符串相等 不应使用== 应该用equals方法 System.out.println("abc".equals("abc"));//true System.out.println("abc"=="abc");//true System.out.println("abc".equals("bca"));//false System.out.println("abc".equals("a"));//false String s1=new String("abc"); String s2=new String("abc"); System.out.println(s1==s2); //false System.out.println(s1.equals(s2));//true
可以看出,我们new 对象的时候 尽管我们构造字符串时候的传入“abc“是相同的,但是我们new出来的对象地址是不一样的,不是同一个对象,然而我们希望相同字符串的对象应该是相等的,所以我们只能用equals比较两个字符串是否内容相等,我们使用==只能比较两个字符串对象的引用地址是否相同但是无法比较两个字符串的内容
compareTo方法
返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的ASCII差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方结束。 • 如果参数字符串等于此字符串,则返回值 0; • 如果此字符串小于字符串参数,则返回一个小于 0 的值; • 如果此字符串大于字符串参数,则返回一个大于 0 的值。 • 参数字符串是调用字符串的前缀的话,则返回长度差值String str="abcd"; String str2="abc"; String str3="bc"; System.out.println(str.compareTo(str2)); //1 是前缀返回字符串的两个长度差 System.out.println(str.compareTo("abcd")); //0 完全匹配 System.out.println(str.compareTo(str3)); //-1 非前缀 第一个字符就不同 返回两字符的差值 System.out.println(str2.compareTo(str3)); //-1 非前缀从开始字符比较 不同返回ASCII的差值
String str="abcd";//忽略大小写比较字符串是否相等System.out.println(str.equalsIgnoreCase("AbcD"));//truegetBytes方法 将字符串转为byte数组String str="abcd";byte[] s=str.getBytes();for (int i = 0; i < s.length; i++) { System.out.println(s[i]);}
indexOf方法
判断子字符串或者字符在当前字符串中第一次出现的索引String str="abcd";System.out.println(str.indexOf("bc")); //1System.out.println(str.indexOf("b")); //1System.out.println(str.indexOf('b')); //1
isEmpty方法
判断字符串是否为空 空格也算字符串的一部分 只包含空格的串 不等同于空串 空串什么都没有 没有空格 仅仅包含空格的串不是空串String str=" ";System.out.println(str.isEmpty()); //falseString str2="";System.out.println(str2.isEmpty());//true
length方法
注意面试重点: 数组的长度length和字符串的length不同 数组长度length属性 字符串获取长度 length()方法String s1="abc";System.out.println(s1.length()); //3int[] arr=new int[]{ 1,2,3};System.out.println(arr.length); //3
replace方法
替换源字符串中的某些字符String str="baidu.con";String s = str.replace("baidu", "love");System.out.println(str); //baidu.conSystem.out.println(s); //love.con
substring方法
截取子串 当我们传入一个参数的时候,默认从该索引处截取到最后 传入两个参数,左闭右开从开始索引到结束索引-1的位置处String str="baidu.con";System.out.println(str.substring(3,5)); //du 截取索引3开始4结束不包括5索引处的字符System.out.println(str.substring(3)); //du.con
toCharArray()方法
将字符串转为char型数组public static void main(String[] args) { String str="baidu.con"; char[] chars = str.toCharArray(); for (int i = 0; i < chars.length; i++) { System.out.println(chars[i]); }}
字符串大小写转换 toLowerCase toUpperCase
String str="baidu.con";String up = str.toUpperCase();System.out.println(up);String low = up.toLowerCase();System.out.println(low);
trim去除前后空格
String str=" baidu.con ";String s = str.trim();System.out.println(s);System.out.println(str);
结果:
ValueOf将非字符串转为字符串
valueOf是String类的静态方法,直接类名调用就可public static void main(String[] args) { String s = String.valueOf(true); System.out.println(s);//我们输出其所属类名 System.out.println(s.getClass().getName());}
结果:
下面我们来研究一下这个String.valueOf方法:
首先我们看一下各种参数的Stirng.valueOf的源码import java.util.Arrays;import java.util.Stack;class person{ private String name; int age; public person() { } public person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "person{" + "name='" + name + '\'' + ", age=" + age + '}'; }}public class stringArgs { public static void main(String[] args) { String s = String.valueOf(new person("xiaohong",12)); System.out.println(s); }}
我们重写了person类的toString 方法,当我们调用String.valueOf的时候传入一个对象作为参数我们可以看源代码
我们再来研究一下这个System.out.println(s);
当我们给println方法的参数传入一个对象的时候,会自动调用valueOf方法,但是我们从上面可以看到,而valueOf又会在源码中看到:
转载地址:http://pmeq.baihongyu.com/