String:最终类,不能被继承
“helloworld”–注意:所有的字符串,都是string的对象
字符串底层是由字符数组创建的。private final共同修饰,创建后不能改变(地址值和元素都不能改变)。
所有的常量都存储在方法区运行的常量池
Java中的常量池,实际上分为两种形态:静态常量池和运行时常量池。
1)所谓静态常量池,即*.class文件中的常量池,class文件中的常量池不仅仅包含字符串(数字)字面量,还包含类、方法的信息,占用class文件绝大部分空间。
2)而运行时常量池,则是jvm虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中,我们常说的常量池,就是指方法区中的运行时常量池。
StringBuiler是线程不安全,效率高
StringBuffer是线程安全,效率低
public class StringDemo {
public static void main(String[] args) {
//s1对象指向常量池
String s1="ab";
//s2的对象指向堆内存
,所以两个对象的地址值不同
String s2=new String("ab");
//s3指向常量池,后续创建的字符串和之前的一致,常量池就不创建新的
String s3="ab";
//如果参与的是常量,Java会在编译时期 进行优化然后先计算结果然后赋值
String s4="a"+"b";
String s5="a";
s5=s5+"b";
//String 底层是由StringBuilder来完成拼接,toString()创建新的字符串对象进行返回
s5=new StringBuilder("a").append("b").toString();
// s1指向常量池,s5指向堆内存
/*
* + 和StringBuilder拼接对比
* 空间::
* 1.+拼接
* String[] str={...};//100个字符串
* Strig s="";
* for(int i=0;i<str.length;i++{
* s+=str[i];//new StringBuilder(s).append(str[i]).toString();
*一次创建了3个对象
* }
* 一共创建了301个对象
//2.StringBuilder
* StringBuilder sb=new StringBuilder();
* for(int i=0;i<str.length;i++){
* sb.append(str[i]);//一次创建一个对象
* }
* String s1=sb.toString();//一个对象
* 一共创建102个对象
* 结论StringBuilder 在空间上由于+号添加
*/
// s5=s5+"b";
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s1==s4);
System.out.println(s1==s5);
System.out.println(s2==s5);
System.out.println(s5);
// System.out.println(s6==s1);
}
}
public class StringDemo2 {
public static void main(String[] args) {
//从1970年1月1日0点0分0秒到现在的毫秒值
long start= System.currentTimeMillis();
//1.+
/* String str="";
for (int i=1;i<100000;i++){
str+="a";
}*/
//2.stringbulider
StringBuilder sb=new StringBuilder();
for(int i=1;i<10000000;i++){
sb.append("a");
}
String s=sb.toString();
long end =System.currentTimeMillis();
System.out.println(end-start);
}//结论 时间上StringBulider优于+添加
}
重要方法:charAt(int index)返回指定索引对应数组元素的值
length()返回字符数组的长度
toCharArray字符串转成字符数组 例如:char[]cs=s.toCharArray()
Arrays.sort(cs);//排序
Arrays.toAtring(cs)//输出
//字符数组变成字符串
String str=new String(cs)
System.out.println(str)
//有开始下标的
String str=new String(cs,起始位置,
个数)
Arrays.copyOf(c,index//缩小到第几个是数字);
s.compareTo©两个字符数组比差值,如果差值一直为0,直到其中一个字符数组长度比较完成,然后 把长度相减
s.concat(string s)在字符串后面进行拼接,不改变s的值
s.contains(CharSequence s)原串包不包含子串,包含返回true,不包含返回false
s.endwith(String suffix)判断以什么为结尾
s.startsWith(String suffix)判断以什么为开始
应用:求一个字符串各个元素出现的次数
//判断 各元素出现的次数
public static void CounterLetter(String s){
//转成字符数组
char []cs=s.toCharArray();
//用boolean数组表示每个元素的计数状态
boolean[] b=new boolean[cs.length];
//初始化true 表示未计数,false表示已经计数
for (int i = 0; i < b.length; i++) {
b[i]=true;
}
//遍历字符数组
for (int i = 0; i < cs.length; i++) {
//判断是否计数
if(b[i]){
//没有计数
int count=1;
//转字符
char c=s.charAt(i);
//
for(int j=i+1;j<cs.length;j++){
//判断后面的元素是否相等
if(c==cs[j]){
count ++;
b[j]=false;
}
}
//输出
System.out.println(c+":"+count);
}
}