黑马程序员——String类

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

------<a href="http://www.itheima.com" target="blank">java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

String类

(一). 认识String

字符串是一个特殊的对象,一旦初始化就不可改变。

有两种方式定义一个字符串对象:

(1)String str = “abc”; //它在执行时是在字符串常量池中创建一个对象,并把地址赋给引用型变量

(2)String str1 = new String("abc");//它在执行时是在堆内存中,创建了两个对象,用new方式创建了一个字符串对象;紧接着在构造时,又接收了一个字符串对象。

String s = new String();//等效于String s = “”; //不等效于String s = null; 因为前两者都是创建了一个空的字符串,最后一个是常量值空

特别注意两者的区别:

虽然str、str1的值都为“abc”,但是其引用地址是不一样的。所以str不等于str1,但是如果定义String str2 = “abc”;这时如果将str2与str比较,两者是等同的,因为

当在字符串常量池中创建对象时,会先查找该常量池中是否存在该内容,如果存在就直接把引用地址赋给变量,如果池中不存在才新建一个。

1.1 String功能

(1)获取(牢记)

获取字符串长度:int length() //注意在数组中length是属性,但在string中length是方法根据位置获取字符:char charAt(int index);根据字符获取字符在字符串中第一次出现的位置:int indexOf(int char);//可以放整形,或者char类型,都可以解析出来从指定位置查找字符在字符串中第一次出现的位置:int indexOf(int char,int fromIndex);获取子字符串在字符串中第一次出现的位置:int indexOf(String str);从指定位置查找子字符串在字符串中的位置:int indexOf(String str,int fromIndex);返回指定字符在字符串中最后一次出现的位置:int lastIndexOf(int char);返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索:int lastIndexOf(int char,int fromIndex);返回指定字符串在字符串中最后一次出现的位置,反向索引:int lastIndexOf(String str);返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索:int lastIndexOf(String str,int fromIndex);获取字符串的子串:String substring(int beginIndex,int endIndex);//包含开始,不包含结尾实践见真知

