string类型一些需要注意的问题

目录

1.string是特殊的引用类型

2.String两种赋值方式

3.String 类是不可改变的

4.string创建对象问题

5.string和其他类型转换


1.string是特殊的引用类型

虽然string类型是引用数据类型但它是特殊的引用类型,string类型作为实参传入到方法中时,形参改变不会影响实参。

2.String两种赋值方式

String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上:

   赋值方式一:String s = “aaa”;

      在String池中分配空间,如果String池有aaa,直接将地址返回。如果Striing池中没有aaa,开辟空间存储aaa,将新地址返回

   赋值方式二:String s = new String("aaa");

      查看String池当中是否有aaa,如果有不用开辟新的空间,如果没有开辟String池空间存储aaa。在堆空间开辟一块空间,在空间里存储String池空间地址。

3.String 类是不可改变的

String 类是不可改变的解析,例如:

String s = "Google";
System.out.println("s = " + s);

s = "Runoob";
System.out.println("s = " + s);

输出结果为:

Google
Runoob

从结果上看是改变了,但为什么说 String 对象是不可变的呢?

原因在于实例中的 s 只是一个 String 对象的引用,并不是对象本身,当执行 s = "Runoob"; 创建了一个新的对象 "Runoob",而原来的 "Google" 还存在于内存中。

字符串实际上就是一个 char 数组,并且内部就是封装了一个 char 数组。并且这里 char 数组是被 final 修饰的:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

并且 String 中的所有的方法,都是对于 char 数组的改变,只要是对它的改变,方法内部都是返回一个新的 String 实例。

4.string创建对象问题

以下代码共创建了几个对象?

String s= "abd";

String s1=new String("hello");

String s2=new String("hello");

String s3=s1;

String s4=s2;

[答案]   4个对象。

1)Striing池中有一个对象abd          (1个对象)

2)String池开辟一个hello对象。在堆内存中开辟了一个对象(2个对象)

3)String池中有hello对象不需要在String池中开辟,需要在堆内存中开辟一个对象(1个对象)

4)只是在栈空间创建变量s3和s1指向同一个堆地址

5)在栈空间创建变量s4和s2指向同一个堆地址

5.string和其他类型转换

String转换基本数据类型,包装类之间的转换,调用包装类的静态方法 :包装类.parseXxx(str)

    public void test(){
        String st1 = "1";
        int i = Integer.parseInt(st1);
    }

基本数据类型,包装类转换String :调用 String重载的.valueOf(xxx)或者自动类型转换直接+字符串

    public void test(){
        int st1 = 123;
        String st2 = String.valueOf(st1);
        String st3 = st1+"";
    }

String 转换 字符数组char [ ] 调用String 的: .tocharArray()

    public void test(){
        String st1 = "adc123";
        char[] chars = st1.toCharArray();
        for (char c : chars) {
            System.out.print(c+",");
        }
    }

字符数组转换String 要调用String的构造器

    public void test(){
    char[] c = {'h','e','l','l','o'};
        String s = new String(c);
        System.out.println(s);
    }

编码:String --> byte[]:调用String的getBytes()


解码:byte[] --> String:调用String的构造器

        String st1 = "abc ";
        byte[] bytes = st1.getBytes();
        //string转字节数组
        byte[] gbks = st1.getBytes("gbk");
        //字节数组转String
        String s = new String(bytes);
        System.out.println(s);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值