黑马程序员——Java基础—字符串、StringBuffer

来源:互联网 发布:小学英语单词记忆软件 编辑:程序博客网 时间:2024/06/04 18:08


Java基础之String、StringBuffer



字符串:

字符串是一个特殊的对象。字符串一旦被初始化就不可以被改变。String s1 = "abc",s1是一个类类型变量,"abc"是一

个对象。

String s1 = "abc" 与 String s2 = new String("abc") :

s1==s2 比较的是内存地址值,s1.equals(s2):String类复写了Object类中的equals方法,该方法比较的是s1与s2中的内

容是否相同。s1与s2的区别:s1在内存中有一个对象,s2在内存中有两个对象。


String类是用于描述字符串事物,String类提供了很多方法对字符串进行操作。常见的操作方法有:

一.获取

1.字符串中包含的字符数,也就是字符串的长度。int length():获取长度。

2.根据位置获取位置上某个字符。char charAt(int index) 。

3.根据字符获取该字符在字符串中的位置。int indexOf(int ch):返回的是字符在字符串中第一次出现的位置。 

int indexOf(int ch,int fromIndex):从fromIndex指定位置开始查找,获取字符在字符串中出现的位置,如果没有找到则返回-1。 

int indexOf(String str):返回的是字符串在字符串中第一次出现的位置。 

int indexOf(String str,int fromIndex):从fromIndex指定位置开始,获取字符串在字符串中出现的位置。 

int lastIndexOf(int ch):从后向前查找,获取字符在字符串中的位置。

二.判断

1.判断字符串中是否包含某一个子串:boolean contains(str) 。特殊之处:indexOf(str)可以索引str第一次出现位置,

如果返回-1表示该str不在字符串中存在,该方法既可以判断子串是否存在也可以获取出现的位置。因此,也可以判断是否

包含子串,if(str.indexOf("aa")!=-1)。

2.判断字符串中是否有内容,也就是判断长度是否为0 :boolean isEmpty() 。

3.判断字符串是否以指定内容开头:boolean startsWith(str) 。

4.判断字符串是否以指定内容结尾:boolean endsWith(str) 。

5.判断字符串内容是否相同,复写了Object类中的equals方法。boolean equals(str) 。

6.判断字符串内容是否相同,并忽略大小写:boolean equalsIgnoreCase() 。

代码示例:

