String类
java.lang.Object
java.lang.String
String
类代表字符串。Java 程序中的所有字符串字面值(如 "abc"
)都作为此类的实例实现。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。
public class StringDemo {
// "" 包含的就是一个对象
public static void main(String[] args) {
String s1 = "abc"; //s1 是一个类型变量, "abc" 是一个对象
// 字符串最大特点:一旦被初始化就不可以被改变。
String s2 = new String("abc");
String s3 = "abc";
// s1 和 s2 的区别:
// s1 中有一个对象
// s2中有两个对象
System.out.println(s1 == s2); // false
System.out.println(s1 == s3); // true s1 和 s3指向同一个内存地址
System.out.println(s1.equals(s2)); // true String类复写了Object类中equals方法,//该方法用于判断字符串是否相同。
}
}
常用方法:
1,获取。
1.1 字符串中的包含的字符数,也就是字符串的长度。
int length():获取长度。
1.2 根据位置获取位置上某个字符。
char charAt(int index):
1.3 根据字符获取该字符在字符串中位置。
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 lastIndexOf(int ch) :反向索引
2,判断。
2.1 字符串中是否包含某一个子串。
boolean contains(str):
特殊之处:indexOf(str):可以索引str第一次出现位置,如果返回-1.表示该str不在字符串中存在。
所以,也可以用于对指定判断是否包含。
if(str.indexOf("aa")!=-1)
而且该方法即可以判断,有可以获取出现的位置。
2.2 字符中是否有内容。
boolean isEmpty(): 原理就是判断长度是否为0.
2.3 字符串是否是以指定内容开头。
boolean startsWith(str);
2.4 字符串是否是以指定内容结尾。
boolean endsWith(str);
2.5 判断字符串内容是否相同。复写了Object类中的equals方法。
boolean equals(str);
2.6 判断内容是否相同,并忽略大小写。
boolean equalsIgnoreCase();
3,转换。
3.1 将字符数组转成字符串。
构造函数:String(char[])
String(char[],offset,count):将字符数组中的一部分转成字符串。
静态方法:
static String copyValueOf(char[]);
static String copyValueOf(char[] data, int offset, int count)
static String valueOf(char[]):
3.2 将字符串转成字符数组。**
char[] toCharArray():
3.3 将字节数组转成字符串。
String(byte[])
String(byte[],offset,count):将字节数组中的一部分转成字符串。
3.4 将字符串转成字节数组。
byte[] getBytes():
3.5 将基本数据类型转成字符串。
static String valueOf(boolean | char | char[] | double | float | int | long | Object )
//3+"";//String.valueOf(3);
特殊:字符串和字节数组在转换过程中,是可以指定编码表的。
4,替换
String replace(oldchar,newchar);
5,切割
String[] split(regex);
6,子串。获取字符串中的一部分。
String substring(begin);
String substring(begin,end);
7,转换,去除空格,比较。
7.1 将字符串转成大写或则小写。
String toUpperCase();
String toLowerCase();
7.2 将字符串两端的多个空格去除。
String trim();
7.3 对两个字符串进行自然顺序的比较。
int compareTo(string); # 按字典顺序比较两个字符串。 比较是基于字符串中每个字符的Unicode值。
返回为0,两字符串相等
返回为正数,前一个字符串大于后一个
返回为负数,前一个字符串小于后一个
public class StringMethodDemo {
public static void method_get() {
String str = "abcadef";
// 长度
System.out.println(str.length());
//根据索引获取字符串
System.out.println(str.charAt(5)); // 当访问字符串中不存在的角标时返回StringIndexOutOfBoundsException异常
//根据字符串获取索引,不存在返回-1
System.out.println(str.indexOf('a'));
System.out.println(str.indexOf('a', 2)); //3 从第二个位置开始查找
System.out.println(str.indexOf("de")); //4 字符串"de" 的索引
// 反向索引一个字符出现的位置
System.out.println(str.lastIndexOf('a')); // 3 从尾部开始索引
}
public static void method_is() {
String str = "ArrayDemo.java";
//判断文件名是否以Array开头
System.out.println(str.startsWith("Array"));
//判断文件名是否以.java开头
System.out.println(str.endsWith(".java"));
//判断文件中是否包含Demo
System.out.println(str.contains("Demo"));
}
public static void method_trans() {
char[] c = {'a','b','c','d','e','f'}; // 字符数组
// 将字符数组转化成字符串 (构造方法转化)
String s1 = new String(c); // abcdef
String s2 = new String(c,2,3); // cde 2索引开始,3个字符
String s3 = String.copyValueOf(c); // abcdef 等同于 String s = new String(c)
// 将基本数据类型转成字符串
String s4 = String.valueOf(true); // true
String s5 = String.valueOf(c); // abcdef
String s6 = String .valueOf(20.99); //20.99
//将字节数组转成字符串。
byte[] b = {98,99,100};
String s7 = new String(b); // bcd
//将字符串转化成字符数组
char[] c1 = "abcd".toCharArray();
for(int i = 0;i<c1.length;i++) {
System.out.println(c1[i]);
}
// 将字符串组转成字节数组。
byte[] bytes = "abced".getBytes();
for(int j = 0;j<bytes.length;j++) {
System.out.print(bytes[j]+","); // 97,98,99,101,100,
}
}
public static void method_replace(){
String s = "hello java 123";
// String s1 = s.replace('h', 'o'); // oello java 替换一个字符
// String s1 = s.replace("hello", "hi"); // hi java 字符串替换
String s1 = s.replaceAll("[\\s]+", ","); // hello,java,123 正则替换
System.out.println("s="+s);
System.out.println("s1="+s1);
}
public static void method_split(){
String s = "hello java 123";
String[] arr = s.split("\\s+"); // 可以是正则,也可以是字符串
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static void method_sub(){
String s = "abcdesfsf";
// 获取子串
System.out.println(s.substring(2)); //cdesfsf // 当索引不存在时,会出现角标越界异常
System.out.println(s.substring(2, 5)); //包含头不包含尾 cde
}
public static void method_other(){
String s = " abcdeSSfsf ";
System.out.println(s.toLowerCase()); //转成小写
System.out.println(s.toUpperCase()); // 转成大写
System.out.println(s.trim()); // 去除两边空格
String s1 = "abc";
String s2 = "aac";
String s3 = "a1b";
System.out.println(s1.compareTo(s2)); // 1 b的ASCll 98 ,a是97,b-a = 1
System.out.println(s3.compareTo(s2)); // -48 1的ASCll 49 ,a是97,1-a = -48
}
public static void main(String[] args) {
//method_get();
//method_is();
//method_trans();
// method_replace();
// method_split();
// method_sub();
method_other();
}
}
练习一:
public class StringTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
String s = " dfsaf f ";
System.out.println(myTrim(s));
}
//练习一: 去除字符串两端空格
public static String myTrim(String str){
int start = 0,end = str.length()-1;
while(start<=end && str.charAt(start) == ' '){
start++;
}
while(start<=end && str.charAt(end) == ' '){
end--;
}
return str.substring(start,end+1);
}
}
练习二:
public class StringTest2 {
public static void main(String[] args) {
String s = "abcde ";
System.out.println(reverseString(s)); // edcba
System.out.println(reverseString(s,2,4)); //abdce
}
// 练习二:将字符串反转,可指定字符串反转
/*
思路:
1.将字符串转换成字符数组
2.对数组进行反转
3.将数组变成字符串
*/
// 包含头不包含尾
public static String reverseString(String str,int startIndex,int endIndex){
char[] c1 = str.toCharArray();
// 反转数组
recverse(c1,startIndex,endIndex);
return String.valueOf(c1);
}
private static void recverse(char[] c1,int startIndex,int endIndex) {
for (int start = startIndex,end = endIndex-1; start < end; start++,end--) {
swap(c1,start,end);
}
}
private static void swap(char[] c1, int start, int end) {
char temp = c1[start];
c1[start] = c1[end];
c1[end] = temp;
}
public static String reverseString(String str){
return reverseString(str, 0, str.length());
}
}
练习三
public class StringTest {
public static void main(String[] args) {
String s = "abkkcdkkefkkskk";
System.out.println(stringCount(s, "kk"));
System.out.println(stringCount2(s, "kk"));
}
// 练习三
/*
获取一个字符串在另一个字符串中出现的次数。
"abkkcdkkefkkskk"
思路:
1,定义个计数器。
2,获取kk第一次出现的位置。
3,从第一次出现位置后剩余的字符串中继续获取kk出现的位置。
每获取一次就计数一次。
4,当获取不到时,计数完成。
*/
//方法一:效率比较慢,每次都要获新的取子串的;
public static int stringCount(String str,String s){
int count = 0;
int index = 0;
// 当获取不到位置时结束。
while((index = str.indexOf(s))!=-1){
str = str.substring(index+s.length());
count++;
}
return count;
}
//方法二: indexOf(s,index) // 从指定位置开始查找
public static int stringCount2(String str,String s){
int count = 0;
int index = 0;
while((index = str.indexOf(s,index))!=-1){
index = index + s.length();
count++;
}
return count;
}
}
练习四
public class StringTest {
public static void main(String[] args) {
System.out.println(getMaxSubString("abcwerthelloyuiodef", "cvhellobnm"));
}
//练习四
/*
获取两个字符串中最大相同子串。第一个动作:将短的那个串进行长度一次递减的子串打印。
"abcwerthelloyuiodef"
"cvhellobnm"
思路:
1,将短的那个子串按照长度递减的方式获取到。
2,将每获取到的子串去长串中判断是否包含,
如果包含,已经找到!。
*/
public static String getMaxSubString(String s1,String s2)
{
String max = "",min = "";
max = (s1.length()>s2.length())?s1: 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))//if(s1.indexOf(temp)!=-1)
return temp;
}
}
return "";
}
}