String类,内存图,及其api,测试题

1.String对象用于保存字符串,也就是一组字符序列。

2.String name = "aaa", "aaa"是字符串常量。双引号括起。

3 字符使用unicode字符编码,一个字符(不区分字符汉字)占两个字节。

4 常用构造器

String s1 = new String();//空

String s2 = new String(String s);

String s3 = new String(char[] a);

String s4 = new String(char[] a,int startIndex,int count) 指的是将数组从startIndex开始count个数的字符传入。

String s5 = new String(byte[] b)

5 String 类实现了Serializable,表示String 可以串行化(序列化),可以在网络传输。

实现了Comparable,对象可以比较大小。

6 String 是final类,不能被继承。

7 属性 private final char value[]用于存放字符串内容。

8 value 是final类型,不可以被修改地址,但是单个字符可以变化。

代码如下

  String name = "jack";
        name = "tom";
        final char[] value ={'a','b','c'};
        char[] v2 = {'t','o','m'};
        char[] v3 = {'a','b'};
        value[0] = 'H';
        //value =v2;//不可改变地址。
        v3 = v2;//不加final可以改变地址。

当然,String类的字符串不可变可以看我的另外一篇文章,这里不多说了。

 

 intern方法

当调用intern方法时,返回的是常量池的地址。所以当a = new String("ab");

a != a.intern();

下面有几个问题。

以下语句创建了几个对象。

String s1 = "hello"; s1 = "haha";

首先常量池创建一个"hello"的地址,s1指向他。然后又创建了"haha"地址,然后s1又指向了"haha"

所以创建了两个对象。

String a = "hello" + "abc";

当看到这条语句时编译器会优化语句,会编译为String a ="helloabc";所以只创建一个对象。

String a ="hello";String b = "abc"; String c = a + b;

就结果来看是创建了三个对象。

过程中还创建过一个StringBuilder对象。先后执行两次append方法,最后执行toString方法才创建的c对象。内存图是。

看下面代码输出什么,可以画内存图。

 

成员变量和局部变量在内存的位置。

 

 这个图看的有些混乱,但是当change方法出栈后,那么最后的输出为hsp and hava。

最后补充一点api方法。

  String username = "jackttttt";
        //1.equalsIgnoreCase忽略大小写,判断内容是否相等
        System.out.println("Jack".equalsIgnoreCase(username));
        //2.字符串长度
        "success".length();
        username.length();
        //3.indexOf返回某字符第一次出现的索引,没有返回-1;
        int index1 = username.indexOf('a');
        int index2 ="ddbdf".indexOf('d');
        //4.lastIndexOf和3对比,取最后一次出现的。
        //5.substring截取子串
        System.out.println(username.substring(2));//从索引为2向后取。
        System.out.println(username.substring(2,5));//从索引2开取,到索引4,即[2,5)
        //6.toUpperCase转大写,toLowerCase转小写。
        username.toUpperCase();
        //7.concat拼接
        String username1 = username.concat("and").concat("tom");
        //replace替换
        String username2 = username.replace("a","j");//将a替换为j。
        System.out.println(username);
        //split分割字符串
        String poem = "锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒艰辛苦";
        String[] split = poem.split(",");//通过逗号分割返回数组。
        poem = "E:\\aaa\\bbb";
        split = poem.split("\\\\");
        for (int i = 0; i <split.length ; i++) {
            System.out.println(split[i]);
        }
        //toCharArray转化成字符数组
        char[] chars = username.toCharArray();
        for (char aChar : chars) {
            System.out.println(aChar);
        }
        //8.compareTo比较大小,
        username.compareTo(poem);
        //总结:两个字符串都从头开始比对。一旦遇到不一样的,就用第一个串的那个字符的值减去第二个字符串的那个值。
        //当某个串个数不够了,就返回的是第一个串的长度减去第二个串的长度。
        //9.format格式化
        String name ="DaBao";int age = 18;double score = 9.550;char gender = '男';
        //一般我们想到的可能是拼接。
        String info ="我叫%s,我今年%d岁了,我的成绩是%.2f,我是个%c生";
        //%s字符串,%.2f保留小数点后两位,%c字符
        String infor = String.format(info,name,age,score,gender);
        System.out.println(infor);
       
    }

 由以上所有方法看出,每次调用方法会返回新的,都不会改变原来的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值