java中String类型“”和null的区别

" "和null的区别
String str1 = null; str引用为空
String str2 = ""; str引用一个空串
也就是null没有分配空间,""分配了空间,因此str1还不是一个实例化的对象,而str2已经实例化。

注意因为null不是对象,""是对象。

所以比较的时候必须是
if(str1==null){...}和if(str2.equals("")){...}。

对象用equals比较,null用等号比较。

因此,如果str1=null;下面的写法错误:
if(str1.equals("")||str1==null){//如果str1没有值,则....
//。

}
正确的写法是if(str1==null||str1.equals("")){ //先判断是不是对象,如果是,再判断是不是空字符串
//...
}
打个比方:一个空玻璃杯,你不能说它里面什么都没有,因为里面有空气,当然也可以把它弄成真空,null与" "的区别就象真空与空气一样。

合集下载

java中的String转int需要注意的问题

java中的String转int需要注意的问题

java中的String转int需要注意的问题1。

null,”“,(空,空串)2。

满⾜:⾸字符为+,-,数字,不满⾜:其它的例如字母,空格串3。

溢出(先⽤long获取,若不满⾜,则返回错误)具体代码:package StringExercise;/*** @author wangpei* @version 创建时间:2017年3⽉24⽇上午12:16:50 类说明*/public class StringToInt {// 字符串转整数static String s = " ";static boolean b = true;public static void main(String[] args) {// 对所有可能出现的情况加以考虑int result = change(s);if (b == false)System.out.println("输⼊不正确");elseSystem.out.println("转换后:" + result);}public static int change(String str) {System.out.println(str.isEmpty());if (s == null || s != null && s.equals("")) {// 输⼊⾮法结束。

b = false;return 0;}if (str.charAt(0) == '-' || str.charAt(0) == '+'|| (str.charAt(0) >= '0' && str.charAt(0) < '9')) {// 负数long l = IsOutOfMax(str);return (int) l;} else {// ⾮法输⼊,直接结束b = false;return 0;}}public static long IsOutOfMax(String s) {long l = 0;l = Long.parseLong(s);if (l < -2147483648 || l > 2147483647) {b = false;return 0;} elsereturn l;}}定义boolean类型的b作⽤:判断返回的0是输⼊错误的0,还是转换来的0;。

详解java中String值为空字符串与null的判断方法

详解java中String值为空字符串与null的判断方法

详解java中String值为空字符串与null的判断⽅法Java空字符串与null的区别1、类型null表⽰的是⼀个对象的值,⽽不是⼀个字符串。

例如声明⼀个对象的引⽤,String a=null。

“”表⽰的是⼀个空字符串,也就是说它的长度为0。

例如声明⼀个字符串String s=”“。

2、内存分配String a=null;表⽰声明⼀个字符串对象的引⽤,但指向为null,也就是说还没有指向任何的内存空间。

String s=”“;表⽰声明⼀个字符串类型的引⽤,其值为“”空字符串,这个s引⽤指向的是空字符串的内存空间;在java中变量和引⽤变量是存在栈中(stack),⽽对象(new产⽣的)都是放在堆中(heap):就如下:String str =new String(“abc”);ps:=左边的是存放在栈中(stack),=右边是存放在堆中(heap)。

代码⽰例1:String str1=null;String str2="";//str1==null 为trueSystem.out.println("str1和null的==⽐较结果为:"+(str1==null));//ng.NullPointerException 空指针异常System.out.println("str1的isEmpty()⽅法"+(str1.isEmpty()));//ng.NullPointerException 空指针异常System.out.println("str2的length()⽅法"+(str1.length()));//ng.NullPointerException 空指针异常System.out.println("str1和null的equals⽐较结果为:"+(str1.equals(null)));//str2==null 为falseSystem.out.println("str2和null的==⽐较结果为:"+(str2==null));//str2=="" 为trueSystem.out.println("str2和"+""+"的==⽐较结果为:"+(str2==""));//str2.isEmpty() 为trueSystem.out.println("str2的isEmpty()⽅法"+str2.isEmpty());//str2.equals(null) 为trueSystem.out.println("str2和null的equals⽅法⽐较结果为:"+(str2.equals(null)));//str2.isEmpty() 为trueSystem.out.println("str2的isEmpty()⽅法"+(str2.isEmpty()));//str2.length() 结果为0System.out.println("str2的length()⽅法"+(str2.length()));代码⽰例2:String str1 = new String() ;String str2 = null ;String str3 = "" ;System.out.println(str1==str2); //内存地址的⽐较,返回falseSystem.out.println(str1.equals(str2)); //值的⽐较,返回falseSystem.out.println(str2==str3); //内存地址的⽐较,返回falseSystem.out.println(str3.equals(str2)); //值的⽐较,返回falseSystem.out.println(str1==str3); //内存地址的⽐较,返回falseSystem.out.println(str1.equals(str3)); //值的⽐较,返回true通过以上的两个代码⽰例可以得出以下结论:1 如果想调⽤⼀个⽅法,⾸先要有⼀个对象,但是null并不是⼀个对象,内存中都没有它的空间,所以null是不能够调⽤String中的⽅法的,isEmpty和length和equals⽅法都不能够调⽤。

StringUtils中isNotEmpty和isNotBlank的区别【java字符串判空】

StringUtils中isNotEmpty和isNotBlank的区别【java字符串判空】

StringUtils中isNotEmpty和isNotBlank的区别【java字符串判空】1 isNotEmpty(str)等价于 str != null && str.length > 02 isNotBlank(str) 等价于 str != null && str.length > 0 && str.trim().length > 03同理4 isEmpty 等价于 str == null || str.length == 05 isBlank 等价于 str == null || str.length == 0 || str.trim().length == 067 str.length > 0 && str.trim().length > 0 ---> str.length > 01 StringUtils⽅法的操作对象是ng.String类型的对象,是JDK提供的String类型操作⽅法的补充,并且是null安全的(即如果输⼊参数String为null则不会抛出NullPointerException,⽽是做了相应处理,例如,如果输⼊为null则返回也是null等,具 234除了构造器,StringUtils中⼀共有130多个⽅法,并且都是static的,所以我们可以这样调⽤StringUtils.xxx()567 1. public static boolean isEmpty(String str)8判断某字符串是否为空,为空的标准是str==null或str.length()==09下⾯是StringUtils判断是否为空的⽰例:10 StringUtils.isEmpty(null) = true11 StringUtils.isEmpty("") = true12 StringUtils.isEmpty(" ") = false//注意在StringUtils中空格作⾮空处理13 StringUtils.isEmpty(" ") = false14 StringUtils.isEmpty("bob") = false15 StringUtils.isEmpty(" bob ") = false161718 2. public static boolean isNotEmpty(String str)19判断某字符串是否⾮空,等于!isEmpty(String str)20下⾯是⽰例:21 StringUtils.isNotEmpty(null) = false22 StringUtils.isNotEmpty("") = false23 StringUtils.isNotEmpty(" ") = true24 StringUtils.isNotEmpty(" ") = true25 StringUtils.isNotEmpty("bob") = true26 StringUtils.isNotEmpty(" bob ") = true272829 3. public static boolean isBlank(String str)30判断某字符串是否为空或长度为0或由空⽩符(whitespace)构成31下⾯是⽰例:32 StringUtils.isBlank(null) = true33 StringUtils.isBlank("") = true34 StringUtils.isBlank(" ") = true35 StringUtils.isBlank(" ") = true36 StringUtils.isBlank("\t \n \f \r") = true//对于制表符、换⾏符、换页符和回车符StringUtils.isBlank()均识为空⽩符37 StringUtils.isBlank("\b") = false//"\b"为单词边界符38 StringUtils.isBlank("bob") = false39 StringUtils.isBlank(" bob ") = false404142 4. public static boolean isNotBlank(String str)43判断某字符串是否不为空且长度不为0且不由空⽩符(whitespace)构成,等于!isBlank(String str)44下⾯是⽰例:45 StringUtils.isNotBlank(null) = false46 StringUtils.isNotBlank("") = false47 StringUtils.isNotBlank(" ") = false48 StringUtils.isNotBlank(" ") = false49 StringUtils.isNotBlank("\t \n \f \r") = false50 StringUtils.isNotBlank("\b") = true51 StringUtils.isNotBlank("bob") = true52 StringUtils.isNotBlank(" bob ") = true535455其他⽅法介绍:56 5. public static String trim(String str)57去掉字符串两端的控制符(control characters, char <= 32),如果输⼊为null则返回null58下⾯是⽰例:59 StringUtils.trim(null) = null60 StringUtils.trim("") = ""61 StringUtils.trim(" ") = ""62 StringUtils.trim(" \b \t \n \f \r ") = ""63 StringUtils.trim(" \n\tss \b") = "ss"64 StringUtils.trim(" d d dd ") = "d d dd"65 StringUtils.trim("dd ") = "dd"66 StringUtils.trim(" dd ") = "dd"676869 6. public static String trimToNull(String str)70去掉字符串两端的控制符(control characters, char <= 32),如果变为null或"",则返回null71下⾯是⽰例:72 StringUtils.trimToNull(null) = null73 StringUtils.trimToNull("") = null74 StringUtils.trimToNull(" ") = null75 StringUtils.trimToNull(" \b \t \n \f \r ") = null76 StringUtils.trimToNull(" \n\tss \b") = "ss"77 StringUtils.trimToNull(" d d dd ") = "d d dd"78 StringUtils.trimToNull("dd ") = "dd"79 StringUtils.trimToNull(" dd ") = "dd"808182 7. public static String trimToEmpty(String str)83去掉字符串两端的控制符(control characters, char <= 32),如果变为null或"",则返回""84下⾯是⽰例:85 StringUtils.trimToEmpty(null) = ""86 StringUtils.trimToEmpty("") = ""87 StringUtils.trimToEmpty(" ") = ""88 StringUtils.trimToEmpty(" \b \t \n \f \r ") = ""89 StringUtils.trimToEmpty(" \n\tss \b") = "ss"90 StringUtils.trimToEmpty(" d d dd ") = "d d dd"91 StringUtils.trimToEmpty("dd ") = "dd"92 StringUtils.trimToEmpty(" dd ") = "dd"939495 8. public static String strip(String str)96去掉字符串两端的空⽩符(whitespace),如果输⼊为null则返回null97下⾯是⽰例(注意和trim()的区别):98 StringUtils.strip(null) = null99 StringUtils.strip("") = ""100 StringUtils.strip(" ") = ""101 StringUtils.strip(" \b \t \n \f \r ") = "\b"102 StringUtils.strip(" \n\tss \b") = "ss \b"103 StringUtils.strip(" d d dd ") = "d d dd"104 StringUtils.strip("dd ") = "dd"105 StringUtils.strip(" dd ") = "dd"106107108 9. public static String stripToNull(String str)109去掉字符串两端的空⽩符(whitespace),如果变为null或"",则返回null 110下⾯是⽰例(注意和trimToNull()的区别):111 StringUtils.stripToNull(null) = null112 StringUtils.stripToNull("") = null113 StringUtils.stripToNull(" ") = null114 StringUtils.stripToNull(" \b \t \n \f \r ") = "\b"115 StringUtils.stripToNull(" \n\tss \b") = "ss \b"116 StringUtils.stripToNull(" d d dd ") = "d d dd"117 StringUtils.stripToNull("dd ") = "dd"118 StringUtils.stripToNull(" dd ") = "dd"119120121 10. public static String stripToEmpty(String str)122去掉字符串两端的空⽩符(whitespace),如果变为null或"",则返回"" 123下⾯是⽰例(注意和trimToEmpty()的区别):124 StringUtils.stripToNull(null) = ""125 StringUtils.stripToNull("") = ""126 StringUtils.stripToNull(" ") = ""127 StringUtils.stripToNull(" \b \t \n \f \r ") = "\b"128 StringUtils.stripToNull(" \n\tss \b") = "ss \b"129 StringUtils.stripToNull(" d d dd ") = "d d dd"130 StringUtils.stripToNull("dd ") = "dd"131 StringUtils.stripToNull(" dd ") = "dd"。

java中的值类型

java中的值类型

java中的值类型Java中的值类型在Java中,变量可以分为值类型和引用类型。

值类型是指直接存储数据值本身的变量类型,而引用类型是指存储对象引用的变量类型。

本文将重点介绍Java中的值类型。

1. 基本类型Java的基本类型包括八种:byte、short、int、long、float、double、char和boolean。

这些基本类型的变量直接存储了对应的数据值,它们的值在内存中占用固定的空间,不需要额外的内存分配。

2. 值传递在Java中,值类型的变量在函数调用时是按值传递的。

也就是说,当将一个值类型的变量作为参数传递给一个方法时,实际上是将该变量的值复制给了方法的参数。

这意味着在方法中对参数进行修改不会影响原来的变量。

3. 自动装箱和拆箱Java中的值类型和引用类型之间可以进行自动装箱和拆箱操作。

自动装箱是指将值类型自动转换为对应的包装类型,而自动拆箱是指将包装类型自动转换为对应的值类型。

例如,可以将一个int类型的变量赋值给一个Integer类型的变量,并且可以直接对Integer类型的变量进行运算。

4. 常量池Java中的值类型的常量通常会被保存在常量池中。

常量池是Java 虚拟机中的一块内存区域,用于存储字符串常量和基本类型的常量。

当我们定义一个字符串常量或者使用字面值的方式创建一个基本类型的变量时,实际上是直接从常量池中获取该常量的引用。

5. 值类型的比较对于值类型的变量,可以使用==运算符进行比较。

对于数值类型,比较的是它们的数值是否相等;对于char类型,比较的是它们的Unicode编码是否相等;对于boolean类型,比较的是它们的取值是否相等。

6. 值类型数组在Java中,可以使用值类型的数组来存储多个值类型的变量。

数组是一种引用类型,但是可以存储值类型的元素。

数组的元素可以通过索引来访问,索引从0开始,依次递增。

7. 值类型的优点值类型的变量具有以下优点:- 存储效率高:值类型的变量直接存储数据值,不需要额外的内存分配,因此存储效率高。

java基本数据类型和引用数据类型的区别

java基本数据类型和引用数据类型的区别

java基本数据类型和引⽤数据类型的区别⼀、基本数据类型:byte:Java中最⼩的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0int:整型,⽤于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0Lfloat:浮点型,在内存中占32位,即4个字节,⽤于存储带⼩数点的数字(与double的区别在于float类型有效⼩数点只有6~7位),默认值0 double:双精度浮点型,⽤于存储带有⼩数点的数字,在内存中占64位,即8个字节,默认值0char:字符型,⽤于存储单个字符,占16位,即2个字节,取值范围0~65535,默认值为空boolean:布尔类型,占1个字节,⽤于判断真或假(仅有两个值,即true、false),默认值false⼆、Java数据类型基本概念:数据类型在计算机语⾔⾥⾯,是对内存位置的⼀个抽象表达⽅式,可以理解为针对内存的⼀种抽象的表达⽅式。

接触每种语⾔的时候,都会存在数据类型的认识,有复杂的、简单的,各种数据类型都需要在学习初期去了解,Java是强类型语⾔,所以Java对于数据类型的规范会相对严格。

数据类型是语⾔的抽象原⼦概念,可以说是语⾔中最基本的单元定义,在Java⾥⾯,本质上讲将数据类型分为两种:基本类型和引⽤数据类型。

基本类型:简单数据类型是不能简化的、内置的数据类型、由编程语⾔本⾝定义,它表⽰了真实的数字、字符和整数。

引⽤数据类型:Java语⾔本⾝不⽀持C++中的结构(struct)或联合(union)数据类型,它的复合数据类型⼀般都是通过类或接⼝进⾏构造,类提供了捆绑数据和⽅法的⽅式,同时可以针对程序外部进⾏信息隐藏。

Java中的Null是什么?

Java中的Null是什么?

Java中的Null是什么?1)⾸先,null是关键字,像public、static、final。

它是⼤⼩写敏感的,你不能将null写成Null或NULL,编译器将不能识别它们然后报错。

2)就像每种基本类型都有默认值⼀样,如int默认值为0,boolean的默认值为false,null是任何引⽤类型的默认值,不严格的说是所有object 类型的默认值。

