It has a minimum value of \u0000 (0 in the decimal representation, also called the null character) and a maximum value of \uffff (65,535).
The default value of a char is \u0000.
char defaultChar;// defaultChar == \u0000
In order to define a char of ' value an escape sequence (character preceded by a backslash) has to be used:
char singleQuote ='\'';
There are also other escape sequences:
char tab ='\t';char backspace ='\b';char newline ='\n';char carriageReturn ='\r';char formfeed ='\f';char singleQuote ='\'';char doubleQuote ='\"';// escaping redundant here; '"' would be the same; however still allowedchar backslash ='\\';char unicodeChar ='\uXXXX'// XXXX represents the Unicode-value of the character you want to display
You can declare a char of any Unicode character.
char heart ='\u2764';System.out.println(Character.toString(heart));// Prints a line containing "❤".
It is also possible to add to a char. e.g. to iterate through every lower-case letter, you could do to the following:
for(int i =0; i <=26; i++){char letter =(char)('a'+ i);System.out.println(letter);}
Primitive Types Cheatsheet
Table showing size and values range of all primitive types:
data type
numeric representation
range of values
default value
boolean
n/a
false and true
false
byte
8-bit signed
-27 to 27 - 1
0
-128 to +127
short
16-bit signed
-215 to 215 - 1
0
-32,768 to +32,767
int
32-bit signed
-231 to 231 - 1
0
-2,147,483,648 to +2,147,483,647
long
64-bit signed
-263 to 263 - 1
0L
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
float
32-bit floating point
1.401298464e-45 to 3.402823466e+38 (positive or negative)
0.0F
double
64-bit floating point
4.94065645841246544e-324d to 1.79769313486231570e+308d (positive or negative)
0.0D
char
16-bit unsigned
0 to 216 - 1
0
0 to 65,535
Notes:
The Java Language Specification mandates that signed integral types (byte through long) use binary twos-complement representation, and the floating point types use standard IEE 754 binary floating point representations.
Java 8 and later provide methods to perform unsigned arithmetic operations on int and long. While these methods allow a program to treat values of the respective types as unsigned, the types remain signed types.
The smallest floating point shown above are subnormal; i.e. they have less precision than a normal value. The smallest normal numbers are 1.175494351e−38 and 2.2250738585072014e−308
A char conventionally represents a Unicode / UTF-16 code unit.
Although a boolean contains just one bit of information, its size in memory varies depending on the Java Virtual Machine implementation (see boolean type(opens new window)).
The int primitive
A primitive data type such as int holds values directly into the variable that is using it, meanwhile a variable that was declared using Integer holds a reference to the value.
According to java API(opens new window): "The Integer class wraps a value of the primitive type int in an object. An object of type Integer contains a single field whose type is int."
By default, int is a 32-bit signed integer. It can store a minimum value of -231, and a maximum value of 231 - 1.
If you need to store a number outside of this range, long should be used instead. Exceeding the value range of int leads to an integer overflow, causing the value exceeding the range to be added to the opposite site of the range (positive becomes negative and vise versa). The value is ((value - MIN_VALUE) % RANGE) + MIN_VALUE, or ((value + 2147483648) % 4294967296) - 2147483648
int demo =2147483647;//maximum positive integerSystem.out.println(demo);//prints 2147483647
demo = demo +1;//leads to an integer overflowSystem.out.println(demo);// prints -2147483648
The maximum and minimum values of int can be found at:
int high =Integer.MAX_VALUE;// high == 2147483647int low =Integer.MIN_VALUE;// low == -2147483648
The default value of an int is 0
int defaultInt;// defaultInt == 0
Memory consumption of primitives vs. boxed primitives
Primitive
Boxed Type
Memory Size of primitive / boxed
boolean
Boolean
1 byte / 16 bytes
byte
Byte
1 byte / 16 bytes
short
Short
2 bytes / 16 bytes
char
Char
2 bytes / 16 bytes
int
Integer
4 bytes / 16 bytes
long
Long
8 bytes / 16 bytes
float
Float
4 bytes / 16 bytes
double
Double
8 bytes / 16 bytes
Boxed objects always require 8 bytes for type and memory management, and because the size of objects is always a multiple of 8, boxed types all require 16 bytes total. In addition, each usage of a boxed object entails storing a reference which accounts for another 4 or 8 bytes, depending on the JVM and JVM options.
In data-intensive operations, memory consumption can have a major impact on performance. Memory consumption grows even more when using arrays: a float[5] array will require only 32 bytes; whereas a Float[5] storing 5 distinct non-null values will require 112 bytes total (on 64 bit without compressed pointers, this increases to 152 bytes).
Boxed value caches
The space overheads of the boxed types can be mitigated to a degree by the boxed value caches. Some of the boxed types implement a cache of instances. For example, by default, the Integer class will cache instances to represent numbers in the range -128 to +127. This does not, however, reduce the additional cost arising from the additional memory indirection.
If you create an instance of a boxed type either by autoboxing or by calling the static valueOf(primitive) method, the runtime system will attempt to use a cached value. If your application uses a lot of values in the range that is cached, then this can substantially reduce the memory penalty of using boxed types. Certainly, if you are creating boxed value instances "by hand", it is better to use valueOf rather than new. (The new operation always creates a new instance.) If, however, the majority of your values are not in the cached range, it can be faster to call new and save the cache lookup.
Converting Primitives
In Java, we can convert between integer values and floating-point values. Also, since every character corresponds to a number in the Unicode encoding, char types can be converted to and from the integer and floating-point types. boolean is the only primitive datatype that cannot be converted to or from any other primitive datatype.
There are two types of conversions: widening conversion and narrowing conversion.
A widening conversion is when a value of one datatype is converted to a value of another datatype that occupies more bits than the former. There is no issue of data loss in this case.
Correspondingly, A narrowing conversion is when a value of one datatype is converted to a value of another datatype that occupies fewer bits than the former. Data loss can occur in this case.
Java performs widening conversions automatically. But if you want to perform a narrowing conversion (if you are sure that no data loss will occur), then you can force Java to perform the conversion using a language construct known as a cast.
Widening Conversion:
int a =1;double d = a;// valid conversion to double, no cast needed (widening)
Narrowing Conversion:
double d =18.96int b = d;// invalid conversion to int, will throw a compile-time errorint b =(int) d;// valid conversion to int, but result is truncated (gets rounded down)// This is type-casting// Now, b = 18
The double primitive
A double is a double-precision 64-bit IEEE 754 floating point number.
Because of the way floating point numbers are stored, many numbers don't have an exact representation.
double notExact =1.32-0.42;// result should be 0.9System.out.println(notExact);// 0.9000000000000001
While using double is fine for most applications, neither float nor double should be used to store precise numbers such as currency. Instead, the BigDecimal class should be used
Note:Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY, Double.NaN are double values. NaN stands for results of operations that cannot be determined, such as dividing 2 infinite values. Furthermore 0d and -0d are different, but == yields true:
By default, long is a 64-bit signed integer (in Java 8, it can be either signed or unsigned). Signed, it can store a minimum value of -263, and a maximum value of 263 - 1, and unsigned it can store a minimum value of 0 and a maximum value of 264 - 1
long example =-42;long myLong =284;long anotherLong =73;//an "L" must be appended to the end of the number, because by default,//numbers are assumed to be the int type. Appending an "L" makes it a long//as 549755813888 (2 ^ 39) is larger than the maximum value of an int (2^31 - 1),//"L" must be appended long bigNumber =549755813888L;long addedLongs = myLong + anotherLong;// 284 + 73 = 357long subtractedLongs = myLong - anotherLong;// 284 - 73 = 211
The maximum and minimum values of long can be found at:
long high =Long.MAX_VALUE;// high == 9223372036854775807Llong low =Long.MIN_VALUE;// low == -9223372036854775808L
The default value of a long is 0L
long defaultLong;// defaultLong == 0L
Note: letter "L" appended at the end of long literal is case insensitive, however it is good practice to use capital as it is easier to distinct from digit one:
The maximum and minimum values of byte can be found at:
byte high =Byte.MAX_VALUE;// high == 127byte low =Byte.MIN_VALUE;// low == -128
The default value of a byte is 0
byte defaultByte;// defaultByte == 0
Negative value representation
Java and most other languages store negative integral numbers in a representation called 2's complement notation.
For a unique binary representation of a data type using n bits, values are encoded like this:
The least significant n-1 bits store a positive integral number x in integral representation. Most significant value stores a bit vith value s. The value repesented by those bits is
x - s * 2n-1
i.e. if the most significant bit is 1, then a value that is just by 1 larger than the number you could represent with the other bits (2<sup>n-2</sup> + 2<sup>n-3</sup> + ... + 2<sup>1</sup> + 2<sup>0</sup> = 2<sup>n-1</sup> - 1) is subtracted allowing a unique binary representation for each value from - 2n-1 (s = 1; x = 0) to 2n-1 - 1 (s = 0; x = 2n-1 - 1).
This also has the nice side effect, that you can add the binary representations as if they were positive binary numbers:
(~i)+1
Example: taking the negative value of 0 (byte):
The result of negating 0, is 11111111. Adding 1 gives a value of 100000000 (9 bits). Because a byte can only store 8 bits, the leftmost value is truncated, and the result is 00000000
Original
Process
Result
0 (00000000)
Negate
-0 (11111111)
11111111
Add 1 to binary
100000000
100000000
Truncate to 8 bits
00000000 (-0 equals 0)
The short primitive
A short is a 16-bit signed integer. It has a minimum value of -215 (-32,768), and a maximum value of 215 ‑1 (32,767)
short example =-48;short myShort =987;short anotherShort =17;short addedShorts =(short)(myShort + anotherShort);// 1,004short subtractedShorts =(short)(myShort - anotherShort);// 970
The maximum and minimum values of short can be found at:
short high =Short.MAX_VALUE;// high == 32767short low =Short.MIN_VALUE;// low == -32768
The default value of a short is 0
short defaultShort;// defaultShort == 0
Syntax
int aInt = 8; // The defining (number) part of this int declaration is called a literal.
int hexInt = 0x1a; // = 26; You can define literals with hex values prefixed with **0x**.
int binInt = 0b11010; // = 26; You can also define binary literals; prefixed with **0b**.
long goodLong = 10000000000L; // By default, integer literals are of type int. By adding the L at the end of the literal you are telling the compiler that the literal is a long. Without this the compiler would throw an "Integer number too large" error.
double aDouble = 3.14; // Floating-Point Literals are of type double by default.
float aFloat = 3.14F; // By default this literal would have been a double (and caused an "Incompatible Types" error), but by adding an F we tell the compiler it is a float.
Remarks
Java has 8 primitive data types, namely boolean, byte, short, char, int, long, float and double. (All other types are reference types. This includes all array types, and built-in object types / classes that have special significance in the Java language; e.g. String, Class and Throwable and its subclasses.)
The result of all operations (addition, subtraction, multiplication, etc) on a primitive type is at least an int, thus adding a short to a short produces an int, as does adding a byte to a byte, or a char to a char. If you want to assign the result of that back to a value of the same type, you must cast it. e.g.
byte a =1;byte b =2;byte c =(byte)(a + b);
Not casting the operation will result in a compile error.
A compiler encodes loads of literal values of types byte and short using Java Virtual Machine instructions that sign-extend those values to values of type int at compile-time or run-time. Loads of literal values of types boolean and char are encoded using instructions that zero-extend the literal to a value of type int at compile-time or run-time. [..]. Thus, most operations on values of actual types boolean, byte, char, and short are correctly performed by instructions operating on values of computational type int.
The reason behind this is also specified in that section:
Given the Java Virtual Machine's one-byte opcode size, encoding types into opcodes places pressure on the design of its instruction set. If each typed instruction supported all of the Java Virtual Machine's run-time data types, there would be more instructions than could be represented in a byte. [...] Separate instructions can be used to convert between unsupported and supported data types as necessary.