class StringDemo {public static void main(String[] args) {method_get();method_is();}public static void method_get(){String str = "abcdefbxyz";//字符串的长度sop(str.length());//根据位置获取位置上某个字符sop(str.charAt(3)); //当访问到字符串中不存在的角标时会出现StringIndexOutOfBoundsException 字符串角标越界异常。//根据字符获取该字符在字符串中的位置sop(str.indexOf('y'));//从fromIndex指定位置开始查找,获取字符在字符串中出现的位置sop(str.indexOf('f',6)); //如果没有找到返回-1 。//字符串在字符串中第一次出现的位置sop(str.indexOf("x"));//从fromIndex指定位置开始,获取字符串在字符串中出现的位置sop(str.indexOf("b",3));//从后向前查找,获取字符在字符串中的位置sop(str.lastIndexOf('b'));}public static void method_is(){String str = "ArrayDemo.java";//判断字符串中是否包含"Demo"sop(str.contains("Demo"));//判断字符串中是否有内容,长度是否为0 。sop(str.isEmpty());//判断字符串是否以"Array"开头。sop(str.startsWith("Array"));//判断字符串是否以".java"结尾。sop(str.endsWith(".java"));}public static void sop(Object obj){System.out.println(obj);}}

三.转换

1.将字符数组转成字符串:通过构造函数String(char[])将整个char类型的数组转换成字符串。通过构造函数

String(char[],offset,count)将字符数组中的一部分转成字符串,offset是起始角标,count是转换元素的个数。通过

静态方法:static String copyValueOf(char[]),static String copyValueOf(char[] data,int offset,int count) 。

2.(必要掌握)将字符串转成字符数组:很明显返回值类型是一个char[],查找API文档得知该方法是toCharArray(),不用传

参数,因为是对象调用,该对象就是要转的字符串。

3.将字节数组转成字符串:通过构造函数String(byte[])将整个byte类型的数组转换成字符串。通过构造函数

String(byte[],offset,count)将字节数组中的一部分转成字符串,offset是起始角标,count是转换元素的个数。

4.将字符串转成字节数组:很明显返回值类型是一个byte[],查找API文档得知该方法是getBytes(),不用传参数,因为是

对象调用,该对象就是要转的字符串。字符串和字节数组在转换的过程中可以指定编码表。

5.将基本数据类型转成字符串:static String valueOf(int) ,static String valueOf(double) 。

String转换方法示例;

public static void method_trans(){char[] arr = {'a','b','c','d','e','f'};String s= new String(arr,1,3); //将字符数组转成字符串。sop("s="+s);String s1 = "zxcvbnm";char[] chs = s1.toCharArray(); //将字符串转成字符数组。for(int x=0; x<chs.length; x++){sop("ch="+chs[x]);}}

四.替换

替换字符串中的字符。String replace(oldchar,newchar):返回值类型是一个String,oldchar代表原来的字符,newchar

代表新的字符。用新字符替换老字符。如果要被替换的老字符不存在,那么返回的还是原来的字符串。

示例:String s = "hello java"; String s1 = s.replace('a','n');

String replace(CharSequence target, CharSequence replacement):也可以将字符串中的子字符串替换成新的子字符串。示例:String s = "hello java"; String s1 = s.replace("java","world");

代码示例:

public static void method_replace(){String s = "hello java";String s1 = s.replace('q','n');//如果要替换的字符不存在,返回的还是原串。String s1 = s.replace("java","world");sop("s="+s);sop("s1="+s1);}

五.切割

可以把字符串分开的。String[] split(分割符):把字符串分开之后成为了字符串类型的数组,因此返回值类型是

String[]。通过对象调用split方法切割。示例:String s = "zhangsan,lisi,wangwu";  String[] arr = s.split(,); 

切割代码示例:

public static void  method_split(){String s = "zhagnsa,lisi,wangwu";String[] arr  = s.split(","); //按照一定的规则切割字符串。for(int x = 0; x<arr.length; x++){sop(arr[x]);}}

六.子串

获取字符串中的一部分。String substring(begin):从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异

常。substring(begin,end):从指定位置开始到end的前一个,包含头,不包含尾。示例:String s = "abcdef";

 s.substring(2); s.substring(2,4);

获取子串示例:

public static void method_sub(){String s = "abcdef";sop(s.substring(2));//从指定位置开始到结尾。如果角标不存在,会出现字符串角标越界异常。sop(s.substring(2,4));//包含头,不包含尾。s.substring(0,s.length());}

如何按照最大的字节数取子串?汉字的默认编码是gbk。一个汉字两个字节并且都是负数。只有判断最后一个字节是否是负

数。如果是,就往前继续看有多少负数。如果是偶数个,不舍弃。如果是奇数个,即舍弃最后一个字节。

七.转换、去除空格、比较

1.将字符串转成大写或者小写。String toUpperCase(); String toLowerCase()。示例:String s = "Hello Java"; 

s.toUpperCase();

2.将字符串两端的多个空格去除。String trim(); 示例:String s = "  Hello Java  "; s.trim();

3.对两个字符串进行自然顺序的比较,按字典顺序比较两个字符串。int compareTo(string); 比较的结果分为:正数、负

数和0。正数代表对象比string大,负数代表对象比string小,0代表两个字符串大小相同。只比较到不同的字符就可以

了,后面的字符不用比较了。示例:String s1 = "abc"; String s2 = "aaa"; s1.compareTo(s2); 

/*字符串练习:获取一个字符串在另一个字符串中出现的次数。"abkkcekkdrkkhqkkuekk"思路:1.定义一个计数器记录"kk"在字符串中出现的次数。2.获取kk第一次出现的位置。3.从kk第一次出现的位置之后作为字符串继续查找kk出现的位置,每出现一次就计数一次。4.当获取不到时,计数完成。*/class  StringTest2{public static void main(String[] args) {String s = "kkakkbkkcekkdrkkhqkkuekk";sop("count="+getSubCount_1(s,"kk"));sop("count="+getSubCount_2(s,"kk"));}//方式一:需要截子串,在子串里重新开始查,在内存中会创建多个字符串较为消耗内存。public static int getSubCount_1(String st,String key) {int count = 0;int index = 0;while((index=st.indexOf(key))!=-1){st = st.substring(index+key.length());count++;}return count;}//方式二:不用截子串,就在那一个字符串上查找,每次查找是接续上一次查到之后接着获取的。public static int getSubCount_2(String st,String key){int count = 0;int index = 0;while((index = st.indexOf(key,index))!=-1){index = index + key.length();count++;}return count;}public static void sop(String st){System.out.println(st);}}

StringBuffer

StringBuffer是字符串缓冲区,是一个容器,长度是可变的,可以直接操作多个数据类型,最终通过toString()变成字符

串。字符串的组成原理就是通过该类实现。String字符串一旦被初始化就不可以被改变,而StringBuffer是可以进行更改

的,记住面盆理论,操作的都是同一个对象。StringBuffer可以对字符串内容进行增删。很多方法与String相同。当数据

类型不确定,数据的个数不确定,而且最终要变成字符串的时候,使用缓冲区是最方便的。

C create , U update , R read , D delete

1.存储

StringBuffer append(数据):将指定数据作为参数添加到已有数据结尾处。StringBuffer insert(index,数据):可以将

数据插入到指定index位置。示例:StringBuffer sb = new StringBuffer(); sb.append("abc").append(22);

sb.insert(2,"qq");

2.删除

StringBuffer delete(start,end):删除缓冲区中的数据,包含start,不包含end 。sb.delete(0,sb.length()):清空缓

冲区。 StringBuffer deleteCharAt(index):删除指定位置的字符。

3.获取

char charAt(int index):获取指定位置上的字符。 int indexOf(String str):获取指定字符串出现的位置。 

int lastIndexOf(String str):从后向前查找,获取字符串出现的位置。int length():获取缓冲区的长度。

String substring(int start,int end):获取字符串缓冲区中的子串,从指定位置开始到end的前一个,包含start,不包

含end。

4.修改

StringBuffer replace(start,end,string):将指定的位置替换成一个字符串,以start开始不包含end结尾的部分换成一

个字符串。

void setCharAt(int index,char ch):将指定的角标位置替换成另一个字符。注意:返回值类型很特殊是void的。

5.反转

StringBuffer reverse():反转之后返回的仍然是StringBuffer 。

6.将缓冲区中的指定数据存储到指定的字符数组中。包含头不包含尾。

void getChars(int sreBegin ,int srcEnd ,char[] dst ,int dstBegin) :int sreBegin 源的开始位,int srcEnd 源的

结束位,char[] dst 目的字符数组,int dstBegin 目的开始位。

StringBuffer功能操作演示:

class StringBufferDemo {public static void main(String[] args) {StringBuilder sb = new StringBuilder("abcdef");char[] chs = new char[6];sb.getChars(1,4,chs,1);for(int x=0; x<chs.length; x++){sop("chs["+x+"]="+chs[x]+";");}}public static void method_update(){StringBuffer sb  = new StringBuffer("abcde"); sb.replace(1,4,"java"); //将从1开始到不包含4的部分替换成"java"。sb.setCharAt(2,'k'); //将指定的角标位置替换成另一个字符。sop(sb.toString());}public static void method_del(){StringBuffer sb  = new StringBuffer("abcde");  sb.delete(1,3); //删除1到3的前一个。sb.delete(0,sb.length());//清空缓冲区。sb.deleteCharAt(2); //删除指定位置的字符。sop(sb.toString());}public static void method_add(){StringBuffer sb = new StringBuffer();sb.append("abc").append(true).append(34); //将指定数据作为参数添加到已有数据结尾处。StringBuffer sb1 = sb.append(34);sop("sb==sb1:"+(sb==sb1));  sb.insert(1,"qq"); //将数据插入到指定index位置。sop(sb.toString());sop(sb1.toString());}public static void sop(String str){System.out.println(str);}}


StringBuilder

JDK1.5版本之后出现了StringBuilder。 StringBuffer是线程同步,StringBuilder是线程不同步,两者在功能方法的使用

上完全一致,在日后的开发中建议使用StringBuilder,因为效率更高。

1、StringBuilder:一个可变的字符序列,该类被与StringBuffer一样动态添加字符串,可以用在字符串缓冲区被单个线

程使用的时候。单线程实例中它比 StringBuffer 要快。一般情况下,我们用StringBuilder主要替换StringBuffer的

append和insert方法。

append 方法始终将这些字符添加到生成器的末端;而insert方法则在指定的点添加字符。(用于单线程)

2、StringBuffer:线程安全的可变字符序列。可以动态添加字符串,能进行修改。(一般用于多线程)

JDK升级三个因素:提高效率、简化书写、提高安全性。



0 0
原创粉丝点击