就像你创建了⼀个布尔类型的变量,它将false作为⾃⼰的默认值,Java中的任何引⽤变量都将null作为默认值。

这对所有变量都是适⽤的,如成员变量、局部变量、实例变量、静态变量(但当你使⽤⼀个没有初始化的局部变量,编译器会警告你)。

为了证明这个事实,你可以通过创建⼀个变量然后打印它的值来观察这个引⽤变量。

3)我们要澄清⼀些误解,null既不是对象也不是⼀种类型,它仅是⼀种特殊的值,你可以将其赋予任何引⽤类型,你也可以将null转化成任何类型,来看下⾯的代码:String str = null;Integer i = null;Double d = null;String myStr = (String) null;Integer myI = (Integer) null;Double myD = (Double) null;你可以看到在编译和运⾏时期,将null强制转换成任何引⽤类型都是可⾏的,在运⾏时期都不会抛出空指针异常。

4)null可以赋值给引⽤变量,你不能将null赋给基本类型变量,例如int、double、float、boolean。

编译器将会报错。

正如你看到的那样,当你直接将null赋值给基本类型,会出现编译错误。

但是如果将null赋值给包装类object,然后将object赋给各⾃的基本类型,编译器不会报,但是你将会在运⾏时期遇到空指针异常。

这是Java中的⾃动拆箱导致的。

