JAVA学习笔记----【转】 java.toString() ,(String),String.valueOf的区别

在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能。本文将对常用的转换方法进行一个总结。

常用的方法有Object#toString(),(String)要转换的对象,String.valueOf(Object)等。

下面对这些方法一一进行分析。

方法1:采用 Object#toString()方法

请看下面的例子:

Object object = getObject(); System.out.println(object.toString());

在这种使用方法中,因为java.lang.Object类里已有public方法.toString(),所以对任何严格意义上的java对象都可以调用此方法。但在使用时要注意,必须保证object不是null值,否则将抛出NullPointerException异常。采用这种方法时,通常派生类会覆盖Object里的toString()方法。

方法2:采用类型转换(String)object方法

这是标准的类型转换,将object转成String类型的值。使用这种方法时,需要注意的是类型必须能转成String类型。因此最好用instanceof做个类型检查,以判断是否可以转换。否则容易抛出CalssCastException异常。此外,需特别小心的是因定义为Object 类型的对象在转成String时语法检查并不会报错,这将可能导致潜在的错误存在。这时要格外小心。

如: Object obj = new Integer(100); String strVal = (String)obj;

在运行时将会出错,因为将Integer类型强制转换为String类型,无法通过。

但是, Integer obj = new Integer(100); String strVal = (String)obj; 如是格式代码,将会报语法错误。此外,因null值可以强制转换为任何java类类型,(String)null也是合法的。

方法3:采用String.valueOf(Object)

String.valueOf(Object)的基础是Object#toString()。但它与Object#toString()又有所不同。在前面方法1的分析中提到,使用后者时需保证不为null。但采用第三种方法时,将不用担心object是否为null值这一问题。

为了便于说明问题,我们来分析一下相关的源代码。

Jdk里String# valueOf(Object)源码如下:

public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }

从上面的源码可以很清晰的看出null值不用担心的理由。但是,这也恰恰给了我们隐患。我们应当注意到,当object为null 时,String.valueOf(object)的值是字符串”null”,而不是null!!!在使用过程中切记要注意。

试想一下,如果我们用

if(String.valueOf(object)==null){System.out.println(“传入的值是null!”);}这样的语句将可能会发生什么问题。再想一下,向控制台输出时,在视觉上如下语句在执行的结果上有什么不同: System.out.println(String.valueOf(null)); System.out.println(null); 我们看到的输出将是一模一样的东西:null,但它们意义相同吗?

以上是对object对象转换为String的一些总结。

时间: 2024-10-15 18:55:14

JAVA学习笔记----【转】 java.toString() ,(String),String.valueOf的区别的相关文章

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

Java学习笔记(Java语言规范,API,JDK,IDE)

Java语言规范:java.sun.com/docs/books/jls 三个版本的API:J2SE J2EE J2ME 1. J2SE 客户端独立应用程序或者applet 2. J2EE 服务端应用程序 [Java Servlets&JavaServer Page] 3. J2ME 移动设备变成 JDK为Java开发提供一个开发环境(IDE) Java学习笔记(Java语言规范,API,JDK,IDE)

Java学习笔记(二):String

String 在Java中String是作为引用对象存在的一种数据类型,用来保存字符串. 实例化和赋值 //直接声明 String s1 = "Hello world!"; //通过构造函数创建, 提供了 11 种不同参数创建的方法 char[] c = { 'h', 'e', 'l', 'l', 'o', '.'}; String s2 = new String(c); String类是不可改变的,所以你一旦创建了String对象,那它的值就无法改变了.如果需要对字符串做很多修改,那

Java学习笔记-2.Java语言基础

一.命名规则 1.Java标识符 Java所有的组成部分都需要名字.类名.变量名以及方法名都被称为标识符. 关于Java标识符,有以下几点需要注意: 所有的标识符都应该以字母(A-Z或者a-z),美元符($).或者下划线(_)开始 首字符之后可以是任何字符的组合 关键字不能用作标识符 标识符是大小写敏感的 合法标识符举例:age.$salary._value.__1_value 非法标识符举例:123abc.-salary 2.注意: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hell

Java学习笔记-7.Java IO流

一.输入/输出流 1.流:不同类型的输入.输出源    数据流:输入或输出的数据 Java数据流的所有接口和类都是在java.io包中定义的,因此应在程序开头加入 import java.io.* 2.流的分类: (1)从流的流动方向来看,可以将IO流分为输入流和输出流 输入流:数据信息从某个地方流向程序中 输出流:数据信息从程序中发送到某个目的地 (2)从流的数据处理单位来看,可以将IO流分为字节流和字符流 字节流:以字节方式处理的二进制数据 字符流:以字符方式处理的数据流(Java使用Uni

java学习笔记1——java环境的搭建

1.java的安装路径最好没有中文和空格,因为如果有中文或者空格,在以后的编译过程中很容易出现莫名其妙的错误 2.安装java的过程中,安装好jdk后弹出安装JRE的界面,此时不用继续安装直接退出即可,因为JDK包含JRE,就算再装JRE,也是与JDK中的JRE是一样的 3.java环境搭建的原因,是为了方便程序编译的时候可以直接在DOS命令中输入java相关的命令就可以直接调用,而不需要每次都要尽到java命令所在的目录,因为当你输入此命令时,windows会找两次,第一次在你输入的目录中寻找

Java学习笔记-6.Java异常处理

一.异常简介 1.异常:程序在运行过程中有时会出现一些意外的情况导致程序退出的情况 2.一个异常是由一个对象来表示的,所有的异常都直接或间接地继承自Throwable接口 Throwable接口是类库java.lang包中的一个类,它派生出两个子类:Error 和 Exception (1)Error类主要用来描述一些Java运行时系统内部的错误或资源枯竭导致的错误,此类错误一般由系统进行处理,一般程序本身不需要捕获和处理 (2)Exception类分为RuntimeException异常 和

java学习笔记(Core Java) 6接口与内部类

接口(实现C++的多继承,同时避免了虚继承)深拷贝与浅拷贝内部类代理 一.接口与泛型接口:提供一组行为规范public interface Comparable<T>{ int compareTo(T other)}...int conpareTo<Employee other> //指定T 接口中所有的方法自动属于public所有的域自动为public staic 接口中的域自动声明为 public static final 继承接口的关键字:implements1.接口提供方法

【JAVA学习笔记】Java中的static关键字解析

Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnb

java学习笔记(Core Java) 9 泛型

集合接口一.引言:接口与实现分离,使用队列举例//提供接口规范interface Queue{...}//具体实现class LinkedListQueue<E> impements Queue<E> {...}class CircularArrayQueue<E> impements Queue<E> {...} Queue<Customer> e = new LinkedListQueue<Customer> 二.迭代器1.集合类