String简介
public final class String
extends Object
implements Serializable, Comparable<String>, CharSequence
String是一个特殊的引用数据类型 一般情况下 引用数据类型需要new关键字进行创建对象 String可以直接进行赋值
String str = “会飞的鲁班”;
String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
String str = “abc”;
等同于
char data[] = {‘a’, ‘b’, ‘c’};
String str = new String(data);
String字符串内容一旦给定不能修改值
public class String Demo1{
public static void main(String[] args) {
String str = "hello";
str+="world";
str+="!!!";
System.out.println(str);
}
}
String两种赋值的区别:
之所以内容会相等,是因为在 JAVA 底层中存在了一个字符串的对象池,每次的内容都会从池中取出,如果内容已经 存在了,则使用已经存在的,如果不存在,则会生成一个新的,放入池中,属于共享设计模式。 由于这种原因,只要是使用 String类的话,永远都要采用直接赋值的方式完成。
String的equals()方法
NO | method | type | desc |
---|---|---|---|
1 | public boolean equals(Object anObject) | boolean | 判断两个字符串内容是否相等 |
package demo;
public class StringDemo04 {
public static void main(String args[]){
String str1 = "hello" ;
String str2 = new String("hello") ;
String str3 = str2 ;
System.out.println("str1 == str2 --> " + (str1==str2)) ; // false
System.out.println("str1 == str3 --> " + (str1==str3)) ; // false
System.out.println("str2 == str3 --> " + (str2==str3)) ; // true
};
}
两种比较的区别:==和 equals() · ==:用于数值比较(比较的是值)用于对象,比较的是两个对象的地址值 · equals():用于内容的比较,比较两个字符串(对象)的内容是否相等
String的其它比较方法
method | desc |
---|---|
public boolean equalsIgnoreCase(String anotherString) | 将此 String 与另一个 String 比较,不考虑大小写 |
public int compareTo(String anotherString) | 比较字符串ASCII的大小 |
public boolean startsWith(String prefix) | 测试此字符串是否以指定的前缀开始 |
public boolean endsWith(String suffix) | 测试此字符串是否以指定的后缀结束 |
案例:
package com.scy.stringdemo;
/**
*
* @author gqk
*
*/
public class StringDemo2 {
public static void main(String[] args) {
String str = "www.gqk.com";
boolean flag1 = str.startsWith("cn");//false
boolean flag2 = str.endsWith("com");//true
System.out.println(flag1);
System.out.println(flag2);
}
}
String 搜索方法
method | desc |
---|---|
public int indexOf(int ch) | 返回指定字符在此字符串中第一次出现处的索引。如果未出现该字符,则返回 -1。 |
public int indexOf(String str) | 返回指定子字符串在此字符串中第一次出现处的索引。如果它不作为一个子字符串出现,则返回 -1 |
public int lastIndexOf(int ch) | 返回指定字符的最后一次出现的字符串中的索引 如果没有k的值存在,则返回-1 |
public int lastIndexOf(String str) | 返回指定子字符串最后一次出现的字符串中的索引 如果没有k的值存在,则返回-1 |
public static void main(String[] args) {
String str = "ILOVE gqk";
/**
* public int indexOf(int ch) {
return indexOf(ch, 0);
}
*/
int index = str.indexOf('g');
System.out.println(index);//6
}
String大小写的转换
方法原型 | 说明 |
---|---|
public String toLowerCase() | 将字符串转换为小写的 |
public String toUpperCase() | 将字符串转为大写 |
案例:模拟忽略验证码大小写
package com.scy.demo;
import java.util.Scanner;
public class StringDemo2 {
public static void main(String[] args) {
String code = "abCDeF";
Scanner scanner = new Scanner(System.in);
System.out.println("请输入验证码:");
String codes = scanner.next();
if(code.toUpperCase().equals(codes.toUpperCase()) ||
code.toLowerCase().equals(codes.toLowerCase())){
System.out.println("验证码相等");
}else{
System.out.println("验证码不相等");
}
}
}
String和数组之间的转换
方法原型 | 解释说明 |
---|---|
public byte[] getBytes() | 将字符串转换为byte数组 |
public char[] toCharArray() | 将字符串转换为字符数组 |
案例:
package com.scy.demo;
public class StringDemo3 {
public static void main(String[] args) {
String str = "HelloWorld";
byte[] bytes = str.getBytes();
char[] chars = str.toCharArray();
System.out.println(bytes.length);//10
System.out.println(chars.length);//10
}
}
字符串的截取
方法原型 | 解释说明 |
---|---|
public String substring(int beginIndex) | 返回一个字符串,该字符串是此字符串的子字符串。 子字符串以指定索引处的字符开头,并扩展到该字符串的末尾。 |
public String substring(int beginIndex, int endIndex) | 从beginIndex开始截取,截取到endIndex个 |
案例:截取图片的后缀
package com.scy.demo;
public class StringDemo4 {
public static void main(String[] args) {
String strs = "asdadsdas-qweqwe-sad-sad-xzcasd110.jpg";//截取图片的后缀
String str = "HelloWorld";
String s = str.substring(5);//从低5个开始截取(不留第5个)
System.out.println(s);//World
int len = strs.lastIndexOf(".");
System.out.println(len);//34
String img = strs.substring(len);
System.out.println(img);
}
})
字符串的替换(经常用于和谐字段)
方法原型 | 方法描述 |
---|---|
public String replace(char oldChar,char newChar) | newChar将oldChar全部替换 |
public String replaceAll(String regex,String replacement) | 根据正则表达式替换,替换的是后面的参数 |
public class StringDemo5 {
public static void main(String[] args) {
String str = "你吗好吗?";
str = str.replace('吗','*');
System.out.println(str);
}
}
StringBuffer和StringBulider(面试题)
String类一旦内容给定是不能进行修改的,但是在我们实际开发中 不修改字符串是不可能的 所以 提供了以下的俩个类 专门用来操作字符串的更改
StringBuffer
结构
由final修饰的类 说明此类不能被继承的,默认继承了Object类
线程安全(线程同步),可变的字符序列。 字符串缓冲区就像一个String ,但可以修改
public final class StringBuffer
extends Object
implements Serializable, CharSequence
构造方法
方法 | 描述 |
---|---|
public StringBuffer() | 构造一个没有字符的字符串缓冲区,初始容量为16个字符。 |
public StringBuffer(String str) | 构造一个初始化为指定字符串内容的字符串缓冲区。 字符串缓冲区的初始容量为16加上字符串参数的长度。 |
案例:
package com.scy.demo;
/**
* 初始容量是16 但是容量一定不是长度
*/
public class StringBufferDemo1 {
public static void main(String[] args) {
StringBuffer buffer1 = new StringBuffer();
StringBuffer buffer2 = new StringBuffer("HelloWorld");
System.out.println(buffer1.length());
System.out.println(buffer2.length());
}
}
常用方法
方法名称 | 方法描述 |
---|---|
public StringBuffer append(String str) | 将指定的字符串附加到此字符序列 |
public StringBuffer insert(int offset, X x) | 将x插入到指定的字符序列之中,X为任意类型。 |
public int length() | 返回长度(字符数)。 |
public StringBuffer reverse() | 导致该字符序列被序列的相反代替 |
案例:
package com.scy.demo;
public class StringBufferDemo2 {
public static void main(String[] args) {
StringBuffer strBuf = new StringBuffer("Java");
strBuf.append(" tedu gqk/"); //连接
System.out.println(strBuf);
strBuf.append(3);
System.out.println(strBuf);//java tedu gqk/3
strBuf.insert(5, "Student"); //插入
System.out.println(strBuf);
strBuf.setCharAt(20, '.'); //替换字符
System.out.println(strBuf);
strBuf.reverse(); //倒序
System.out.println(strBuf);
String str = strBuf.toString();
System.out.println(str);
}
}
StringBuilder
和StringBuffer用法类似但是不保证 线程安全(同步)线程异步的(线程不安全的)
面试题:
String,StringBuffer和StringBulider的区别: