java字符串

1.第一字符串

java 复制代码
package com.qcby;

import java.util.Arrays;

public class moxie {
    public static void main(String[] args) {
        String a="123";
        String astring=new String("123456");
    }
}

a:是定义在常量池中

astring是在堆当中开辟一个存储空间存储

2."=="和.equals()方法

"==":虚拟机先判断字符串常量池中查找该字符串是否已经存在,如果存在则返回引用; 如果不存在则会在字符串常量池当中创建该字符串对象。

关于==和equals()的区别详解

==运算符

基本数据类型的比较
  • 比较的是变量存储的实际值是否相等

  • 适用于:byte、short、int、long、float、double、char、boolean

  • 示例:

    java 复制代码
    int a = 5;
    int b = 5;
    System.out.println(a == b); // 输出true
    
    double x = 3.14;
    double y = 3.140;
    System.out.println(x == y); // 输出true

引用类型的比较

  • 比较的是对象在内存中的地址(即是否指向同一个对象)

  • 适用于所有对象类型(String、自定义类等)

  • 示例:

    java 复制代码
    String str1 = new String("hello");
    String str2 = new String("hello");
    System.out.println(str1 == str2); // 输出false,因为是不同对象
    
    Object obj1 = new Object();
    Object obj2 = obj1;
    System.out.println(obj1 == obj2); // 输出true,引用同一对象

equals()方法

默认实现

  • 在Object类中定义,默认行为与==相同

  • 比较的是对象的内存地址

  • 示例:

    java 复制代码
    class Person {}
    
    Person p1 = new Person();
    Person p2 = new Person();
    System.out.println(p1.equals(p2)); // 输出false,默认比较地址

String类的重写实现

  • 先比较对象地址,相同则返回true

  • 若地址不同,则比较字符串内容是否一致

  • 示例:

    java 复制代码
    String s1 = "hello";
    String s2 = new String("hello");
    String s3 = "world";
    
    System.out.println(s1.equals(s2)); // 输出true,内容相同
    System.out.println(s1.equals(s3)); // 输出false,内容不同

实际应用场景

  1. 字符串比较:总是使用equals()比较字符串内容
  2. 枚举比较:可以使用==,因为枚举值是单例的
  3. 对象集合操作:在HashSet、HashMap等集合中使用equals()判断元素是否相同
  4. 缓存对象比较:当确定是同一对象时,可以使用==提高性能

***equals()方法

java 复制代码
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }

    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}
  • 首先检查两个对象是否为同一引用(this == anObject),若是则直接返回true。

    若对象是String类型实例,则将其转型为String(anotherString)。

    接着比较两字符串长度(value.length与anotherString.value.length),长度不同则直接判定不相等;若长度相同,则逐个字符比对(v1[i]与v2[i]),任一字符不匹配即返回false,全部字符一致则返回true。

    若非String类型对象,则直接返回false。

3."+"和"append方法"

java 复制代码
public class AUtil {
    public static void main(String[] args) {
        String a = "123";
        String b = "456";
        String c = a + b;
        String d = "123456";
        System.out.println(c == d);
    }
}

返回false

总结:

  1. 在 Java 中,"+"运算符实际上会调用 StringBuilder 的 append() 方法来实现字符串拼接。

  2. StringBuilder 在堆内存中分配新的存储空间来完成数组拼接操作(无法直接在原数组上进行拼接)。拼接完成后会调用其 toString() 方法,该方法内部实现是 new String(value)。这样就会在堆内存中创建新的字符串对象,指向字符串常量池中对应的字符串值。因此,"c"和"d"虽然内容相同,但会指向不同的内存地址。

4."+"和"append方法"的时间比

java 复制代码
package com.qcby.ndspringbootwebsocket.util;

public class AUtil {
    public static void main(String[] args) {
        long startTime=System.nanoTime();  //获取开始时间
        String a = "123";
        for (int i = 0;i<100;i++){
            a += "4";
        }

        long endTime=System.nanoTime();   //获取结束时间
        System.out.println(endTime-startTime);

        long startTime1=System.nanoTime();  //获取开始时间
        StringBuilder ab = new StringBuilder("123");  //StringBuilder会申请一个非常大的内存空间
        for (int i = 0;i<100;i++){
            ab.append(4);
        }
        long endTime1=System.nanoTime();   //获取结束时间
        System.out.println(endTime1 - startTime1);
    }
}