5)任何含有null值的包装类在Java拆箱⽣成基本数据类型时候都会抛出⼀个空指针异常。

java判断字符串不为空和null的方法

java判断字符串不为空和null的方法在Java语言中,字符串是最常见的数据类型之一。

当我们需要对一个字符串进行操作时,可能会遇到一种情况:如何判断一个字符串既不为空也不为null?下面就详细介绍一下如何判断字符串不为空和null的方法。

1、使用字符串的isEmpty()方法isEmpty()方法是判断字符串是否为空的一种方法。

这种方法只需要判断一个字符串的长度是否等于0,即可判断该字符串是否为空。

下面的示例代码展示了如何使用isEmpty()方法判断字符串是否为空:```public static boolean isNullOrEmpty(String str) {return str == null || str.isEmpty();}```2、使用字符串的equals()方法equals()方法是判断字符串是否相等的方法。

如果我们需要判断字符串是否为null或者空字符串,可以使用如下代码:```public static boolean isNullOrEmpty(String str) {return str == null || str.equals("");}```3、使用StringUtils类中的isBlank()方法StringUtils类是Apache Common Lang3库中提供的一个工具类,它提供了一系列操作字符串的方法。

在StringUtils类中,isBlank()方法可以判断一个字符串是否为空,包括字符串为null或者全是空格字符的情况。

