JAVA关于String字符串
String概述:
- java.lang.String类代表字符串,Java程序中的所有字符文字(例如“abc”)都为此类的对象;
- 字符串的内容是不会发生改变的,他的对象在创建后不能更改。
String name="永劫";
String name="无间";
在这里一共创建了两个对象;可以理解为在在堆内存中String串池中创建了一个“永劫”;然后又创建了一个“无间”;然后把”无间“填入name中;
String my="永劫";
String name="无间";
System.out.println(my+name);
这个代码会创建三个对象(在串池中)一个是“永劫”一个是“无间”一个是“永劫无间”;
创建String对象的方式:
有两种:
- 直接赋值,例如:String name="Darling";
- 通过new关键字使用不同的构造方法创建对象:
public String() //创建空白字符串不含任何内容
public String(String original) //根据传入的字符串创建字符串对象
public String(char[] chs) //根据字符数组,创建字符串对象
public String(byte[] chs) //根据字节数组,创建字符串对象(可以理解为根据ASCLL码)
-
public String() //创建空白字符串不含任何内容
//字面意思
String s1=new String();//如果现在输出s1啥都不会输出,也就是输出空 -
public String(String original) //根据传入的字符串创建字符串对象
String s2=new String("永劫无间")//在这里创建s2对象的时候直接赋值“永劫无间”;所以如果打印也是“永劫无间” -
public String(char[] chs) //根据字符数组,创建字符串对象
char[] chs={'a','b','c','d'};
String s3=new String(chs); -
public String(byte[] chs) //根据字节数组,创建字符串对象(可以理解为根据ASCLL码)
byte[] bytes={97,98,99,100};
String s4=new String(bytes);//输出会输出"abcd"
JAVA的内存模型
对于new这种通过关键字创建对象的是:
对于直接赋值这种,有个串池,在里面创造对象,不过创建后不能改变
例如
public class StringDemo{
public static void main(String[] args){
String s1="abs";
String s2="abc";
}
}
在这里直接赋值,系统会检查串池中是否存在这个值,不存在就创建新的,存在的话就复用;
字符串的比较 :
对于基本数据类型:
比较的是数据值。
int a=10;
int b=20;
System.out.println(a==b);//输出false
对于引用数据类型:
比较的是地址值。
String s1= new String("abc");
String s2= new String("abc");
System.out.println(s1==s2);//输出false
这个false的原因是两个都是创建的,所以的地址不一样;如果两个都是直接赋值,那么会输出true,因为串池会重复调用。
字符串比较的方法:
boolean equals方法(要比较的字符串).....{完全一样的的结果才是true,否则为false}
"=="比较基本数据类型(数据值)引用数据类型(地址值);
public class Dome{
public static void main(String[] agrs){
String s1=new String("abc");
String s2="abc";//如果s1="Abc"就会输出false;
System.out.println(s1==s2);//false
boolean result1=s1.equals(s2);
System.out.println(result1);//true
}
}
boolean equalsIgnoreCase(要比较的字符串) .......{忽略大小写的比较}
public class Dome{
public static void main(String[] agrs){
String s1=new String("abc");
String s2="abc";//就算s1="Abc"也会输出true;
System.out.println(s1==s2);//false
boolean result1=s1.equalsIgnoreCase(s2);
System.out.println(result1);//true;
}
}
补充:
在用Scanner键盘录入的时候是在堆内存创建的不是串池!
遍历字符串统计字符串个数 :
- public char charAt(int index);//根据索引返回字符
- public int length();//返回字符串的长度
- 数组的长度:数组名。length
- 字符串长度:字符串对象。length()
public class zjh{ public static void main(String[] args){ String s1="abcd"; for(int i=0;i<s1.length();i++){ char s= s.charAt(i); //把这个字符串的第i为返回 System.out.println(c); } } }
字符串的拼接和反转:
String字符串可以加字符串生成一个新的字符串,不过不是在原来的基础上,应该是又新创建了一个字符串。
字符串反转的最简单的方法就是从最后一个遍历到第一个,然后又一个新的字符串加这个字符串的第i个元素。
StringBuilder:
概述:
可以看作是一个容器,创建之后里面的内容是可以改变的
作用:提高字符串的操作效率
public StringBuilder append(任意类型) //添加数据,并返回对象本身
public StringBuilder reverse()//反转容器中的内容从头到尾
public int length() //返回长度(字符出现的个数)
public String toString()//通过toString()就可以把StringBuilder转换成String
public String replace(a,b)//把a替换为b
subString(i)//从i开始截取,从0开始索引
StringBuilder sb=new StringBuilder();
1.sb.append(任意类型);
2.sb.reverse();
3.sb.length();
4.String bs=sb.toString();
链式编程:就是在调用一个方法的时候,不用变量接受他的结果,继续调用其它方法
StringJoiner:
概述:
和StringBuilder一样,也可以看作一个容器,创建之后里面的内容是可变的。
作用:提高字符串的操作效率,而且代码编写的特别简洁,但是很少用
public StringJoiner(间隔符号)//创建一个StringJoiner对象,指定拼接时的间隔符号
public STringJoiner(间隔符号,开始符号,结束符号)//创建一个StringJoiner对象,指定拼接时的间隔符号,开始符号,结束符号
public StringJoiner add(任意)//添加
public String toString()//返回一个字符串(该字符串就是拼接之后的结果)