了解String类

1.String类的概念和不变性

* Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
* 字符串是常量,在创建之后不能更改
* 其实就是说一旦这个字符串确定了,那么就会在内存区域中就生成了这个字符串。字符串本身不能改变,但str变量中记录的地址 值是可以改变的。

* 源码分析,String类底层采用的是字符数组:
private final char value[]
private 修饰说明value只能在String类内部使用,而且又没有提供get方法,所以外部无法获取value数组,就无法改变数组中元素的值
final修饰说明value是常量,一旦创建,就不能被改变,value一旦被初始化成某个数组,将永远指向这个数组,不可能再指向其它的数组了

2.String类创建方式和比较

* a: 创建对象的数量比较
            * String s3 = "abc";
                * 在内存中只有一个对象。这个对象在字符串常量池中
             * String s4 = new String("abc");
                * 在内存中有两个对象。一个new的对象在堆中,一个字符串本身对象,在字符串常量池中
           * b: 案例代码
               public class StringDemo2 {
                  public static void main(String[] args) {
                    //字符串定义方式2个, 直接=  使用String类的构造方法
                    String str1 = new String("abc");
                    String str2 = "abc";
                    System.out.println(str1);
                    System.out.println(str2);
                    System.out.println(str1==str2);//引用数据类型,比较对象的地址 false
                    System.out.println(str1.equals(str2));//true
                }
            }

3.String类常见的构造方法
            * public String():空构造
            * public String(byte[] bytes):把字节数组转成字符串
            * public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串            
            * public String(String original):把字符串常量值转成字符串

String类的其他方法          

方法 简介
int length(): 返回字符串的长度
 String substring(int beginIndex,int endIndex)
           
获取字符串的一部分
String substring(int beginIndex) 获取字符串的一部分,从beginIndex到最后一个
        
boolean startsWith(String prefix) 判断一个字符串是不是另一个字符串的前缀,开头
boolean endsWith(String prefix) 判断一个字符串是不是另一个字符串的后缀,结尾
boolean contains (String s) 判断一个字符串中,是否包含另一个字符串
int indexOf(char ch) 查找一个字符,在字符串中第一次出现的索引,被查找的字符不存在,返回-1
byte[] getBytes(): 将字符串转成字节数组,此功能和String构造方法相反,byte数组相关的功能,查询编码表
char[] toCharArray() 将字符串转成字符数组,功能和构造方法相反
boolean equals(Object obj) 方法传递字符串,判断字符串中的字符是否完全相同,如果完全相同返回true
boolean equalsIgnoreCase(String s)  传递字符串,判断字符串中的字符是否相同,忽略大小写 
char[] toCharArray() 将字符串转成字符数组
int length() 返回字符串的长度 ,包含多少个字符
int lastIndexOf(String str) 返回在此字符串中最右边出现的指定子字符串的索引。

String类经典面试题

1.String类是基本类型吗?

答案:不是。java有四类八型,它们是浮点型(float,double),整型(int,long,short,byte),Boolean类型,字符型(char)


 2.String是否可以被继承?

答案:不可以,因为String类似final类.前面源码已经说明了,String类底层采用的是字符数组,private final char value[]

 

3.String和StringBuilder、StringBuffer的区别?
答:Java平台提供了两种类型的字符串:String和StringBuffer/StringBuilder,其中String是只读字符串,String引用的字符串内容是不能被改变的。而StringBuffer/StringBuilder类表示的字符串对象可以直接进行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。


 4.、String s = new String(“xyz”);创建了几个字符串对象?
答:两个对象,一个是静态区的”xyz”,一个是用new创建在堆上的对象。               

5.判断下面是输出值

                    String str1 = new String("abc");
                    String str2 = "abc";
                    System.out.println(str1);
                    System.out.println(str2);
                    

答案:System.out.println(str1==str2);//引用数据类型,比较对象的地址 false
          System.out.println(str1.equals(str2));//true

扩展一下:如何分辨“==”和equals()呢,“==”在比较数值的时候比如int类型时,比较的是它们的值,在比较引用类型的时候如String时,比较的是它们的地址;equals在比较String类型时,比较的是它们的值。

猜你喜欢

转载自blog.csdn.net/qq_39186755/article/details/81069165