下面的代码展示了如何使用StringUtils类中的isBlank()方法判断字符串是否为空:```import ng3.StringUtils;public static boolean isNullOrEmpty(String str) {return StringUtils.isBlank(str);}```4、使用Objects类中的isNull()方法如果我们需要判断一个字符串是否为null,可以使用Objects类中的isNull()方法。

java string... 的用法

java string... 的用法在Java编程语言中,String类是一个非常重要的类,用于处理字符串数据。

String类提供了许多方法和功能,可以帮助开发人员更方便地操作和处理字符串数据。

本篇文章将介绍String类的一些常用方法和用法。

一、字符串连接String类提供了多种方法来连接字符串,其中最常见的方法是+运算符和StringBuilder或StringBuffer类的append()方法。

使用+运算符连接字符串非常简单,但是需要注意的是,如果需要连接的字符串数量较多,性能会受到影响,因为每次使用+运算符都会创建一个新的字符串对象。

可以使用StringBuilder或StringBuffer 类的append()方法来连接字符串,性能更高。

二、字符串比较String类提供了equals()和equalsIgnoreCase()方法来比较两个字符串是否相等。

equals()方法比较的是字符串的内容,而equalsIgnoreCase()方法比较的是字符串的内容和大小写。

除此之外,String类还提供了compareTo()和compareToIgnoreCase()方法,可以按照字典顺序比较两个字符串。

