Comparing the generated bytecodes is mostly meaningless, since most of the optimization happens in run time with the JIT compiler. I'm going to guess that in this case, either expression is equally fast. If there's any difference, it's negligible.
This is not something that you need to worry about. Look for big picture optimizations.
Answer from polygenelubricants on Stack OverflowVideos
Comparing the generated bytecodes is mostly meaningless, since most of the optimization happens in run time with the JIT compiler. I'm going to guess that in this case, either expression is equally fast. If there's any difference, it's negligible.
This is not something that you need to worry about. Look for big picture optimizations.
Don't optimize at the expense of readability if the speed (or memory/whatever the case may be) gain will be negligible. I think !=null is generally more readable, so use that.
Hi Java Guru
I have see some code where it uses null != vs variable!=null. Can someone please to which should I used in what situation and what sufficient does using one over the other one makes?
Thank you
Here's the source code of String.valueOf: -
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
As you can see, for a null value it returns "null" string.
So,
String stringValue = null;
String valueOf = String.valueOf(stringValue);
gives "null" string to the valueOf.
Similarly, if you do: -
System.out.println(null + "Rohit");
You will get: -
"nullRohit"
EDIT
Another Example:
Integer nulInteger = null;
String valueOf = String.valueOf(nulInteger) // "null"
But in this case.
Integer integer = 10;
String valueOf = String.valueOf(integer) // "10"
Actually, you can have a look at the implementation of the method: valueOf(). You will know what happened then.
In JDK 1.5, its code is like this:
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
From the code, you can see that if the object is null it will return a not null string with "null" value in it, which means the valueOf object is not null.
It appears the concept of nulls came from Tony Hoare back in 1965 when he was working on Algol W. He called it his "billion dollar mistake". I was wondering if James Gosling has ever expressed any thoughts about wether or not adding nulls to Java was a good or bad thing?
Personally, coming to Java from Scala and Haskell, nulls seem like a very bad idea, to me.
I am considering making an argument to my company's engineering team to switch from using nulls to using `Optional` instead. I am already quite aware of the type system, code quality, and coding speed arguments. But I am very open to hearing any arguments for or against.
You can't accidently assign null to obj by typing obj = null instead. However, that's a reminiscence from C times, in java, it is not possible, as the = expression returns the right hand side of the assignment. As null is not a boolean, the compiler will complain.
I would try to explain it to my boss once, demonstrate it. If he still doesn't agree with you, just do it. It's a petty thing to fight about with your boss.
If you compile your file with if(null==obj), the generated byte code is if_acmpne and in case of if(obj==null) it is ifnonnull. Now in if_acmpne two operands are popped out of stack and checked they are not equal(in this case null and obj), and in ifnonnull, only one operand is popped and checked if it is not null. From this it seems ifnonnull is better as it involves popping of only one operand.
References : http://www.artima.com/underthehood/flowP.html
Is null an instance of anything?
No, there is no type which null is an instanceof.
15.20.2 Type Comparison Operator instanceof
RelationalExpression: RelationalExpression instanceof ReferenceTypeAt run time, the result of the
instanceofoperator istrueif the value of the RelationalExpression is notnulland the reference could be cast to the ReferenceType without raising aClassCastException. Otherwise the result isfalse.
This means that for any type E and R, for any E o, where o == null, o instanceof R is always false.
What set does 'null' belong to?
JLS 4.1 The Kinds of Types and Values
There is also a special null type, the type of the expression
null, which has no name. Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type. Thenullreference is the only possible value of an expression of null type. Thenullreference can always be cast to any reference type. In practice, the programmer can ignore the null type and just pretend thatnullis merely a special literal that can be of any reference type.
What is null?
As the JLS quote above says, in practice you can simply pretend that it's "merely a special literal that can be of any reference type".
In Java, null == null (this isn't always the case in other languages). Note also that by contract, it also has this special property (from java.lang.Object):
public boolean equals(Object obj)For any non-
nullreference valuex,x.equals(null)shouldreturn false.
It is also the default value (for variables that have them) for all reference types:
JLS 4.12.5 Initial Values of Variables
- Each class variable, instance variable, or array component is initialized with a default value when it is created:
- For all reference types, the default value is
null.
How this is used varies. You can use it to enable what is called lazy initialization of fields, where a field would have its initial value of null until it's actually used, where it's replaced by the "real" value (which may be expensive to compute).
There are also other uses. Let's take a real example from java.lang.System:
public static Console console()Returns: The system console, if any, otherwise
null.
This is a very common use pattern: null is used to denote non-existence of an object.
Here's another usage example, this time from java.io.BufferedReader:
public String readLine() throws IOExceptionReturns: A
Stringcontaining the contents of the line, not including any line-termination characters, ornullif the end of the stream has been reached.
So here, readLine() would return instanceof String for each line, until it finally returns a null to signify the end. This allows you to process each line as follows:
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
One can design the API so that the termination condition doesn't depend on readLine() returning null, but one can see that this design has the benefit of making things concise. Note that there is no problem with empty lines, because an empty line "" != null.
Let's take another example, this time from java.util.Map<K,V>:
V get(Object key)Returns the value to which the specified key is mapped, or
nullif this map contains no mapping for the key.If this map permits
nullvalues, then a return value ofnulldoes not necessarily indicate that the map contains no mapping for the key; it's also possible that the map explicitly maps the key tonull. ThecontainsKeyoperation may be used to distinguish these two cases.
Here we start to see how using null can complicate things. The first statement says that if the key isn't mapped, null is returned. The second statement says that even if the key is mapped, null can also be returned.
In contrast, java.util.Hashtable keeps things simpler by not permitting null keys and values; its V get(Object key), if returns null, unambiguously means that the key isn't mapped.
You can read through the rest of the APIs and find where and how null is used. Do keep in mind that they aren't always the best practice examples.
Generally speaking, null are used as a special value to signify:
- Uninitialized state
- Termination condition
- Non-existing object
- An unknown value
How is it represented in the memory?
In Java? None of your concern. And it's best kept that way.
Is null a good thing?
This is now borderline subjective. Some people say that null causes many programmer errors that could've been avoided. Some say that in a language that catches NullPointerException like Java, it's good to use it because you will fail-fast on programmer errors. Some people avoid null by using Null object pattern, etc.
This is a huge topic on its own, so it's best discussed as answer to another question.
I will end this with a quote from the inventor of null himself, C.A.R Hoare (of quicksort fame):
I call it my billion-dollar mistake. It was the invention of the
nullreference in 1965. At that time, I was designing the first comprehensive type system for references in an object oriented language (ALGOL W). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn't resist the temptation to put in anullreference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.
The video of this presentation goes deeper; it's a recommended watch.
Is null an instance of anything?
No. That is why null instanceof X will return false for all classes X. (Don't be fooled by the fact that you can assign null to a variable whose type is an object type. Strictly speaking, the assignment involves an implicit type conversion; see below.)
What set does 'null' belong to?
It is the one and only member of the null type, where the null type is defined as follows:
"There is also a special null type, the type of the expression null, which has no name. Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type. The null reference is the only possible value of an expression of null type. The null reference can always be cast to any reference type. In practice, the programmer can ignore the null type and just pretend that null is merely a special literal that can be of any reference type." JLS 4.1
What is null?
See above. In some contexts, null is used to denote "no object" or "unknown" or "unavailable", but these meanings are application specific.
How is it represented in the memory?
That is implementation specific, and you won't be able to see the representation of null in a pure Java program. (But null is represented as a zero machine address / pointer in most if not all Java implementations.)
null means that a variable contains a reference to a space in memory that does not contain an object.
0 is a numeric data type with a value of 0.
Nothing doesn't really exist, however I think you may be viewing this as an empty String "" which is simply a String data type that does not contain a value.
If your looking at this from a Javascript paradigm it may be confusing. In Java variables are not truthy and falsey therefore the type is considered in comparisons.
0 is a number, you use it to check if a numeric value (int, short, float, double, etc.) is the number 0.
null is the value of a reference that points nowhere, you use it to make sure a reference does indeed reference something.
nothing is not part of Java.
The closest thing for nothing (for: no information at all) is the void declaration of a method. It states that the method returns literally nothing.
Note that 0, null and the empty string "" are values and thus contain information.
For example, 0 is the answer to "What is 5 subtracted from 5?" (among others).
null is the negative response to "Does this thing point to an object?".
""" could be the answer to "What is the longest sequenc of 'X's in your name?", unless your name is "Xanthippe".