在Java中,我可以执行以下操作来简洁地防范NullPointerException
:
if ("myString".equals(someOtherString))
Run Code Online (Sandbox Code Playgroud)
但我不能对整数做同样的事,例如
if (5.equals(someOtherInteger))
Run Code Online (Sandbox Code Playgroud)
我收到编译时错误.有关为何做出此设计决定的任何想法?或者任何可能解释它的资源?提前致谢.
编辑:someOtherInteger
是一个Integer
,而不是一个int
.
我已经浏览了整个互联网,试图解决这个问题.任何人都可以正确回答并解释原因吗?非常感谢!
请查看以下代码.
Run Code Online (Sandbox Code Playgroud)Integer myNumber; myNumber = 5;
关于第二个陈述,以下哪一项是正确的?
该语句执行拆箱
该语句执行自动包装.
该声明执行自动装箱.
它会导致错误,因为您无法将基元类型分配给包装类对象.
我最近在一些比较代码中偶然发现了有趣的错误,其中两个对象的属性都等于0.0m.当该属性转换为int并进行比较时,比较永远不会相等.复制如下:
采用抽象A和两个实现B和C:
public abstract class A
{
public decimal MyProp { get; set; }
}
public class B : A
{
}
public class C : A
{
}
Run Code Online (Sandbox Code Playgroud)
抽象定义了几个公共属性,主要是但不完全是十进制.所有公共属性都是原始属性.具体的子类型表示从两个不同的数据源获得的这种抽象.当且仅当它们的所有公共属性相等时,A类型的两个对象才被认为是相等的.需要注意的是:使用默认的舍入行为(MidpointRounding.ToEven),所有十进制属性都应在比较前转换为int.这导致了以下比较代码:
private static bool Compare(A a1, A a2)
{
var propertiesList = typeof(A).GetProperties(BindingFlags.Instance | BindingFlags.Public).ToList();
foreach (var propertyInfo in propertiesList)
{
var value1 = propertyInfo.GetValue(a1);
var value2 = propertyInfo.GetValue(a2);
if (propertyInfo.PropertyType == typeof(decimal))
{
value1 = Convert.ToInt32(value1);
value2 = Convert.ToInt32(value2);
}
// debugger confirms that value1 is 0 and …
Run Code Online (Sandbox Code Playgroud) 根据Java语言规范第5.1.7节,Java将-c8 Integer
从-128 缓存到127以进行性能优化.
因此,当您a == b
与缓存范围中的a
&b
Integers 进行比较时,即使它们是不同的对象,它也会返回true.
从机制上讲,这种缓存带来了哪些性能优势?根据这个答案,"目的主要是为了节省内存,由于更好的缓存效率,这也可以带来更快的代码." 它如何导致更快的代码?我如何使用此功能来提高我编写的实际代码的性能?
它与类中的以下方法有什么关系IntegerCache
吗?
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Run Code Online (Sandbox Code Playgroud) Object[]
可以存储来自任何类的任何对象,因为Java中的每个类都会扩展java.lang.Object
.
我不认为原语会延伸Object
,为什么我们可以将它们存储起来如下?
Object[] obj_arr = {1, 2, 1.2, 'a', false, new MyClass(), null};
Run Code Online (Sandbox Code Playgroud)
问题是为什么原语可以存储在Object数组中并且在上面的代码中是否发生了自动装箱?
有时我会编写一些小脚本,用于管理数据库中的记录或生成一些用于报告目的的数据。
大多数时候我们使用Long
类型作为用户实体的 ID。如果我执行以下操作:
List<Long> listOfLong = Arrays.asList(1L, 2L, 3L);
System.out.println(listOfLong.contains(2));
Run Code Online (Sandbox Code Playgroud)
它返回,false
但为此:
System.out.println(integers.contains(2L));
Run Code Online (Sandbox Code Playgroud)
它返回true
。
我们不应该得到这样的编译时错误吗?
我用Java,C和Python编程.
算术类型之间的自动强制规则已得到扩充,以处理更丰富的类型集
资料来源:"C编程语言"
但"强制"是什么意思呢?答案说它就像类型转换和隐式转换和隐式类型转换,并在我阅读它时称为自动装箱.那么自动装箱和强制之间的区别是什么?
谢谢
根据我的理解,如果我有两个long
或者int
,==
由于自动装箱,测试值相等的运算符有时不起作用.
我需要做些什么来确保==
在处理原语时能够在每种可能的情况下工作?
我对一个小问题感到困惑,请参阅以下内容:
Double j = new Double(5); // No problem.
double j =5;//
//But
//Here the problem:
Double j = 5;
Long k =5;
Float g = 5.0;
Run Code Online (Sandbox Code Playgroud)
我知道解决方案,但我想理解为什么在某些情况下,演员是隐式完成而在其他情况下不是.
看着有效的Java视频我注意到,仅支持六个比较符至极四个盒装原语类型<
,>
,<=
,>=
,不支持==
和!=
.
我的问题是为什么盒装基元不支持所有运算符?
autoboxing ×10
java ×9
equality ×2
primitive ×2
c ×1
c# ×1
caching ×1
coercion ×1
equals ×1
java-8 ×1
performance ×1
reflection ×1
unboxing ×1