• String类的常用方法以及知识点总结


     

    一,String的简介:

    •   查阅API中的String类的描述,发现String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
    •   一旦这个字符串确定了,那么就会在内存区域中就生成了这个字符串。字符串本身不能改变,但str变量中记录的地址值是可以改变的。
    •   字符串的本质是一个字符的数组(String类一旦被创建,就不能被改变)。

    1.1,String常量池

    •   字符串的分配,和其他的对象分配一样,耗费高昂的时间与空间代价。JVM为了提高性能和减少内存开销,
    •   在实例化字符串常量的时候进行了一些优化。为 了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,
    •   每当代码创建字符串常量时,JVM会首先检查字符串常量池。如果字符串已经存在池中, 就返回池中的实例引用。
    •   如果字符串不在池中,就会实例化一个字符串并放到池中。Java能够进行这样的优化是因为字符串是不可变的,可以不用担心数据冲突
    •   进行共享。
    1 public class Program
    2 {
    3     public static void main(String[] args)
    4     {
    5        String str1 = "Hello";  
    6        String str2 = "Hello"; 
    7        System.out.print(str1 == str2); //结果为true
    8     }
    9 }

      Note:String s = "aaa";
        这里,jvm创建一个变量引用s,在堆中创建一个对象aaa,将aaa放进常量池。s指向aaa。
        然后就到了change方法里,常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量。

    1.2,String s = "aaa";与String s = new String("aaa");的区别:

    •   String s = "aaa"; 对象只是一个引用,内存中如果有"aaa"的话,s就指向它;如果没有,才创建它;
    •   如果你以后还用到"aaa"这个字符串的话并且是这样用:
    •   String ss = "aaa"; String sss = "aaa"; 这三个变量都共享"aaa"。
    •   而String s = new String("aaa");是根据"aaa"这个String对象再次构造一个String对象,将新构造出来的String对象的引用赋给aaa

    1.3,String字符串的方法:

    •   public int length():返回此字符串的长度。
    •   public String():空构造
    •   public String(byte[] bytes):把字节数组转成字符串
    •   public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
    •   public String(char[] value):把字符数组转成字符串
    •   public String(char[] value,int index,int count):把字符数组的一部分转成字符串
    •   public String(String original):把字符串常量值转成字符串

    1.4,String类的判断功能:

    •   boolean equals(Object obj):比较字符串的内容是否相同,区分大小写a A
    •   boolean equalsIgnoreCase(String str):比较字符串的内容是否相同,忽略大小写 a A
    •   boolean contains(String str):判断大字符串中是否包含小字符串
    •   boolean startsWith(String str):判断字符串是否以某个指定的字符串开头
    •   boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾
    •   boolean isEmpty():判断字符串是否为空。

    1.5,String类的获取功能:

    •   int length():获取字符串的长度。
    •   char charAt(int index):获取指定索引位置的字符
    •   int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
    •   int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
    •   int indexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
    •   String substring(int start):从指定位置开始截取字符串,默认到末尾。
    •   String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。

    1.6,String的转换功能:                                 

    •   byte[] getBytes():把字符串转换为字节数组。
    •   char[] toCharArray():把字符串转换为字符数组。
    •   static String valueOf(char[] chs):把字符数组转成字符串。
    •   static String valueOf(int i):把int类型的数据转成字符串。
    •   注意:String类的valueOf方法可以把任意类型的数据转成字符串。
    •   String toLowerCase():把字符串转成小写。
    •   String toUpperCase():把字符串转成大写。
    •   String concat(String str):把字符串拼接。

    1.7,String类的其他方法:                                   

      1.String rerplace(char old,char new);
        返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
      2.String replace(String old,String new);
        返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
      3.String trim();
        去掉字符串两端的空格

    1.8,字符串的" "与null的区别:                                

      ""是字符串常量.同时也是一个String类的对象,既然是对象当然可以调用String类中的方法;
      Null是空常量,不能调用任何的方法,否则会出现空指针异常,null常量可以给任意的引用数据类型赋值

    二,创建字符串对象的两种方式的区别:                             

    2.1直接赋值创建对象:                                    

       1 String str = "hello world"; //直接赋值  

      直接赋值的方式创建的对象在方法的常量池中

    2.2,通过new关键字进行创建对象:                              

       1 String str=new String("hello");//实例化的方式 

      通过构造方法创建字符串对象是在堆内存

    2.3,两种实例化方式的比较:                                 

      1)编写代码比较

     1     public static void main(String[] args) {
     2         String str = "hello";
     3         String strl = new String("hello");
     4         String strll = strl; // 引用传递,str3直接指向st2的堆内存地址
     5         String strlll = "hello";
     6         /**
     7          * ==: 基本数据类型:比较的是基本数据类型的值是否相同 引用数据类型:比较的是引用数据类型的地址值是否相同
     8          * 所以在这里的话:String类对象==比较,比较的是地址,而不是内容
     9          */
    10         System.out.println(str == strl);    //結果:false 因为一个在常量池 一个在堆中所以地址不一样
    11         System.out.println(str == strll);    //結果:false 因为strll 引用了strl的地址
    12         System.out.println(strll == strl);    //結果:true 地址值相等,引用类型比较的是地址值
    13         System.out.println(str == strlll);    //結果:true 因为他们俩都引用了hello的常量所以相等
    14 
    15     }

      2)内存图分析

     

    4)总结:两种实例化方式的区别
      1)直接赋值(String str = "hello"):只开辟一块堆内存空间,并且会自动入池,不会产生垃圾。
      2)构造方法(String str= new String("hello");):会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,
        而且不能够自动入池,需要通过public String intern();方法进行手工入池。
        在开发的过程中不会采用构造方法进行字符串的实例化。

    三,关于String的面试题:

      2.4.1,String,StringBuffer和Stringbuilder有什么区别:

          String是字符串常量,一旦创建就不能修改;StringBuffer和StringBuilder是字符串可变量,可以修改,但是StringBuffer是线程安全的,StringBuilder是线程不安全的

      2.4.2,下面的代码将创建几个字符串对象。

    1 public static void main(String[] args) {
    2      String s1 = new String("Hello");  
    3      String s2 = new String("Hello");
    4       //答案是3个对象.
    5         //第一,行1 字符串池中的“hello”对象。
    6         //第二,行1,在堆内存中带有值“hello”的新字符串。
    7         //第三,行2,在堆内存中带有“hello”的新字符串。这里“hello”字符串池中的字符串被重用。      
    8         
    9 }    

      2.4.3代码中有几个字符串被创建;

         1 String str = new String("Cat"); 

        答:上面一行代码将会创建1或2个字符串。如果在字符串常量池中已经有一个字符串“Cat”,那么就创建一个“Cat”字符串。
        如果字符串常量池中没有“Cat”,那么首先会在字符串池中创建,然后才在堆内存中创建,这种情况就会创建2个对象了。  

  • 相关阅读:
    脱壳->模拟追踪脱壳法原理
    脱壳->内存断点法脱壳
    奇技淫巧技术-注册表的操作
    LoardPe与Import REC X64dbg脚本 脱壳 Upx
    VS快捷键一览表.常用快捷键整理.
    VS2019库头文件的使用
    PowerShell第一讲,别名,变量,命令。
    Debug技巧-启动调试附加原理
    strlen的另一种实现,可以作为ShellCode
    windows-遍历另一进程内存根据进程PID
  • 原文地址:https://www.cnblogs.com/joeyJss/p/10147492.html
Copyright © 2020-2023  润新知