getLong(String str ) 与 valueOf(String str) 都是Long 这个类中的方法,它们的返回值都是Long ,传入的参数都是 String 。看这字面的意思好像都是将字符串变为Long 类型的数据。
先上一个例子:
package hlm.com;
public class TestLong {
public static void main(String[] args ) {
String lstr = "12" ;
Long l1 = Long. getLong (lstr );
Long l2 = Long. valueOf ( lstr );
System. out .println( l1 );
System. out .println( l2 );
}
}
运行结果:
null
12
valueOf(String str)这个方法如我们想像的一样,它是将我们传入的数据字符串成功地转成了Long 类型的数据。但getLong(String str )却失败了。
我们先来看valueOf(String str)。
public static Long valueOf (String paramString )
throws NumberFormatException
{
return valueOf ( parseLong ( paramString , 10));
}
其实它是调了parseLong(String,int )这一方法的,那么我们就看parseLong(String,int )
public static long parseLong (String paramString , int paramInt )
throws NumberFormatException
{
if ( paramString == null ) {
throw new NumberFormatException( "null" );
}
if ( paramInt < 2) {
throw new NumberFormatException( "radix " + paramInt + " less than Character.MIN_RADIX" );
}
if ( paramInt > 36) {
throw new NumberFormatException( "radix " + paramInt + " greater than Character.MAX_RADIX" );
}
long l1 = 0L;
int i = 0;
int j = 0;
int k = paramString .length();
long l2 = -9223372036854775807L;
if ( k > 0)
{
int n = paramString .charAt(0);
if ( n < 48)
{
if ( n == 45)
{
i = 1;
l2 = Long. MIN_VALUE ;
}
else if ( n != 43)
{
throw NumberFormatException. forInputString ( paramString );
}
if ( k == 1) {
throw NumberFormatException. forInputString ( paramString );
}
j ++;
}
long l3 = l2 / paramInt ;
while ( j < k )
{
int m = Character. digit ( paramString .charAt( j ++), paramInt );
if ( m < 0) {
throw NumberFormatException. forInputString ( paramString );
}
if ( l1 < l3 ) {
throw NumberFormatException. forInputString ( paramString );
}
l1 *= paramInt ;
if ( l1 < l2 + m ) {
throw NumberFormatException. forInputString ( paramString );
}
l1 -= m ;
}
}
else
{
throw NumberFormatException. forInputString ( paramString );
}
return i != 0 ? l1 : - l1 ;
}
parseLong(String,int )这一方法就是按传入的字符串及进制数来将字符串转为long这一基础类型数据(具体算法下次再讨论),然后valueOf(String str)将其包装成Long 这一类型。期间还有大家面试题 中常见到的new Long 时127及以下的数据怎么new 用==都能得到true ,就是因为127及以前的数据都是先new 好然后再从cahe 中取的,valueOf把long 变为Long 时也是这么干的。
再来说 getLong(String str ),我们都被它的外表,这家伙根本跟我们想的就不一样
public static Long getLong (String paramString , Long paramLong )
{
String str = null ;
try
{
str = System. getProperty ( paramString );
}
catch (IllegalArgumentException|NullPointerException localIllegalArgumentException ) {}
if ( str != null ) {
try
{
return decode ( str );
}
catch (NumberFormatException localNumberFormatException ) {}
}
return paramLong ;
}
大家注意这一句
str = System. getProperty ( paramString );
这才是它的根本。它就是获取系统属性的。什么是系统属性,看下例子大家就明白了
public class TestLong {
public static void main(String[] args ) {
System. out .println(System. getProperty ( "os.name" ));
System. out .println(System. getProperty ( "java.version" ));
}
}
运行结果为
Windows 7
1.8.0_162
这就是系统属性。getLong(String str )就是将系统属性的字符串转为Long 类型数据。我们前面的“12”根本不是系统属性,所以转不了为null很正常。
“ java.version”这个虽然是系统属性了,但它的字段串是“ 1.8.0_162”,也是转不了,都不是标准的数。所以,这是一个很蛋疼的方法。个人感觉写在这里就是用来误导人的。很少的属性值会是标准数字,退一万步就,如果我知道这个系统属性值是个纯数字,我也会直接System.getProperty()然后再转为Long 。打死也不会想到Lomg 中的getLong(String str )这个方法有这效果。很格格不入啊。
————————————————
版权声明:本文为CSDN博主「mottohlm」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mottohlm/article/details/80767266