黑马程序员——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 delete1.存储
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升级三个因素:提高效率、简化书写、提高安全性。
- 黑马程序员——Java基础—字符串、StringBuffer
- 黑马程序员——Java基础--------StringBuffer
- 黑马程序员—Java API(字符串缓冲区StringBuffer、StringBuilder)
- 黑马程序员——Java基础——String、StringBuffer
- 黑马程序员:Java基础——StringBuffer与StringBuilder
- 黑马程序员——JAVA基础之String和StringBuffer
- 黑马程序员——Java基础---String类和StringBuffer
- 黑马程序员—JAVA基础—String类、StringBuffer类
- 黑马程序员——Java基础---StringBuffer、Arrays、包装类
- 黑马程序员—JAVA基础之String、StringBuffer
- 黑马程序员——Java基础---字符串
- 黑马程序员—8、JAVA基础&字符串
- 黑马程序员—StringBuffer
- 黑马程序员-java基础 StringBuffer
- (五)黑马程序员——Java中的字符串操作类(String、StringBuilder、StringBuffer)
- 黑马程序员——StringBuffer
- 黑马程序员——StringBuffer
- 黑马程序员——java语言基础部分——String、StringBuffer StringBuild学习笔记一
- 【设计模式】初识
- .NET ORM框架
- Linux -- Nginx 负载均衡和反向代理
- Oracle spatial、openlayers、geoserver开发地理信息系统总结
- windows和linux下androidSDK是否通用?
- 黑马程序员——Java基础—字符串、StringBuffer
- 为ASP网站引用WCF后台
- u-boot分析(三)---boot命令实现以及内核的启动
- HDU 2063 -- 过山车(匈牙利)
- Ubuntu下安装phpmyadmin
- Lombok浅析#1
- android不通过自定义layout,修改通知logo
- shell 调试技术
- Matlab图像处理学习笔记(五):Harris角点检测