目录

java字符串

java字符串

字符串构造

1.使用常量串构造

 String h1 = "hello";
        System.out.println(h1);

2.new对象

  String h2 = new String("hello");
        System.out.println(h2);

3.使用字符数组构造

  char[] array = {'h','e','l','l','o'};
        String h3 = new String(array);
        System.out.println(h3);

我们发现Sting类被final修饰并且不能继承,并且发现变量value被private修饰这表明,修改字符串并不能实现,而String是引用类型,表面上的修改字符串实际只是修改引用对象的内容,真正不能修改的是String类引用其他对象。

https://i-blog.csdnimg.cn/direct/89f7d0446b5e429cb7f336c9dd87cfde.png

真正使得字符串无法修改的原因是private关键字,该关键字使得想要修改value只能通过方法,不能通过访问来实现。

String对象的比较

1.==比较

对于内置类型一般比较变量中的值,如果是引用类型则比较的是地址。

https://i-blog.csdnimg.cn/direct/92ec0b9a4c054bc9b233a2c38a5ab793.png

2.equals方法

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
//1.首先比较两者是否为同一个对象
        if (anObject instanceof String)

 {  //2.比较参数是否为Sting的子类
            String anotherString = (String)anObject;
            int n = value.length;
//3.比较两者长度大小
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
//4.根据asm来比较首个不同字符的大小
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

我们发现Sting类重写了父类的equal方法

​​ String s6 = new String("Hello");
        String s7 = new String("world");
        String s8 = new String("Hello");
        String s9 = s6;
        System.out.println(s6==s7);
        System.out.println(s7==s8);
        System.out.println(s6==s9);
        System.out.println(s6.equals(s8));
        System.out.println(s6.equals(s7));

https://i-blog.csdnimg.cn/direct/71199951f8f2462cb263b0e1f2cbc678.png

在equals中我们发现s6和s8返回true,我们发现两者的防止内容相同但对象却不同。

而s7和s6却是对象不同,内容也不同,返回false。

3.comparetoignorecase方法

https://i-blog.csdnimg.cn/direct/a7753c6562f741958befb0bee9df9e39.png

https://i-blog.csdnimg.cn/direct/bb7addfaebb345ac992359a72854406c.png

我们通过控制台发现该方法返回值是整数,我们回到方法代码

https://i-blog.csdnimg.cn/direct/4eba9ac3c05a4143b0de27f30529daff.png

该方法忽略大小写存在,大小写不受影响。

4.compareto方法

https://i-blog.csdnimg.cn/direct/a871cc3c30ca4d86923260481780e471.png https://i-blog.csdnimg.cn/direct/668980f9ab974b78b4065c7bb7b050e5.png

我们发现与上个方法输出值不同,该方法因为不忽略大小写的区别所以根据长度和asm表大小比较并返回差值,回到方法内部。

https://i-blog.csdnimg.cn/direct/a0d6b4c8d33849608bbbf85b8deb4f9e.png

我们发现只返回不同的首字符差值,如果完全相同则返回大小差值。大部分对字符串的修改都是创建了一个新对象。

字符串查找

 String s6 = new String("Hello");
        String s7 = new String("world");
        String s8 = new String("Hello");

1.charAt方法

https://i-blog.csdnimg.cn/direct/198f2fbf37ac4c739913e8b7f582ae84.png https://i-blog.csdnimg.cn/direct/5bd1606cc196400a8eaecff1f21d93e4.png

该方法是返回改位置对应的字符。

2.indexOf方法

https://i-blog.csdnimg.cn/direct/bb2ed5b7c8a64ff08dea06a0af0f3323.png https://i-blog.csdnimg.cn/direct/8f8541e054064c87980d85f2ee74db27.png

该方法返回该字符第一次出现的位置

3.lastIndex方法

https://i-blog.csdnimg.cn/direct/fb27543f34b54f499c8879b599b858ad.png https://i-blog.csdnimg.cn/direct/6bddaa9a074443e8b2b61e9f89478c0c.png

该方法从后往前查找并返回该字符第一次出现的位置。

转化

1.数值和字符转化

数字转字符串

 String s1 = String.valueOf(1234);
        String s2 = String.valueOf(12.34);
        String s3 = String.valueOf(true);
        String s4 = String.valueOf(new Student("Hanmeimei", 18));
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);

字符串转数字

 int data1 = Integer.parseInt("1234");
        double data2 = Double.parseDouble("12.34");
        System.out.println(data1);
        System.out.println(data2);

2.大小写转换

toUpperCase为转换为大写,toLowerCase为转化为小写

 String s1 = "hello";
        String s2 = "HELLO";
        System.out.println(s1.toUpperCase());
        System.out.println(s2.toLowerCase());

字符串替换

 String s1 = new String("Hello");
        System.out.println(s1.replaceAll("l", "w"));
        System.out.println(s1.replaceFirst("l", "w"));

https://i-blog.csdnimg.cn/direct/596b615abeec42998fe2faf206549739.png

我们从给出的实例不难看出,方法repalceAll是用参数二字符串替换全部的参数一字符串,而replaceFirst方法使用参数二字符串替换参数一字符串第一个。

字符串拆分

  String s1 = new String("Hello");
       String[] s2 = s1.split("e");
       String[] s3 = s1.split("e",5);
        for(String s:s2){
            System.out.println(s);
        }
        for(String s:s3){
            System.out.println(s);
        }
    }

https://i-blog.csdnimg.cn/direct/5371210440704f319ebef4e5e36434eb.png

我们通过实例可以看出该方法返回值是一个字符串数组,而重载的俩方法,都是传入一个字符串,以该字符串来拆分而只有一个参数的方法是将字符串全部以传入的字符串拆分,方法二则加了一个整形参数来表明拆分为多少组。

另外,字符"|","*","+“都得加上转义字符,前面加上 “\” .

2. 而如果是 “" ,那么就得写成 “\\” .

3. 如果一个字符串中有多个分隔符,可以用”|“作为连字符.

字符串截取

 String s1 = new String("Hello");
        System.out.println(s1.substring(2));
        System.out.println(s1.substring(2, 4));

https://i-blog.csdnimg.cn/direct/ccce167cdd1844f68d0e48245b45e180.png

使用substring方法进行截取,输入的参数是字符串中字符的位置,从0开始。

字符串的修改

因为直接对字符串修改实际上是创建了一个新的对象,,创建了大量的临时变量,并且使得效率十分低下。

StringBuilder和StringBuffer

两者的方法都差不多相同,所以只写了一种方法。

StringBuilder可以直接修改字符串本身,如果频繁修改字符串的话还是用StringBuilder来的更为好。

String和StringBuilder和StringBuffer区别

1.String不能修改

2.StringBuilder和StringBuffer功能大致相同

3.StringBuilder采用同步处理,属于线程安全操作,StringBuffer采用不同步处理,属于线程不安全操作。