JAVA中String类进行比较的几种方式

String类中进行比较有equals(),contentEquals()。
equals的源码

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;
    }

先对传进来的对象进行地址比较,再依次比较字符串中的字符。

contentEquals()

public boolean contentEquals(StringBuffer sb) {
        return contentEquals((CharSequence)sb);
    }
public boolean contentEquals(CharSequence cs) {
        // Argument is a StringBuffer, StringBuilder
        if (cs instanceof AbstractStringBuilder) {
            if (cs instanceof StringBuffer) {
                synchronized(cs) {
                   return nonSyncContentEquals((AbstractStringBuilder)cs);
                }
            } else {
                return nonSyncContentEquals((AbstractStringBuilder)cs);
            }
        }
        // Argument is a String
        if (cs instanceof String) {
            return equals(cs);
        }
        // Argument is a generic CharSequence
        char v1[] = value;
        int n = v1.length;
        if (n != cs.length()) {
            return false;
        }
        for (int i = 0; i < n; i++) {
            if (v1[i] != cs.charAt(i)) {
                return false;
            }
        }
        return true;
    }
private boolean nonSyncContentEquals(AbstractStringBuilder sb) {
        char v1[] = value;
        char v2[] = sb.getValue();
        int n = v1.length;
        if (n != sb.length()) {
            return false;
        }
        for (int i = 0; i < n; i++) {
            if (v1[i] != v2[i]) {
                return false;
            }
        }
        return true;
    }

如果要比较的对象不知道是否是String类的实例,则使用contentEquals()进行比较,如果是StringBuffer则将其转换成CharSequence。
因为StringBuffer和StringBuilder都是AbstractStringBuilder的子类所以使用
cs instanceof AbstractStringBuilder 与cs instanceof String来将cs分为AbstractStringBuilder,String,char[]。
对于AbstractStringBuilder进行判断cs是线程安全的StringBuffer还是非线程安全的StringBuilder。
如果是StringBuffer则在判断前通过synchronized对其进行加锁然后使用nonSyncContentEquals()
进行进一步处理,否则直接使用nonSyncContentEquals()处理。
nonSyncContentEquals()原理与String中equals一样。

对于String则调用equals进行判断
对于char[]则使用循环判断v1[i] != cs.charAt(i),也是进行内容的比较。

String类的equals()只能对String对象进行比较,对其他类型的字符串数据应采用contentEquals()。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java,线程可以通过以下几种方式实现: 1. 继承Thread:可以创建一个继承自Thread的子,并重写run()方法来定义线程的执行逻辑。然后通过创建该子的实例来启动线程。 ```java class MyThread extends Thread { public void run() { // 线程执行逻辑 } } // 创建并启动线程 MyThread thread = new MyThread(); thread.start(); ``` 2. 实现Runnable接口:可以创建一个实现了Runnable接口的,并实现run()方法,然后通过创建该的实例作为参数来构造Thread对象,并调用start()方法启动线程。 ```java class MyRunnable implements Runnable { public void run() { // 线程执行逻辑 } } // 创建并启动线程 Thread thread = new Thread(new MyRunnable()); thread.start(); ``` 3. 使用Callable和Future:可以创建一个实现了Callable接口的,并实现call()方法,该方法可以返回一个结果。然后通过创建ExecutorService线程池的实例,调用submit()方法提交Callable任务,并返回一个Future对象,通过调用Future对象的get()方法可以获取任务执行的结果。 ```java import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; class MyCallable implements Callable<String> { public String call() throws Exception { // 线程执行逻辑 return "Result"; } } // 创建线程池 ExecutorService executor = Executors.newFixedThreadPool(1); // 提交任务并获取Future对象 Future<String> future = executor.submit(new MyCallable()); // 获取任务执行结果 String result = future.get(); // 关闭线程池 executor.shutdown(); ``` 这些是Java常用的线程实现方式,每种方式都有其适用的场景和特点,可以根据具体需求选择合适的方式来实现多线程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值