1publicclassStringDemo {2publicstaticvoidmain(String[] args){3StringPRacticeDemo();4}5publicstaticvoidStringPracticeDemo() {6String s = "abcdefeagkl";7System.out.println("length:"+s.length());//108System.out.println("At:"+s.charAt(4));//e9System.out.println("indexOf:"+s.indexOf('k'));//810System.out.println("indexOf:"+s.indexOf('m') );//11//indexOf有两个作用,1是索引位置,2是判断存在,如果不存在就返回-1,我们可以通过返回值来判断该字符存在不存在12System.out.println("lastIndexOf:"+s.lastIndexOf('a'));//713System.out.println("indexOf str:"+s.indexOf("def"));//314System.out.println("lastIndex str:"+s.lastIndexOf("eag"));//61516//获取子串17System.out.println("substring:"+s.substring(6));18//包含开始,不包含结尾 该子字符串从指定的 beginIndex 处开始,直到索引 endIndex - 1 处的字符19System.out.println("substring:"+s.substring(6,9));20}21}

(2)转换

把字符串变成字符串数组(字符串切割):String[] split(regex);//设计到正则表达式字符串变成字符数组:char[] toCharArray();字符串变成字节数组:byte[] getBytes();字符串字母转换大小写:String toUpperCase(); String toLowerCase();将字符串中的内容进行替换:String replace(ch oldCh,ch newCh);//如果替换成功返回一个新串(因为字符串一初始化就已经固定),如果替换不成功则返回原字符串。字符串进行替换:String replace(String str1,String str2);// 后者替换前者去除字符串两端的空格:String trim();将字符串进行连接:String concat(String str);将基本数据类型变成字符串:String valueOf();实践见真知

1publicclassStringDemo {2publicstaticvoidmain(String[] args){3StringPracticeDemo1();4}5publicstaticvoidStringPracticeDemo1() {6//字符串切割7String str = "张三,李四,王五";8String[] names = str.split(",");9for(String name : names){10System.out.println(name);11}12//字符串转字符数组13String str1 = "abcdef";14char[] ch =str1.toCharArray();15for(inti=0;i<ch.length;i++){16if(i<ch.length-1){17System.out.print(ch[i]+",");18}else{19System.out.println(ch[i]);//a,b,c,d,e,f20}21}22//字符串转字节数组23byte[] by =str1.getBytes();24for(inti=0;i<by.length;i++){25if(i<by.length-1){26System.out.print(by[i]+",");27}else{28System.out.println(by[i]);//97,98,99,100,101,10229}30}31//字符串大小写转换32System.out.println(str1.toUpperCase());//ABCDEF33System.out.println("AVBCD".toLowerCase());//avbcd34//字符串连接35String str2 = str1.concat("abc");36System.out.println(str2);//abcdefabc37//字符串替换38String str3 = str2.replace("abc", "cba");39//String str3 = str2.replace("abd", "cba");//abcdefabc如果找不到则返回原串40System.out.println(str3);41//去除字符串两端空格42String str4 = " -abc d- ";43System.out.println(str4.trim());//-abc d-44//将基本数据类型转换为字符串45intc = 5+1;46String b = "";47System.out.println("b="+b.valueOf(c));//b=648}49}

(3)判断

判断字符串是否相同:boolean equals(Object obj); boolean equalsIgnoreCase(String str);//忽略大小写进行比较字符串中是否包含子字符串:boolean contains(String str); 可以用indexOf来替换,返回-1代表不包含字符串是否以指定字符串开头,是否以指定字符串结尾:boolean startsWith(string); boolean endsWith(string);实践见真知

1publicclassStringDemo {2publicstaticvoidmain(String[] args){3StringPracticeDemo2();4}5publicstaticvoidStringPracticeDemo2() {6//比较,忽略大小写比较7String s1 = "abc";8String s2 = "ABC";9System.out.println(s1.equals(s2));//false10System.out.println(s1.equalsIgnoreCase(s2));//true1112//是否包含某个字符串13String s3 = "abcdfaf";14System.out.println(s3.contains("cdfe"));//false1516//是否以指定字符串开始,已制定字符串结尾17String s4="Hello.java";18System.out.println(s4.startsWith("Hel"));//true19System.out.println(s4.endsWith(".java"));//true20}21

(4)比较

比较两个字符串的大小(按照字典顺序):int compareTo(String anotherString) //如果参数字符串等于此字符串,则返回值0;如果此字符串按字典顺序小于字符串参数,则返回一个小于0的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于0的值。

返回字符串的规范化表示形式:Stringintern();实践见真知

1publicclassStringDemo {2publicstaticvoidmain(String[] args){3StringPracticeDemo3();4}5publicstaticvoidStringPracticeDemo3() {6String s6 =newString("alsjf");7String s7 = "asvsd";8System.out.println(s6.compareTo(s7));//-7 s6小于s7910String s8 =s6.intern();11System.out.println(s6==s8);//false 是因为intern方法是从字符串池中创建,而s6是在堆内存中12}

(二). StringBuffer字符串缓冲区(可变长度数组)

2.1 StringBuffer特点

StringBuffer是一个可变长度的容器可以存储不同类型数据最终要转成字符串进行使用(输出的全是字符串,最终用的时候都是变成字符串才能取用)可以对字符串进行修改2.2 StringBuffer功能

2.2.1 添加功能

StringBuffer append(Data)————往容器中添加数据StringBuffer insert(index,data)————在某个位置上插入数据实践见真知

1publicclassStringBufferDemo {2publicstaticvoidmain(String[] args) {3StringBuffer sb =newStringBuffer();4//添加功能5sb.append(9+"11").append("nihao");//添加链6sb.append(true);7System.out.println(sb);//911nihaotrue8//插入功能9sb.insert(3, "hehe");10System.out.println(sb);//411hehenihaotrue11}12}

2.2.2 删除功能

StringBuffer delete(start,end)————删除缓冲区中的元素,指定开头,不包含结尾StringBuffer deleteCharAt(int index)————删除指定位置上的元素实践见真知

1publicclassStringBufferDemo {2publicstaticvoidmain(String[] args) {3Demo_2();4}5publicstaticvoidDemo_2() {6StringBuffer sb =newStringBuffer();7sb.append("abcdefgh");8sb.deleteCharAt(3);//删除指定位置上的字符9System.out.println(sb);//abcefgh10sb.delete(2, 5);//删除包含头元素,不包含尾元素11System.out.println(sb);//abgh12sb.delete(0, sb.length());//该方法是清空缓冲区13System.out.println(sb.length());//014}15}

2.2.3 查找功能(与string的获取功能类似)

char charAt(index)————查找某个位置上的字符int indexOf(String str)————获取子字符串在字符串中第一次出现的位置int lastIndexOf(String str)————获取子字符串在字符串中最后一次出现的位置实践见真知

1publicclassStringBufferDemo {2publicstaticvoidmain(String[] args) {3Demo_3();4}5publicstaticvoidDemo_3() {6StringBuffer sb =newStringBuffer();7sb.append("abcdefg");8charch = sb.charAt(3);//返回字符串上某个位置的元素9System.out.println(ch);//d1011inti = sb.indexOf("cde");//返回子串在主串上的位置12System.out.println(i);//21314intj = sb.lastIndexOf("de");15System.out.println(j);//31617intx = sb.indexOf("ef", 3);//从指定位置上查找子串所在位置18System.out.println(x);//419}20}

2.2.4 修改功能

StringBuffer replace( start, end, string)————替换字符串,包含开头,不包含结尾void setCharAt(index,char)————在指定位置上插入某个字符实践见真知

1publicclassStringBufferDemo {2publicstaticvoidmain(String[] args) {3Demo_4();4}5publicstaticvoidDemo_4() {6StringBuffer sb =newStringBuffer();7sb.append("abcdefg");8sb.replace(1, 4, "123");//包含开头元素,不包含结尾9System.out.println(sb);//a123efg10//sb.replace(0, sb.length(), "");//这就相当于清空缓冲区11//System.out.println(sb.length());//01213sb.setCharAt(5, 'x');//在指定位置上插入某个字符14System.out.println(sb);//a123exg15}16}

2.2.5 额外功能

void setLength(int newlength)————设置字符串缓冲区的长度,当长度设置为0时,相当于清空缓冲区StringBuffer reverse()————将此字符序列用其反转形式取代实践见真知

1publicclassStringBufferDemo {2publicstaticvoidmain(String[] args) {3Demo_5();4}5publicstaticvoidDemo_5() {6StringBuffer sb =newStringBuffer();7sb.append("abcdefg");8//字符串反转9sb.reverse();10System.out.println(sb);//gfedcba11//设置字符串长度,当设置为0时,相当于清空缓冲区12sb.setLength(0);13System.out.println(sb.length());//014}15}

2.2.6 构造方法StringBuffer()与StringBuffer(int capacity)的区别

StringBuffer()构造方法,是构造一个不带字符串的字符串缓冲区,初始容量为16个字符。当超过该容量时,可继续增加容量。而StringBuffer(int capacity)是构造一个固定长度的字符串缓冲区,但是当超过该固定容量时,依然可以继续扩展容量。二者的区别在于效率方面。当已知自己有35个字符的数据时,直接创建StringBuffer(40),效率更高。否则如果使用StringBuffer()创建,当发现容量不足时,还要继续创建,将会降低效率。

2.2.7 StringBuilder

从jdk1.5才开始出现StringBuilder,不保证同步,线程不安全,但是效率高,单线程时优先考虑使用StringBuilder

(三). StringBuffer与StringBuilder的区别

相同点:两者功能相同,使用方法相同

不同点:jdk1.0开始出现StringBuffer,线程安全,同步,多用于多线程

jdk1.5以后出现了和StringBuffer功能一样的StringBuilder,不保证同步,线程不安全,但是效率高,通常用于单线程

StringBuilder的出现是为了解决StringBuffer在处理单线程时效率慢问题,提高缓冲区的效率而出现的。

对比数组与StringBuffer或StringBuilder缓冲区:

1publicclassStingBuilderDemo {2/**3* 需求:将一个int数组变成字符串 ,分别用数组、缓冲区方式 输出4* 对比使用数组与使用缓冲区的区别5*@paramargs6*/7publicstaticvoidmain(String[] args) {8int[] arr = {2,5,8,33,23,6};9//ShowArr(arr);10String s =StringBuilderDemo(arr);11System.out.println(s);12}13//使用缓冲区方式14publicstaticString StringBuilderDemo(int[] arr) {15StringBuilder sb =newStringBuilder();16System.out.print("{");17for(inti = 0; i < arr.length; i++) {18if(i!=arr.length-1){19sb.append(arr[i]+",");20}else{21sb.append(arr[i]+"}");22}23}24returnsb.toString();25}2627//使用数组方式28publicstaticvoidShowArr(int[] arr) {29System.out.print("{");30for(inti = 0; i < arr.length; i++) {31if(i!=arr.length-1){32System.out.print(arr[i]+",");33}else{34System.out.println(arr[i]+"}");35}36}37}3839

结论:使用数组方式输出时,每遍历一次,连接一次“,” 如:( System.out.print(arr[i]+",");)就会在字符串常量池中产生一个常量,当全部输出字符串时会在常量池中产生n多个常量。而使用StringBuffer或StringBuilder的方式,不断的往数组中装,最后只返回一个字符串。

(四). 实践见真知

实践一

1packagecom.itsuper.p3.String;23publicclassPractice1 {45/**6* 将字符串数组按照字典顺序进行排序7* "nba","abc","cba","zz","QQ","haha"8*@paramargs9*/10publicstaticvoidmain(String[] args) {11String[] arr = {"nba","abc","cba","zz","qq","haha"};12printArray(arr);13sortArray(arr);14printArray(arr);15}1617publicstaticvoidsortArray(String[] arr) {18for(inti = 0; i < arr.length-1; i++) {19for(intj = i+1; j < arr.length; j++) {20if((arr[i].compareTo(arr[j])>0)){21swap(arr,i,j);22}23}24}25}26//交换功能27privatestaticvoidswap(String[] arr,inti,intj) {28String temp =arr[j];29arr[j] =arr[i];30arr[i] =temp;31}3233//打印功能34publicstaticvoidprintArray(String[] arr) {35for(inti=0;i<arr.length;i++){36if(i!=arr.length-1){37System.out.print(arr[i]+",");38}else{39System.out.println(arr[i]);40}41}4243}4445}

实践二

1packagecom.itsuper.p3.String;23publicclassPractice2 {45/**6* 查找子串nba在字符串中出现的次数7* asnbadfjanbaljdgnbasjgljljnbassdfa8*@paramargs9*@return10*/1112publicstaticvoidmain(String[] args) {13/*14* 分析:15* 次数:计数器16* 找nba,得有包含contains,先判断是否有nba,如果有则继续,如果没有则为017* 首先找到nba出现位置,找到后计数1次;然后取剩余的子串,在找nba出现的位置,在计数一次;再取剩余子串,依次类推18* 得用到循环19*/20String str = "asnbadfjaljdgnbasjgljljnbassdfa";21String key = "nba";22intcount =getStringKeyCount(str,key);23System.out.println("key-count:" +count );24}2526publicstaticintgetStringKeyCount(String str, String key) {27intcount = 0;28if(!str.contains(key)){29System.out.println("nba出现次数:"+count);30}else{31while(str.contains(key)){32//首先索引到第一次nba出现位置33intfirst = str.indexOf(key);//234count++;35//找到下一次nba出现的位置36str = str.substring(first+key.length());37System.out.println(str);38}39//System.out.println("key出现次数:"+count);40}41returncount;42}4344}

实践三

1packagecom.itsuper.p3.String;23publicclassPratice3 {45/**6* 判断两个字符串中的最大相同子串。 abcefgkvcdejflsndlssdf、mendkgkvcdejfieksel7*8*@paramargs9*/1011/*12* 分析: 先拿短的字符串去看大串中是否包含,如果含有,则最大相同子串就是短的字符串13* 如果不含有,就将子串一次递减的方式,去放到长传中去看是否包含,知道找到最大子串14*15* 需要用到for循环16*/17publicstaticvoidmain(String[] args) {18String str1 = "abcefgkvcdejflsndlssdfdfa";19String str2 = "mendkgkvcdejfieksel";20String maxSubstr =FoundMaxSubstring(str1, str2);21System.out.println("最大相同子串:" +maxSubstr);2223}2425publicstaticString FoundMaxSubstring(String str1, String str2) {26//如何知道str1、str2哪一个是大的串,哪一个是小的串呢?需要判断27String max =null;28String min =null;29max = (str1.length()>str2.length())?str1:str2;30min = (max.equals(str1))?str2:str1;31System.out.println("max="+max);32System.out.println("min="+min);33//两层for循环很值得好好研究34for(intx = 0; x < str2.length(); x++) {35for(inty = 0, z = str2.length() - x; z != str2.length() + 1; y++, z++) {36String sub =str2.substring(y, z);37if(str1.contains(sub))38returnsub;39}40}41//如果没有,直接返回空42returnnull;43}4445}

实践四

1packagecom.itsuper.p3.String;23publicclassPractive4 {45/**6* 模拟trim功能一致的方法7* 实际是去除字符串两端的空白8*@paramargs9*/10publicstaticvoidmain(String[] args) {11String str = " abc dmef mdk ";12str =myTrim(str);13System.out.println("去除空格后的字符串:" + "--" + str + "---");14}15publicstaticString myTrim(String str) {16intstartIndex = 0;17intendIndex = str.length()-1;18//判断是否是字符,反过来就是判断是否是空格,从头开始判断19while(startIndex < endIndex && (str.charAt(startIndex)) == ' '){20startIndex++;21}22while(startIndex < endIndex && (str.charAt(endIndex)) == ' '){23endIndex--;24}25str =str.substring(startIndex, endIndex);26returnstr;27}2829}

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航