String是字符串,String是一个类。

String 字符串用一对""表示

1.String类时使用final修饰,不能被继承

2String 实现了Serializable序列化接口。支持序列化以及反序列化操作(IO)

3.String实现了Comparable接口 string支持比较大小

4.String类中定义了private final char value[];存放字符串的值(String底层通过字符数组来存放字符序列)

String是不可变的字符序列,具有不可变性

 //不可变性
 String s1="hello";//使用字面量(常量)对String赋值
 String s2="hello";
 System.out.prinln(s1==s2);//true 比较对象地址是否相等
 s1="helloworld";
 System.out.println(s1==s2);//false

 

 

在其底层代码中不难看出String类是继承Object 实现序列化接口(Serializable),线程(Comparable<String>)等等

public final class String extends Object
implements Serializable,Comparable<String>,CharSequence

如果String采用的是字面量方式进行赋值,那么该字符串存放在方法去的常量池

而常量池中的数据一般是不重复的(尽管使用的是”==“比较比较的是对象的地址)

 

 

String的创建方法:

常用:

1.字面量赋值

2.String (String original);

吧字符串封装成字符串对象

this.value = original;

 

s2->new 的对象(对象的属性value)value->常量池

 了解==\equals之间的区别(传址、传值)

String s1="hello";
String s2="hello";
String s3=new String ("hello");
String s4=new String ("hello");
s1==s2;//true
s1==s3;//false
s3==s4;//false

String(char [] value)

String(char [] value,int index ,int dest)

 

char[] cArr={'a','b','c'}
String s =new String(cArr);
//s="abc";
String s1=new String (cArr,1,2);
//s="bc";

字符串拼接问题

 

字符串拼接过程中,一旦出现了变量,那么最终拼接之后的字符串都保存在堆中

String s1="hello";
String s2="world";

String s="helloworld";

String s3="hello"+"world";
//有了变量存储位置就会放在堆中
String s4=s1+"world";
String s5="hello"+s2;


s==s3;//true
s==s4;//false
s==s5;//false
//堆中的存储位置不同
s4==s5;//false

字符串判断

1.boolean equals(Object obj);比较字符串内容是否相同(尽量使用,少用==)

String s1="hello";
String s2=new String("hello");
s1==s2;//false  比较地址是否相等
String s3="Hello";
s1.equals(s2);//true
boolean result=s1.equalsIgnoreCase(s3);
//true

2..boolean equalsIgnoreCase(String str);比较字符串内容是否相同,忽略大小写(可以运用于验证码)

3..boolean startsWith(String str);判断字符串是否以str开头

4.boolean endsWith(String str)判断字符串对象是否以指定的str结尾

获取

 

int length();

(int 是返回值)获取字符串长度,其实就是字符个数

char charAt(int index);

获取指定索引(从0开始)处的字符

int indexOf(String str);

获取str在字符串对象中第一次出现的索引(默认从0开始查找)

使用场景:判断字符串中是否包含某个子串

特:s.indexOf("e",4);(但是查找到的索引还是从0开始记数)

从后向前找

s.laseIndexOf("e");

 

String substring (int start);

从start开始截取字符串

没有返回值就是在原有基础上修改像数组但是String一般都有返回值,因为字符串不可被修改

需要使用新的字符串来接受

String str=s.substring (5);

 

String substring(int start ,int end);

从start开始,到end结束。[start,end)

 

String类转换功能

char[]  (返回值类型)    toCharArray();

把字符串转化为字符数组

String  toLowerCase();

把字符串转换为小写字符串

String toUpperCase();

把字符串转换为大写字符串

 

 

String类的其他方法

String trim()

去除字符串两端空格

(注册时候后台要将首尾空格去掉或者前台失去焦点后自动去除)

String[]  split(String str)

按照指定符号分割字符串

 

String s="a.png";

String[] s1=s.split("\\.");//"."可能被转义我们需要加上\\

//获取后缀
String fileName="a.xxx.png";
String fileExt=fileName.substring(fileName.lastIndecOf("."));//  .png
    fileExt1=fileName.substring(fileName.lastIndecOf(".")+1);//png

补充方法

1.int compareTo(String anotherString)

比较两个字符串的字典。

如果字符串长度相等的情况下,依次比较每个字母,如果相同位置的字母不同,返回每个字母对应的ascii码值的差

如果当前位置字母相同,则比较下一个

如果每一位都相同,返回0

如果字符串长度不同,则返回两个字符串长度的差值

 

先比较每一位如果不同就输出差值,再比较长度

String s1="ab";// 97 98 99
String s2="dfg";//100 102 103
int result=s1.compareTo(s2);
//-3第一个字母相等

String concat(String str)

将指定的字符串拼接在字符串的末尾

 

boolean contains(CharSequense s)

如果并且只有当此字符串包含指定的字符序列的字符串值。则返回真值

 

String intern()

将字符串存放到常量池并返回该对象

如果常量池中没有helloworld,则开辟空间存放你hell world,并返回

 

 

boolean matches(String regex)

告诉是否存在正则表达式

 

String regex="\\d+";//正则表达式
String num="123";
boolean matches =num.matches(regex);

String replace (CharSquence target,CharSquencereplacement)

//替换指定的字符(字符串)全部替换
String s=s1.replace('a','v');
//a替换成v
String s=s1.replace("ab","ni");