java中引用数据类型之String

1、字符串的分类:

         不可变的字符串: String:当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象.

         可变的    字符串:StringBuilder/StringBuffer:当对象创建完毕之后,该对象的内容可以发生改变,当内容发生改变的时候,对象保持不变.

String类:表示不可变的字符串,当前对象创建完毕之后,该对象的内容(字符序列)是不能改变的,一旦内容改变就是一个新的对象.


2.String对象的创建:

       1):直接赋一个字面量:       String   str1  =  “ABCD”;
       2):通过构造器创建:           String   str2  =  new String(“ABCD”);
两种方式有什么区别,分别在内存中如何分布?
String对象的空值:
       1):表示引用为空(null):   String  str 1 = null;      没有初始化,没有分配内存空间.   
       2):内容为空字符串:        String  str2  = “”;      已经初始化,分配内存空间,不过没有内容.
--------------------------------------------------------------------------------
判断字符串非空:
      1):引用不能为空(null);2):字符内容不能为空字符串(“”);
--------------------------------------------------------------------------------
字符串的比较操作:
      1):使用”==”号:          只能比较引用的内存地址是否相同.
      2):使用equals方法:         在Object类中和”==”号相同,建议子类覆盖equals方法去比较自己的内容.

                                             String类覆盖equals方法,比较的是字符内容.


3.常量池

常量池:专门存储常量的地方,都指的方法区中.
     编译常量池:  把字节码加载斤JVM的时候,存储的是字节码的相关信息.(不研究)
     运行常量池:  存储常量数据(研究).
----------------------------------------------
面试题1:
:::下列代码分别创建了几个String对象.
  String   str1  =  “ABCD”;     最多创建一个String对象,最少不创建String对象.
                                                 如果常量池中,已经存在”ABCD”,那么str1直接引用,此时不创建String对象.
                                                 否则,先在常量池先创建”ABCD”内存空间,再引用.
  String   str2  =  new String(“ABCD”);
                                                最多创建两个String对象,至少创建一个String对象.
                                                 new关键字:绝对会在堆空间,创建内存区域.  所以至少创建一个String个对象.
---------------------------------------------
面试题2:
:::说说下面String对象,彼此之间是否相等.

------------------------------------------------------

4、String对象比较:

 1):单独使用 ""引号创建的字符串都是直接量,编译期就已经确定存储到常量池中;
 2):使用 new String("")创建的对象会存储到堆内存中,是运行期才创建
 3):使用只包含直接量的字符串连接符如 "aa" + "bb"创建的也是直接量编译期就能确定,已经确定存储到常量池中(str2和str3);
 4): 使用包含String直接量(无final修饰符)的字符串表达式(如"aa" + s1)创建的对象是运行期才创建的,存储在堆中;
               通过变量/调用方法去连接字符串,都只能在运行时期才能确定变量的值和方法的返回值,不存在编译优化操作.


5、String类中的常用方法

1):String的创建和转换:
byte[] getBytes():把字符串转换为byte数组
char[] toCharArray():把字符串转换为char数组
String(byte[] bytes):把byte数组转换为字符串
String(char[] value):把char数组转换为字符串
2):获取字符串信息
int length() 返回此字符串的长度 
char charAt(int index) 返回指定索引处的 char 值 
int indexOf(String str)返回指定子字符串在此字符串中第一次出现处的索引。 
int lastIndexOf(String str)返回指定子字符串在此字符串中最右边出现处的索引 
3):字符串比较判断
boolean equals(Object anObject) 将此字符串与指定的对象比较。 
boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写
boolean contentEquals(CharSequence cs) 将此字符串与指定的 CharSequence 比较
4):字符串大小写转换
String toUpperCase()  把当前字符串转换为大写(谁调用该方法,谁就是当前字符)
String toLowerCase()  把当前字符串转换为小写


6、分别使用String/StringBuilder/StringBuffer来拼接30000次字符串,对比各自损耗的时间:

经过测试:
String做字符串拼接的时候,性能极低(耗时),原因是Sting是不可变的,每次内容改变都会在内存中创建新的对象.
String耗时:1964ms
StringBuffer耗时:3ms
StringBuilder耗时:1ms
结论:以后拼接字符串,统统使用StringBuffer/StringBuilder,不要使用String.
------------------------------------------------------------------
String和StringBuilder以及StringBuffer的区别(
建议使用StringBuilder):
   StringBuffer和StringBuilder都表示可变的字符串,功能方法都是相同的.
   唯一的区别:
  StringBuffer:  StringBuffer中的方法都使用了synchronized修饰符,表示同步的,在多线程并发的时候可以保证线程安全,保证线程安全的时候,性能(速度)较低.
  StringBuilder:StringBuilder中的方法都
没有使用了synchronized修饰符,不安全,但是性能较高.


扫描二维码关注公众号,回复: 1523274 查看本文章




猜你喜欢

转载自blog.csdn.net/pillow_of_you/article/details/80383612