基础类库:String类 Part1

java.lang.String
String 类代表字符串。所有字符串字面值(如 “abc” )都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。(这里指的是值不能变,但引用变量可以变)
1.构造方法
A.public String()String()
初始化一个新创建的 String 对象,使其表示一个空字符序列。
B.String(byte[] bytes)
通过使用平台的默认字符集解码指定的 byte数组,构造一个新的 String。
C.String(byte[] bytes, int offset, int length)
通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
D.String(char[] value)
分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。
E.String(char[] value, int offset, int count)
分配一个新的 String,它包含取自字符数组参数一个子数组的字符。
F.String(String original)
初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;
换句话说,新创建的字符串是该参数字符串的副本。
2.经典问题:字面值赋给字符串对象和new一个字符串对象有什么区别?即:
String s=new String(“hi”)和String s=”hi”有什么区别?
前者会创建两个对象,堆内存一个,字符串常量池一个;后者只创建一个对象,在字符串常量池中。
详见d盘内存图解

package API_ordinary;

public class StringDemo {

    public static void main(String[] args) {
        //构造方法1
        String s1=new String();
        //构造方法2:byte是8位-127~128
        byte[] b=new byte[]{97,98,99,100,101,102};
        String s2=new String(b);
        System.out.println(s2);
        //构造方法3:byte数组的索引0开始,长度为3
        String s3=new String(b,0,3);
        System.out.println(s3);
        //构造方法4
        char[] c=new char[]{'a','b','c','d','e','f'};
        String s4=new String(c);
        System.out.println(s4);
        //构造方法5:byte数组的索引0开始,长度为3
        String s5=new String(c,0,3);
        System.out.println(s5);
        //构造方法6
        String s6=new String("abcdef");
        //这不是调用构造方法获得的字符串,已存在的实例赋给s7引用变量
        String s7="abcdef";
        //问题:上面构造了3次字符串"abcdef",在内存中到底有几个呢?s2/s4/s6/s7
        System.out.println("..................................");

        //单独测试1:哈希值是否可以当做地址看?
        System.out.println("单独测试1:哈希值是否可以当做地址看?");
        System.out.println("s2哈希值:"+s2.hashCode());
        System.out.println("s4哈希值:"+s4.hashCode());
        System.out.println("s6哈希值:"+s6.hashCode());
        System.out.println("s7哈希值:"+s7.hashCode());
        //结果:不能!他们的哈希值都相同,但实际地址值都不同
        //==比较的是引用类型的地址值
        //equals方法默认比较的是地址值,但String类重写的equals,比较的是内容
        System.out.println("s2和s4的地址值是否相同:"+(s2==s4));
        System.out.println("s2和s4的内容是否相同:"+s2.equals(s4));
        System.out.println("s4和s6的地址值是否相同:"+(s4==s6));
        System.out.println("s4和s6的内容是否相同:"+s4.equals(s6));
        System.out.println("s6和s7的地址值是否相同:"+(s6==s7));
        System.out.println("s6和s7的内容是否相同:"+s6.equals(s7));
        //还有几种情况没写,基本可以判断,s2/s4/s6/s7分别对应自己的内存空间
        System.out.println("..................................");


        //单独测试2:怎么理解字符串是常量?
        System.out.println("单独测试2:怎么理解字符串是常量?");
        //此处将哈希值作为地址值参考,他们不严格相等
        String str1="hello";
        System.out.println("str1第一次哈希值:"+str1.hashCode());
        str1+="world";
        System.out.println("str1第二次哈希值:"+str1.hashCode());
        System.out.println("字符串是常量的意思是:String类实例的内容即字符序列不可改变,但引用变量是可以变的!");
        System.out.println("这说明引用变量str1里保存的地址值变了,指向连接后的字符串了。即引用变量str1是可变的!");

        //单独测试3:new字符串和字符串常量池有什么区别?
        System.out.println("..................................");
        System.out.println("单独测试3:new字符串和字符串常量池有什么区别?");
        String str3=new String("hi");
        String str4="hi";
        System.out.println("str3和str4的地址值是否相同:"+(str3==str4));
        System.out.println("str3和str4的内容是否相同:"+str3.equals(str4));
        System.out.println("..................................");


        //面试题:解答见D盘内存图
        System.out.println("面试题:");
        String ss1="string";
        String ss2="test";
        String ss3="stringtest";
        System.out.println(ss3==ss1+ss2);
        System.out.println(ss3.equals(ss1+ss2));
        System.out.println(ss3=="string"+"test");
        System.out.println(ss3.equals("string"+"test"));
    }

}

abcdef
abc
abcdef
abc
…………………………….
单独测试1:哈希值是否可以当做地址看?
s2哈希值:-1424385949
s4哈希值:-1424385949
s6哈希值:-1424385949
s7哈希值:-1424385949
s2和s4的地址值是否相同:false
s2和s4的内容是否相同:true
s4和s6的地址值是否相同:false
s4和s6的内容是否相同:true
s6和s7的地址值是否相同:false
s6和s7的内容是否相同:true
…………………………….
单独测试2:怎么理解字符串是常量?
str1第一次哈希值:99162322
str1第二次哈希值:-1524582912
字符串是常量的意思是:String类实例的内容即字符序列不可改变,但引用变量是可以变的!
这说明引用变量str1里保存的地址值变了,指向连接后的字符串了。即引用变量str1是可变的!
…………………………….
单独测试3:new字符串和字符串常量池有什么区别?
str3和str4的地址值是否相同:false
str3和str4的内容是否相同:true
…………………………….
面试题:
false
true
true
true

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值