Java基础知识-String篇

目录

1、基本知识

2、String、StringBuffer和SringBuilder的区别

3、为什么把String定义成final?

4、String不可变的好处

5、s.intern()方法的作用:Java中的字符串驻留(String Interning)_abc6772的博客-CSDN博客

6、==和equals 方法比较String的结果相同吗?

7、String 有长度限制吗?

1、基本知识

  1. 不可变字符序列,位于Java核心类的jar包中
  2. String是引用数据类型 
  3. 底层是一个 private final char value[] 字符数组常量:

2、String、StringBuffer和SringBuilder的区别

  1. String是不可变字符序列,StringBuffer和SringBuilder是可变字符序列
  2. SringBuilder线程不安全,效率高;StringBuffer线程安全,效率低

3、为什么把String定义成final?

在程序编写时会大量地用到String,如果每次声明String都要新建一个String对象,特别浪费空间。所以,java堆开辟了一块存储空间String pool,用于存储String常量对象。当有多个String声明或者赋值为相同字符串时,实际上指向的是同一个Sting pool中的对象,而不需要额外的创建对象。

4、String不可变的好处

1. 便于String pool实现。只有当字符串不可变,String pool才能实现。String pool实现后在运行时节约大量堆空间,因为不同变量名值相同的话都指向池中的同一字符串。如果字符串是可变的,那么String interning将不能实现(译者注:String interning是指对不同的字符串仅仅只保存一个,即不会保存多个相同的字符串。),因为这样的话,如果变量改变了它的值,那么其它指向这个值的变量的值也会一起改变。

2. 避免网络安全问题。如:数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接;在socket编程中,主机名和端口都是以字符串的形式传入。因为字符串是不可变的,所以它的值是不可改变的,否则黑客们可以钻到空子,改变字符串指向的对象的值,造成安全漏洞。

3. 多线程并发安全。字符串不可变,同一个字符串实例才可以被多个线程共享。这样便不用因为线程安全问题而使用同步。字符串自己便是线程安全的。

4. 避免本地安全性问题。类加载器要用到字符串,不可变性提供了安全性,以便正确的类被加载。譬如你想加载java.sql.Connection类,而这个值被改成了myhacked.Connection,那么会对你的数据库造成不可知的破坏。

5. 加快字符串处理速度。因为字符串是不可变的,所以在它创建的时候hashcode就被缓存了,不需要重新计算。这就使得字符串很适合作为Map中的键,字符串的处理速度要快过其它的键对象。这就是HashMap中的键往往都使用字符串。

5、s.intern()方法的作用:Java中的字符串驻留(String Interning)_abc6772的博客-CSDN博客

使用s.intern()方法的时候,会将共享池中的字符串与外部的字符串(s)进行比较,如果共享池中有与之相等 的字符串,则不会将外部的字符串放到共享池中的,返回的只是共享池中的字符串,如果不同则将外部字符串放入共享池中,并返回其字符串的句柄(引用)-- 这样做的好处就是能够节约空间。

6、==和equals 方法比较String的结果相同吗?

不一定,String 的equals方法比较的是值是否一致, ==比较的是两个字符串的地址是否一致。

String s0=”kvill”;
String s1=”kvill”;
String s2=”kv” + “ill”;
System.out.println( s0==s1 ); // true
System.out.println( s0==s2 ); // true

String s3=new String(”kvill”);
String s4=”kv” + new String(“ill”);
System.out.println( s0==s3 ); // false
System.out.println( s0==s4 ); // false
System.out.println( s3==s4 ); // false

// 总结:在编译期间能够确定的字符串变量(s0,s1,s2),会被统一放到常量池。
//不能确定的变量(s3,s4),会在执行时,在堆中单独分配对象。(地址不同)

7、String 有长度限制吗?

JAVA的String长度有限制吗?是多少?_javastring长度限制_CrazyGood的博客-CSDN博客

编译阶段:不能超过65535。这个主要因为常量池中对String类型的结构体定义,对于索引定义了u2,就是无符号占2个字节,2个字节可以表示的最大范围是2^16 -1 = 65535。

运行阶段:最大能存4GB。这个主要是因为char[] 的length是Integer类型,最大【0~2^31-1】通过计算是大概4GB。

你可能感兴趣的:(JAVA面试,java,后端)