Java学习13 2020-02-18

内容

1.String类小注意点
2.String类的字符串常量池
3.String类对象的几种声明方式及注意点
4.String类使用不建议频繁拼接
5.String常用的一些方法使用示例
6.正则表达式简单了解

一.String类注意点

String不可继承,同时它也是不可变类

java.lang.String是字符串类型,字符串一旦创建不可再改变。但并不是说引用不能指向其他对象

 public static void main(String[] args){
      
         String a = "abc";
         
         a = "def";
     }
     

比如这个,是正确的,a可以改变指向,因为a前面没有final。但是abc这个字符串本身就不能变了,也就是说底层存在两个对象 abc和def

二.String类的字符串常量池

因为字符串用的多,所以要提升字符串的访问效率,在程序中使用了“缓存”技术。所以在java中所有使用双引号括起来的字符串都会在“字符串常量池”中创建一份,字符串常量池在方法区中被存储

1.字符串常量池机制

在程序执行过程中,如果程序用到某个字符串,例如“abc”,那么程序会先在字符串常量池中去搜索该字符串,如果没有找到则在字符串常量池中新建一个“abc”字符串,如果找到就直接拿过来用

2.字符串常量池作用

字符串常量池是一个缓存区为了提高访问字符串的效率

三.String类对象的几种声明方式及注意点

1.常用的

     String a = "abc";//在字符串常量池中新建一个“abc”字符串对象,该对象不可变
         
         String b = "abc";//从字符串常量池中直接拿来用
         
         System.out.println(a == b);//比较的内存地址,因为a和b内存地址相同,所以输出true

2.和其他类创建对象类似的

         String c = new String("def");
         
         String d = new String("def");
         
         System.out.println(c == d);//因为c和d都是new出来的,所以内存地址肯定不一样,所以输出false

3.比较字符串是不是相等的方法

     String c = new String("def");
         
         String d = new String("def");
         
        
         System.out.println(c.equals(d));//比较字符串是否一样,用equals。String已经把equals方法重写,因为在Object类里面equals是比较内存地址的
//下面的就输出true,因为字符串内容是一样的

4.String类对象两种声明方式原理图

Java学习13 2020-02-18_第1张图片
String类对象两种声明方式原理图
解释:

String s1 = "abc";只会在字符串常量池中创建一个"abc"对象。
String s2 = new String("hello");会在字符串常量池中创建一个"hello"字符串对象,并且会在堆中再创建一个字符串对象
所以第二种方式比较浪费内存,常用第一种方式

5.面试题

 String c = new String("def");
         
         String d = new String("def");

上面的程序创建了三个对象。
堆中2个,方法区字符串常量池中1个

6.除了上面两种声明方式外,还可以

     public static void main(String[] args){
      
         byte[] bytes = {97,98,99,100};
         
         String a = new String(bytes);
         
         System.out.println(a);
     
    }

输出
abcd

四.String类使用不建议频繁拼接

先来看下面一段代码

         //以下程序执行之后,会在字符串常量池中创建三个字符串对象
         //"aaa" "bbb" "aaabbb"
         String e = "aaa";
         String f = "bbb";
         String g = e + f;
         System.out.println(g);

一般不建议直接用+拼接字符串,因为字符串一旦创建不可改变,只要频繁拼接,就会在字符串常量池中创建大量的字符串对象,给垃圾回收带来问题

典型例子

     public static void main(String[] args){
      
          String[] Like = {"music","sports","food","trival"};
          
          //要求把上面的四个元素拼接起来,用逗号隔开
          String temp = "";
          for(int i = 0;i < Like.length ;i++) {
              if(i != Like.length - 1) {
                  temp += Like[i] + ",";              
              }else {//如果是最后一个,那就不用加逗号了
                  temp += Like[i];
              }
          }
          //输出拼接后的字符串
          System.out.println(temp);
     
    }

就比如这个程序,虽然可以达成目的,但是每一次循环就创建一次字符串,太浪费空间了

五.String常用的一些方法使用示例

这里只是写出了一小部分,用时再查看相关资料即可

package 对象;

/*字符串常用的方法
 * 
 */

public class 测试程序 {
        
     public static void main(String[] args){
      
         //1.返回char , charAt(int index)
         //返回指定索引处的 char 值
         String a = "我是中国人";
         
         char s1 = a.charAt(2);//输出中
        
         System.out.println(s1);
         
         //2.返回boolean endsWith(String endStr)
         //测定此字符串是否以指定的后缀结束
         boolean b = a.endsWith("中国人");//这里中国人别忘了加双引号
         
         System.out.println(b);
         
         //3.返回boolean equalsIgnoreCase(String anotherString)
         //与equals类似,这个是比较两个字符串是否相等,但是不考虑大小写
         String c = "我是中国人";
         
         boolean d = c.equalsIgnoreCase(a);
         
         System.out.println(d);
         
         //4.返回byte[]  getBytes()
         //使用平台的默认字符集将此String编码为byte序列,并将结果存储到一个新的byte数组
         byte[] e = a.getBytes();
         
         System.out.println(e[1]);
         
         //5.返回int indexOf(String str)
         //返回指定字符(str)串在此字符串第一次出现处的索引
         int f = "我是中国人".indexOf("中");
                 
         System.out.println(f);     
         
         //6.返回int indexOf(String str,int fromIndex)
         //返回指定字符(str)串在此字符串第一次出现处的索引,从指定的索引开始
         int g = "我是中国人.".indexOf("中",3);
         
         System.out.println(g);
         
         //7.返回int lastIndexOf(String str)
         //返回指定字符(str)串在此字符串最后一次出现处的索引.
         int h = "我是中国人".lastIndexOf("中");
         
         System.out.println(h);
         
         //8.返回int lastIndexOf(String str, fromIndex)
         //返回指定字符(str)串在此字符串最后一次出现处的索引.从指定的索引开始反向搜索
         
         int i = "我是中国人".lastIndexOf("中", 4);
         
         System.out.println(i);
         
         //9.返回int length(),length()在字符串里面是方法,在数组里面是属性,返回元素个数
         //返回此字符串的长度
         int j = a.length();
         
         System.out.println(j);
      
         //10返回boolean startsWith(String str);
         //测定此字符串是否以指定的前缀开始
         boolean l = a.startsWith("我");
         
         System.out.println(l);
     }
}

输出结果
1:中
2:true
3:true
4:-46
5:2
6:-1
7:2
8:2
9:5
10:true

六.正则表达式简单了解

正则表达式是一门独立的学科,是通用的,是一种字符模型,专门做字符串格式匹配的。
就比如邮箱格式不对,报错,这个底层就是正则表达式实现的
例如
"^a(2)$"表示两个a字符,等同于"aa"

你可能感兴趣的:(Java学习13 2020-02-18)