java 基础复习 -用Demo去认识String 类
前言:我们知道在开发中最常用的就是字符串了。往往在实际的项目开发中,字符串被用户当做数据传输和数据展示的常用类;
本篇目的在于帮助大家简单的重新认识一下 java 中的 String 类;
首先我们是知道String 它不是基本数据类型,所以去创建String 对象就需要 String类提供的类构造方法去实例化; 【携带常见面试题分析】
大家提前可预知:所有的字符串都是String类型的匿名对象;
第一步:分析String类对象的实例化过程
【面试题:请说明String类的两种实例化方法的区别?】
A:String 类对象的实例化
1》简单方法:直接赋值方法:String str = "ankermaker";// “ankermaker” 是 String 的匿名对象;
2》构造方法:String str = new String ("ankermaker");// “ankermaker” 同样是一String 的匿名对象;
实例化方法的区别莫过于对象创建和引用的不同,即从内存的角度来分析:
简单方法分析如下图:
“ankermaker”是一个匿名类,即在堆中存在这个对象,这里的str 是栈中的一个对象存储是 这个匿名类对象的地址;
构造方法分析:
“ankermaker”是一个匿名类,即在堆中存在这个对象,但是我们知道 一旦出现new 的时候 就一定会在 堆中开辟性得内存;
如下图所示:
综上所述:我们就很容易这两种方法的区别就是:简单赋值在堆中只会创建一个对象,而使用构造器去是实例化结果就会在堆中产生一个内存垃圾;
第二步:分析String中常用的方法;
1》charAt
求字符串某一位置字符
public char charAt(int index)//返回字符串中指定位置的字符;注意字符串中第一个字符索引是0,最后一个是length()-1。
1 String str = new String("abcd"); 2 char ch = str.charAt(1);//ch = b
2》compareTo
字符串比较
1)public int compareTo(String anotherString)//该方法是对字符串内容按字典顺序进行大小比较,通过返回的整数值指明当前字符串与参数字符串的大小关系。若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
2)public int compareToIgnore(String anotherString)//与compareTo方法相似,但忽略大小写。
3)public boolean equals(Object anotherObject)//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
4)public boolean equalsIgnoreCase(String anotherString)//与equals方法相似,但忽略大小写。
1 String str1 = new String("abc"); 2 String str2 = new String("ABC"); 3 int a = str1.compareTo(str2);//a>0 4 int b = str1.compareTo(str2);//b=0 5 boolean c = str1.equals(str2);//c=false 6 boolean d = str1.equalsIgnoreCase(str2);//d=true
3》concat
【面试题:请谈一谈 “+"和 concat 方法的区别】
字符串连接
public String concat(String str)//将参数中的字符串str连接到当前字符串的后面,效果等价于"+"。
1 String str = "aa".concat("bb").concat("cc");
相当于String str = "aa"+"bb"+"cc";
这里大家可以自己去跑一下下面这两个使用“+“的运算;
1、String str = '12"+"13"+“”abcd“”;
2、String str2 = "12"+"abcd"+“”23“;
第一个 25abcd
第二个 12abcd13
大家可以查看上面的结果,我相信大家就知道这两个方法的区别啦;
4》indexOf
字符串中单个字符查找
1)public int indexOf(int ch/String str)//用于查找当前字符串中字符或子串,返回字符或子串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1。
2)public int indexOf(int ch/String str, int fromIndex)//改方法与第一种类似,区别在于该方法从fromIndex位置向后查找。
3)public int lastIndexOf(int ch/String str)//该方法与第一种类似,区别在于该方法从字符串的末尾位置向前查找。
4)public int lastIndexOf(int ch/String str, int fromIndex)//该方法与第二种方法类似,区别于该方法从fromIndex位置向前查找。
1 String str = "I am a good student"; 2 int a = str.indexOf('a');//a = 2 3 int b = str.indexOf("good");//b = 7 4 int c = str.indexOf("w",2);//c = -1 5 int d = str.lastIndexOf("a");//d = 5 6 int e = str.lastIndexOf("a",3);//e = 2
5》字符串中字符的大小写转换
1)public String toLowerCase()//返回将当前字符串中所有字符转换成小写后的新串
2)public String toUpperCase()//返回将当前字符串中所有字符转换成大写后的新串
1 String str = new String("asDF"); 2 String str1 = str.toLowerCase();//str1 = "asdf" 3 String str2 = str.toUpperCase();//str2 = "ASDF"
6》字符串中字符的替换
1)public String replace(char oldChar, char newChar)//用字符newChar替换当前字符串中所有的oldChar字符,并返回一个新的字符串。
2)public String replaceFirst(String regex, String replacement)//该方法用字符replacement的内容替换当前字符串中遇到的第一个和字符串regex相匹配的子串,应将新的字符串返回。
3)public String replaceAll(String regex, String replacement)//该方法用字符replacement的内容替换当前字符串中遇到的所有和字符串regex相匹配的子串,应将新的字符串返回。
1 String str = "asdzxcasd"; 2 String str1 = str.replace('a','g');//str1 = "gsdzxcgsd" 3 String str2 = str.replace("asd","fgh");//str2 = "fghzxcfgh" 4 String str3 = str.replaceFirst("asd","fgh");//str3 = "fghzxcasd" 5 String str4 = str.replaceAll("asd","fgh");//str4 = "fghzxcfgh"
7》split
String[] split(String str)//将str作为分隔符进行字符串分解,分解后的字字符串在字符串数组中返回。
1 String str = "asd!qwe|zxc#"; 2 String[] str1 = str.split("!|#");//str1[0] = "asd";str1[1] = "qwe";str1[2] = "zxc";
8》equals
【面试题:请谈一谈 “”==“” 与 equals 方法的区别 】
下面有两块代码:大家跑一下,然后结合上面的实例化分析我相信大家就可以的到它们的之间的区别了;
代码1:
string str1 = "yong";
string str2 = "yong"
system,out,println("str1" == "str2");
代码2:
string str1 = "yong";
string str2 = new String("yong")
system,out,println("str1" == "str2");
带着问题去测试代码:
第一块代码,上面输出的结果是 true;为什么呢?、
第二块代码,输出的结果却是 false;又是为什么呢?
问题3:如果 都换成 equals 方法结果又是如何呢?大家可以去问度娘,也可以自己的写个代码跑一下对比一下即可哦。
第一个问题:首先告诉大家的是String类的设计模式是共享模式---如果用户采用直接赋值的方法实例化一个字符串的话如同代码块1中的“String str1 = "yong" ;”,那么java 内部的内存管理机制就会在堆区中创建一个常量池(实际上是个数组),然后将这个“yong”存到这个常量池中,以至于在后面用户在创建第二个应用对象str2的时候,直接就会指向常量池中的“yong”,所以代码中的Str1 和 Str2 存的地址是一样的。 第二个问题:上面再谈到String的两种实例化方法的区别的时候我们就明白了,用构造方法去创建String 对象的时候在堆中存在两个内存,所以对应栈中的str1 、str2 有不同的指向地址;返回false; 所以 “==” 其实就是 判断栈中对象所存的地址值是否一样;