Java中String判断值为null或空及地址是否相等的问题

 更新时间:2016年01月27日 08:51:10   作者:张钊  
这篇文章主要介绍了Java中String判断值为null或空及地址是否相等的问题,文中举了简单的例子对字符串类型的值和地址问题进行讲解,需要的朋友可以参考下

String的null或空值的判断处理
笔者在开发过程中,常常碰到过下面这些错误的用法:
1,错误用法一:

if (name == "") {
//do something
}

2,错误用法二:

if (name.equals("")) {
//do something
}


3,错误用法三:

if (!name.equals("")) {
//do something
}


我们来解说一下:
上述错误用法1是初学者最容易犯,也最不容易被发现的错误,因为它们的语法本身没问题,Java编译器编译时不报错。但这种条件可能在运行时导致程序出现bug,永远也不会为true,也就是时说,if块里的语句永远也不会被执行。

上述用法二,用法三 的写法,是包括很多Java熟手也很容易犯的错误,为什么是错误的呢?也许你会感到纳闷。
对,它们的写法本身没错,但是,少了一个null判断的条件,试想,如果name=null的情况下,会发生什么后果呢?后果是,你的程序将抛出NullPointerException异常,系统将被挂起,不再提供正常服务。
当然,如果之前已经对name作了null判断的情况例外。

正确的写法应该先加上name != null的条件,如例:

if (name != null && !name.equals("")) {
//do something
}

或者

if (!"".equals(name)) {//将""写在前头,这样,不管name是否为null,都不会出错。
//do something
}


下面,我们举一个简单的例子:

TestNullOrEmpty.java

public class Test {
  public static void main (String args[]){
    String value = null;
    testNullOrEmpty(value);
 
    value = "";
    testNullOrEmpty(value);
 
    value = " ";
    testNullOrEmpty(value);
     
    value = "hello me";
    testNullOrEmpty(value);    
  }
     
  static void testNullOrEmpty(String value){
    if(value == null){
      System.out.println("value is null");
    } else if ("".equals(value)){
      System.out.println("value is blank but not null");
    } else {
      System.out.println("value is \"" + value + "\"");
    }
     
    if (value == "") { //NG 错误的写法 
      //别用这种写法 
    } 
  }
}

编译执行:

c:\>javac TestNullOrEmpty.java

c:\>java TestNullOrEmpty

value is null.
value is blank but not null.
value is " "
value is "hello me!"


比较String地址相等

package com; 
 
public class A 
{ 
 
  /** 
   * @param args 
   */ 
  public static void main(String[] args) 
  { 
 
    String a = "hello"; 
    String b = "he"; 
    String c = a.substring(0, 2); 
    System.out.println(b.equals(c));//true 
    System.out.println(b==c);//false 
     
    String d = new String("hello"); 
    System.out.println(d.equals(a));//true 
    System.out.println(d==a);//false 
     
    String e = new StringBuilder("hello").toString(); 
    System.out.println(e.equals(a));//true 
    System.out.println(e==a);//false 
     
    System.out.println(e.equals(d));//true 
    System.out.println(e==d);//false 
     
    String f = "hello"; 
    System.out.println(f.equals(a));//true 
    System.out.println(f==a);//true 
    System.out.println(f=="hello");//true 
    System.out.println(f=="hell"+"o");//true 
     
    String g = b+"llo"; 
    System.out.println(g==f);//false 
     
    String h = "he"+"llo"; 
    System.out.println(h==f);//true 
  } 
 
} 

总结:

1.new出来的String是重新分配内存,字符串不共享,new出来的多个之间也不共享。

2.通过字符串函数操作拼接或者截取到的字符串跟静态字符串变量也是不共享的。

3.通过加号得到的字符串有两种情况。

A   "he"+"llo"是静态字符串,是共享的
B   String a = "He";  a+"llo"不是静态字符串,是不共享的

相关文章

  • JAVA PDF操作之实现截取N页和多个PDF合并

    JAVA PDF操作之实现截取N页和多个PDF合并

    这篇文章主要为大家详细介绍了java关于PDF的一些操作,例如截取N页并生成新文件,转图片以及多个PDF合并,文中的示例代码讲解详细,感兴趣的可以了解下
    2025-01-01
  • jQuery.event.trigger()的简单解释

    jQuery.event.trigger()的简单解释

    今天小编就为大家分享一篇关于jQuery.event.trigger()的简单解释,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • maven打生产环境可执行包的实现

    maven打生产环境可执行包的实现

    本文主要介绍了maven打生产环境可执行包的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-01-01
  • SpringBoot之HandlerInterceptor拦截器的使用详解

    SpringBoot之HandlerInterceptor拦截器的使用详解

    这篇文章主要介绍了SpringBoot之HandlerInterceptor拦截器的使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • SpringBoot项目接收前端参数的11种方式

    SpringBoot项目接收前端参数的11种方式

    在前后端项目交互中,前端传递的数据可以通过HTTP请求发送到后端, 后端在Spring Boot中如何接收各种复杂的前端数据呢?这篇文章总结了11种在Spring Boot中接收前端数据的方式,需要的朋友可以参考下
    2024-12-12
  • RabbitMQ在Spring Boot中的使用步骤

    RabbitMQ在Spring Boot中的使用步骤

    在Spring Boot中使用RabbitMQ涉及多个步骤,包括配置、创建监听器和发送消息,下面给大家分享RabbitMQ在Spring Boot中的使用步骤,感兴趣的朋友一起看看吧
    2024-07-07
  • C++和Java命令行绘制心形图案

    C++和Java命令行绘制心形图案

    这篇文章主要为大家详细介绍了C++和Java命令行绘制心形图案,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • RocketMQ源码解析topic创建机制详解

    RocketMQ源码解析topic创建机制详解

    这篇文章主要为大家介绍了RocketMQ源码解析topic创建机制详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • java多线程学习之死锁的模拟和避免(实例讲解)

    java多线程学习之死锁的模拟和避免(实例讲解)

    下面小编就为大家带来一篇java多线程学习之死锁的模拟和避免(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • JAVA调用JavaScript方法代码示例

    JAVA调用JavaScript方法代码示例

    之前在一次机缘巧合的情况下,需要时用JAVA执行js方法,查阅了一些文档,找到了相关解决方法,这里和大家分享一下,这篇文章主要给大家介绍了关于JAVA调用JavaScript方法的相关资料,需要的朋友可以参考下
    2023-09-09

最新评论