三、字符串查找String类提供了indexOf()和lastIndexOf()方法,可以查找一个字符串中某个子字符串第一次出现的位置。

indexOf()方法返回的是子字符串第一次出现的位置,而lastIndexOf()方法返回的是最后一个出现的位置。

除此之外,String类还提供了contains()方法,可以判断一个字符串是否包含另一个字符串。

四、字符串替换String类提供了replace()和replaceFirst()方法,可以用来替换字符串中的某个子字符串。

replace()方法可以替换所有出现的子字符串,而replaceFirst()方法只替换第一个出现的子字符串。

除此之外,String类还提供了substring()方法,可以用来截取字符串的一部分。

string数组的默认值 -回复

string数组的默认值-回复String数组的默认值是什么?在Java中,数组是一种最常见的数据结构。

它可以存储一组相同类型的数据,并具有固定长度。

而String数组则是一种特殊类型的数组,用于存储字符串对象。

在创建数组时,如果没有为其分配任何值,并且没有对其进行初始化操作,那么数组的每个元素都将被赋予默认值。

对于不同类型的数组,其默认值也不同。

在讨论String数组的默认值之前,让我们先了解一下其他几种常见类型数组的默认值。

对于整型数组,其默认值是0。

不论数组的大小是多少,每个元素都将初始化为0。