"+"和"append方法"存在一个数量级的时间差

5.字符串操作函数

方法 功能 示例解读
length() 获取字符串长度 " Hello World "调用该方法,可得到包含两端空格的字符串长度
charAt(int index) 获取指定索引位置的字符 示例中获取索引 2 处的字符,即'l'(索引从 0 开始)
equals(Object obj) 比较字符串内容是否相等 示例中cstringbstring内容均为"123456",故返回true
substring(int beginIndex)``substring(int beginIndex, int endIndex) 截取子字符串 前者从索引 3 开始截取到末尾,得到"lo World ";后者截取索引 3(含)到 6(不含)的子串,得到"lo "
toLowerCase() 将字符串转换为小写 示例中" Hello World "转换后为" hello world "
toUpperCase() 将字符串转换为大写 示例中转换后为" HELLO WORLD "
trim() 去除字符串两端的空格 示例中去除两端空格后得到"Hello World"
replace(CharSequence target, CharSequence replacement) 替换字符串中的目标字符 / 子串 示例中先将"l"替换为"L",再将"o"替换为"0",实现字符替换
indexOf(String str) 从开头查找子串的索引 示例中查找"l",返回其首次出现的索引 2
lastIndexOf(String str) 从末尾查找子串的索引 示例中查找"l",返回其最后一次出现的索引 9
concat(String str) 连接字符串 示例中将"Hello"与原字符串连接,得到" Hello World Hello"
contains(CharSequence s) 判断是否包含目标子串 示例中判断是否包含"ll",返回true
java 复制代码
package com.qcby;

import java.util.Locale;

public class Demo {
    public static void main(String[] args) {
        String aString = " Hello World ";
        int length=aString.length();//length()方法获取长度
        System.out.println(length);
        //字符串是char类型的数组
        char a=aString.charAt(2);
        System.out.println(a);
        //equals()方法比较字符串
        String cstring="123456";
        String bstring=new String("123456");
        System.out.println(cstring.equals(bstring));
        //substring()方法截取字符串
        System.out.println(aString.substring(3));//从索引位置 3 开始到末尾的子字符串
        System.out.println(aString.substring(3,6));//从索引 3(包含)到索引 6(不包含)的子字符串
        //toLowerCase()方法将字符串转换成小写
        System.out.println(aString.toLowerCase());
        //toUpperCase()方法将字符串转换成大写
        System.out.println(aString.toUpperCase());
        //trim()方法删除字符串两端的空格
        System.out.println(aString.trim());
        //replace()方法替换字符串
        System.out.println(aString.replace("l","L"));
        System.out.println(aString.replace("l","L").replace("o","O"));
        //indexOf()方法查找字符串从头
        System.out.println(aString.indexOf("l"));
        //lastIndexOf()方法查找字符串从未尾
        System.out.println(aString.lastIndexOf("l"));
        //concat()方法连接字符串
        System.out.println(aString.concat("Hello"));
        //contains() 判断是否包含目标串
        System.out.println(aString.contains("ll"));

    }
}
相关推荐
Hi202402173 小时前
Qt+Qml客户端和Python服务端的网络通信原型
开发语言·python·qt·ui·网络通信·qml
chxii3 小时前
ISO 8601日期时间标准及其在JavaScript、SQLite与MySQL中的应用解析
开发语言·javascript·数据库
Teable任意门互动3 小时前
主流多维表格产品深度解析:飞书、Teable、简道云、明道云、WPS
开发语言·网络·开源·钉钉·飞书·开源软件·wps
沐浴露z4 小时前
Kafka 生产者详解(上):消息发送流程与API,分区,吞吐量与数据可靠性
java·kafka·消息队列
程序员大雄学编程4 小时前
「用Python来学微积分」16. 导数问题举例
开发语言·python·数学·微积分
float_com4 小时前
【java面向对象进阶】------抽象类+接口 综合实例
java
哈哈哈哈~4 小时前
多线程之线程池
java·线程池
洛克大航海5 小时前
7-SpringCloud-服务网关 Gateway-高级特性 Route
java·spring cloud·gateway·route
Dreams_l5 小时前
redis中的数据类型
java·开发语言