一、 String类概述
1.1、字符串是一个特殊的对象,一旦被初始化就不可以被改变。
定义一个字符串对象:String str = “abc”;
例:String s1 = “abc”; //s1是一个类类型变量,”abc”是一个对象;
String s2 = new String(“abc”);
System.out.println(s1 == s2); //false;
System.out.println(s1.equals(s2));
//true; String类复写了Object类中的equals方法,该方法用于判断字符串内容是否相同。
s1与s2的区别:s1在内存中只有一个对象;s2在内存中有两个对象(new,”abc”)。
二、字符串操作方法
String类是用于描述字符串事物的,它提供了多个方法对字符串进行操作。常见的操作方法有:
2.1、获取
A、字符串中包含的字符数,也就是字符串的长度;
int length():获取字符串的长度;
B、根据位置获取位置上的某个字符
char charAt(int index);
C、根据字符获取该字符在字符串中位置;
int indexOf(int ch):返回的是ch在字符串中第一次出现的位置;
int indexOf(int ch, int fromIndex):从fromIndex指定位置开始,获取ch在字符串中出现的位置;
int indexOf(String str):返回的是str在字符串中第一次出现的位置;
int indexOf(String str, int fromIndex):从fromIndex指定位置开始,获取str在字符串中出现的位置。
int laseIndexOf(String str):从最后一个字符开始索引,找出字符所在位置。
2.2、判断
A、字符串中是否包含某一个子串;
boolean contains(str)
特殊点:indexOf(str)可以索引str第一次出现的位置,如果返回-1则表示该str在字符串中不存在,所以也可以用于判断指定字符串是否包含。而且该方法既可以判断字符串是否包含,也可以获取该字符串出现的位置。
Eg:if(str.indexOf(“aa”) != -1)
B、字符串中是否有内容;
boolean isEmpty(): 判断字符串长度是否为0;
C、字符串是否以指定内容开头;
boolean startsWith(str).
D、字符串是否以指定内容结尾;
boolean endsWith(str).
E、判断字符串内容是否相同;原理:复写了Object类中的equals()方法。
boolean equals(str);
F、判断字符串内容是否相同,并忽略大小写。
boolean equalsIgnoreCase(str);
示例:
- class StringDemo
- {
- public static void main(String[] args)
- {
- //method_get();
- //method_is();
- //method_replace();
- //method_split();
- method_7();
- }
- public static void method_get()
- {
- String str = "absktdapio";
- //获取长度;
- sop(str.length());
- //根据索引获取字符;
- sop(str.charAt(4));
- //sop(str.charAt(40)); //当访问到字符串中不存在的角标时,
- //会发生StringIndexOutOfBoundsException.
- //根据字符获取索引;
- sop(str.indexOf('a')); //默认获取第一个字符出现位置;
- sop(str.indexOf('a',2));//从指定位置开始获取字符出现位置;
- sop(str.indexOf('z')); //如果要找的字符不存在,则返回-1;
- //反向索引一个字符出现的位置;
- sop(str.lastIndexOf('a'));
- }
- public static void method_is()
- {
- String str = "ArrayDemo.java";
- //判断文件名是否以"Array"开头;
- sop(str.startsWith("Array"));
- //判断文件名是否是.java文件;
- sop(str.endsWith(".java"));
- //判断文件名中是否包含"Demo";
- sop(str.contains("Demo"));
- }
- public static void method_replace()
- {
- String s = "Hello java";
- String s1 = s.replace('a','n'); //如果替换的字符不存在,返回的还是原字符串
- sop("s="+s); //打印出的s字符串不变:Hello java;
- sop("s1="+s1); //s1将是替换后的结果:Hello jnvn.
- }
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- }
2.3、转换
A、将字符数组转换成字符串;
构造函数:String (char[])
String (char[],offset,count):将字符数组中的一部分转换成字符串
静态方法:static String copyValueOf(char[])
static String copyValueOf(char[], int offset, int count)
static String valueOf(char[])
B、将字符串转换成字符数组;
char[] toCharArray()
C、将字节数组转换成字符串;
String(byte[])
String(byte[],offset,count):将字节数组中的一部分转换成字符串。
D、将字符串转换成字节数组;
byte[] getBytes()
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
E、将基本数据类型转换成字符串
static String valueOf(int)
static String valueOf(double)
eg: 3+””等同于String.valueOf(3)
2.4、替换
String replace(old char, new char)
Eg: String s = "Hello java";
String s1 = s.replace("java","world");
System.out.println(s1); //运行结果:Hello world
2.5、切割
String[] split(regex)
- public static void method_split()
- {
- String str = "Mike,Lucy,Lily";
- String[] arr = str.split(","); //从,处开始切割,将切割的元素装入数组中;
- for(int x=0;x<arr.length;x++)
- {
- System.out.println(arr[x]);
- }
- }
2.6、子串:获取字符串中的一部分
String substring(begin);
String substring(begin,end); 包含头不包含尾;
如果子串中输入的角标不存在,则会出现角标越界异常。
使用示例:str = “jablktdit”
System.out.println(str.substring(2,5)); 打印结果:blk
2.7、转换、去除空格、比较
A、将字符串大写转换成小写或者将小写转换成大写。
String toUpperCase();
String toLowerCase();
B、将字符串两端的多个空格去掉
String trim();
C、对两个字符串进行自然顺序的比较
int compareTo(String);
- public static void method_7()
- {
- String s = " Hello Java ";
- System.out.println(s.toLowerCase());
- System.out.println(s.toUpperCase());
- System.out.println(s.trim());
- String s1 = "abc";
- String s2 = "dhk";
- System.out.println(s1.compareTo(s2));
- }
1、从字符串s中查找出其子字符串”ss”出现的次数;
- class StringTest1
- {
- public static void main(String[] args)
- {
- String s = "ssqwersstyuissioyusshudfhdgjhsshthghss";
- int c = getSubCount(s,"ss");
- System.out.println("count = "+c);
- }
- public static int getSubCount(String str,String key)
- {
- int index = 0;
- int count = 0;
- while((index = str.indexOf(key,index)) != -1)
- {
- index = index+key.length(); //indexOf从0开始查找字符串"ss",
- count++; //每找到一次后就重新从index+key.length()开始查找。
- }
- return count;
- }
- }
2、比较字符串s1和s2,找出相同的最长的子字符串:
- class StringTest2
- {
- public static String getMaxSubString(String s1,String s2)
- {
- String max = "",min = "";
- max = (s1.length() > s2.length())? s1:s2;//保证s2为短的字符串;
- min = (max == s1)?s2:s1; //减少循环次数;
- for(int x=0;x<min.length();x++) //外循环控制字符串长度;
- {
- for(int y=0,z=min.length()-x;z!=min.length()+1;y++,z++)
- { //内循环控制在固定长度的字符串的个数;
- String temp = min.substring(y,z);
- if(max.contains(temp))
- return temp;
- }
- }
- return "";
- }
- public static void main(String[] args)
- {
- String s1 = "atghellotectkc";
- String s2 = "dhellogde";
- System.out.println(getMaxSubString(s1,s2));
- }
- }
三、StringBuffer
3.1、StringBuffer概述
字符串的组成原理就是通过该类实现的;
StringBuffer可以对字符串中的内容进行增删;
StringBuffer是一个容器;
很多方法与String相同;
Stringbuffer是可变长度的。
StringBuffer是字符串缓冲区。
3.2、StringBuffer特点:
1)、长度可以变化;
2)、可以直接操作多个数据内型;
3)、最终会通过toString方法变成字符串。
3.3、StringBuffer作用
存储、删除、获取、修改
1)、存储
StringBuffer append():将指定数据作为参数添加到已有数据结尾处;
StringBuffer insert(offset,数据):可以将数据插入到指定offset位置。
2)、删除
StringBuffer delete(int start, int end):删除缓冲区中的数据,包含头,不包含尾;
StringBuffer deleteCharAt(int index):删除指定位置的字符。
3)、获取
int length();
char charAt(int index);
int indexOf(String str);
int lastIndexOf(String str);
String substring(int start, int end)
4)、修改
StringBuffer replace(int start, int end, String str);
Void setCharAt(int index , char ch);
5)、反转
StringBuffer reverse();
6)、将缓冲区中的指定数据存储到指定字符数组中。
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
示例:
- class StringBufferDemo
- {
- public static void main(String[] args)
- {
- StringBuffer sb = new StringBuffer("abcdefg");
- char[] chs =new char[6];
- sb.getChars(1,4,chs,2);//将字符串sb中1~4字符(即bcd)存入到数组chs中,
- //从角标2开始存储,空位为空,越过角标将发生角标越界异常;
- System.out.print("[");
- for(int x=0;x<chs.length;x++)
- {
- if(x != chs.length-1)
- System.out.print(chs[x]+",");
- else
- System.out.println(chs[x]+"]");//最后打印结果:[ , ,b,c,d, ];
- }
- //method_del();
- //method_update();
- }
- public static void method_add()
- {
- StringBuffer sb = new StringBuffer();
- sb.append("Hello ").append("Java ").append("World!!!");
- System.out.println(sb.toString()); //输出:Hello Java World!!!
- sb.insert(6,"ok "); //在位置6插入ok 字符串;
- System.out.println(sb.toString());
- }
- public static void method_del()
- {
- StringBuffer sb = new StringBuffer("HelloJava");
- sb.delete(1,3); //打印结果:HloJava;
- System.out.println(sb.toString());
- sb.deleteCharAt(2); //删除第2个字符;打印结果:HlJava
- System.out.println(sb.toString());
- //清空缓冲区
- sb.delete(0,sb.length());
- System.out.println(sb.toString()); //打印为空;
- }
- public static void method_update()
- {
- StringBuffer sb = new StringBuffer("abcdefg");
- //sb.replace(1,4,"java"); //打印结果:ajavaefg
- sb.setCharAt(2,'j'); //打印结果:abjdefg
- System.out.println(sb.toString());
- }
- }
四、StringBuilder
StringBuilder是JDK 1.5版本之后出现的。
升级原因:
1)、提高效率;
2)、简化书写;
3)、提高安全性。
StringBuffer是线程同步的;
StringBuilder是线程不同步的;
其他用法与StringBuffer用法相同;
开发建议使用StringBuilder。