对于浮点型数组,其默认值是0.0。

与整型数组相似,浮点型数组的每个元素也将初始化为0.0。

对于布尔型数组,其默认值是false。

每个元素都将被赋予false值。

对于字符类型数组,其默认值是空字符('\0')。

同样地,每个元素被初始化为空字符。

对于引用类型数组,其默认值是null。

每个元素将被设置为null值,表示空引用。

现在,回到String数组的默认值。

String是一种引用类型,因此String 数组的默认值也是null。

这意味着,如果你创建了一个String数组但没有为其分配任何值或进行初始化,那么数组中的每个元素都将被赋予null 值。

让我们通过以下示例来说明String数组的默认值:javapublic class StringArrayDefaultValues {public static void main(String[] args) {String[] names = new String[5];for(int i=0; i<names.length; i++) {System.out.println(names[i]);}}}在上面的示例中,我们创建了一个长度为5的String数组,但没有为其分配任何值。

在使用for循环遍历数组并输出每个元素时,你将会看到输出结果为null。

java中null和“”的区别

null和""的区别 问题一: null和""的区别 String s=null; string.trim()就会抛出为空的exception String s=""; string.trim()就不会抛,为什么? 答: NULL代表声明了一个空对象,根本就不是一个字符串。 ""代表声明了一个对象实例,这个对象实例的值是一个长度为0的空字符串。 NULL代表声明了一个空对象,对空对象做任何操作都不行的,除了=和== ""是一个字符串了,只是这个字符串里面没有内容了 String s=null;只是定义了一个句柄,也就是说你有了个引用,但是这个引用未指乡任何内存空间 String s="";这个引用已经指向了一块是空字符串的内存空间,是一个实际的东东了,所以你可以对它操作,而不用担心什么了 你说数字0和没有是不是一种概念啊??道理一样的 而且,null可以赋值给任何对象.""就不行了. 这里""和NULL绝对是两个概念 ""代表一个字符串存在,它的值就是“” NULL代表字符串根本没有实际的值,你并不知道它是什么。。。 哦,我明白了,意思就是String string = null 跟String string;是一回事儿 null是空对象 ""是空字符串 String s=null;//null是未分配堆内存空间 String a;//分配了一个内存空间,没存入任何对象 String a="";//分配了一个内存空间,存了一个字符串对象 问题二: String s;和String s=null;和String s="a";有什么区别? 针对这三种情况,使用out.println(s);的时候,第一个会出现异常,第二个会输出null.第三个则会输出a. 这是为什么呢?这三句声明语句,各自作了什么呢? 答: 第一个只是定义了一个String类型变量s,并没有给它赋初值,在Java中,默认在使用一个变量的时候必须赋予它初值(降低风险)。 第二个和第三个都定义了String类型变量s,并赋予它初值,只不过第二个赋予的值为null(空)罢了 主要要理解的是String s; s为一个引用~~它不是对象 第一个是没有初始化的引用; 第二个为空引用; 第三个是在字符串池里写入一个字符'a',然后用s指向它。 另外, String s="a"和String s=new String("a");是有本质上的区别的 前者是在字符串池里写入一个字符'a',然后用s指向它; 后者是在堆上创建一个内容为"a"的字符串对象。 String str="aaa"; //于栈上分配内存 String str=new String("aaa"); //于堆上分配内存 String s; 系统会自动赋值null Sring s=null;是分配的空间中存储的值为空值 String s="a";这句就不用我多说了分配的空间的值为字符a 问题三: 声明了一个string a;变量 在以后的判断中,a==""和a==null有何不同? 答: 如果没有给a赋过值,a==""会导致异常。 在实际处理时,往往认为""和null代表相同的含义,即都代表无值。 此时建议用如下语法: if(a==null || a=="") { } 如果a为null,就不会执行后面的判断,直接返回true。 null是用来判断引用类型是否分配了存储空间 ""是针对字符串的; string类型实际上是字符串指针,也即是一个引用类型 所以如果没有给a赋过值,a==""会导致异常 所以if(a==null || a==""){}这种写法也是正确的 问题四: String abc=null;String abc="";String abc;三种写法有什么区别? 答: 1:创建一个空字符串对象, 2:创建一个字符串为空的字符串对象。 3:声明一个字符串对象,但并没有分配内存,而1,2已经分配了内存 对于最后一种表示,你不能if(abc==null),或者int length = abc.length();编译的时候会提示可能没有初始化. String abc=null; String abc=""; 一般推荐使用第二种 第一种abc指向null,很多时候要判断字符串是否为空时,容易漏掉这种情况,在调用String的相关方法的时候就会出错 第二种则相对简单,String的方法都可以用,判断的时候也不会出错 1) String abc=null; 2) String abc; 3)String a=""; 4) String b=""; 5) String c=new String(""); 6) String d=new String(""); //1)等于2),和C语言不同,JAVA为安全原因不允许一个悬挂引用,没有赋值的引用地址一律自动赋值为NULL,以防止访问到任意内存 //3)和4)中,变量a和b将会指向同一内存地址(""的地址) //5)和6)中,变量c和d不会指向同一地址,而是两个""内容的地址,并且和a,b不同,实际上,3)和4)相当于new String("").intern(). //String类维护着一个字符串池,对于像3)和4)这样的赋值方法,String会在这个池中查找字符串是否已经在池中,如果在,就直接指向该地址, 如果不在,生成一个实例放入池中再指向那个地址,可见对于同样内容的字符串多次引用时3)4)的方法要比5)6)的方法剩内存,之所以这样做,是 因为String是一个内容不可变的量,运用的是设计模式GOF.FlyWeight 但有个关键的一点,没有人说到,这就是: String s;在什么情况下可以等同于String s=null;而在什么情况下又不等同?! 考虑下面的代码: //StringTest.java public class StringTest { static String s; //* public static void main(String[] args) { //String s; //** System.out.println(s); } } 编译并运行上面的代码,将打印null。 可见标有*号的行是自动初始化了的(s被自动初始化为null)。 而如果把标有**号的行取消注释,代码将不能通过编译,这是因为这行定义的是本地变量,而本地变量是不会自动初始化的。 由此得出结论: 在成员变量的定义中,String s;等同于String s=null; 而在本地变量(方法变量)的定义中,String s;不等同于String s=null;,这时要使用s必须显式地赋值。 这些虽然是小知识点,但在实际应用中很重要,也很容易被一些人忽视,特此提出。 还有一点要说明的是: 只要是在方法在中定义变量都要显示赋初值,main()方法也不例外,而在方法之外编译器回自动赋初值
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档