views:

2857

answers:

6

So I'm learning java, and I have a question. It seems that the types int, boolean and string will be good for just about everything I'll ever need in terms of variables, except perhaps float could be used when decimal numbers are needed in a number.

My question is, are the other types such as long, double, byte, char etc ever used in normal, everyday programming? What are some practical things these could be used for? What do they exist for?

A: 

The primitive data types are required because they are the basis of every complex collection.

long, double, byte etc. are used if you need only a small integer (or whatever), that does not waste your heap space.

I know, there's enough of RAM in our times, but you should not waste it.

I need the "small ones" for database and stream operations.

furtelwart
A: 

It's relative to the data you're dealing with. There's no point using a data type which reserves a large portion of memory when you're only dealing with a small amount of data. For example, a lot of data types reserve memory before they've even been used. Take arrays for example, they'll reserve a default amount (say, 256 bytes <-- an example!) even if you're only using 4 bytes of that.

See this link for your answer

Kezzer
I was reading that just before asking this and didn't get it, so downvoted
Click Upvote
Overhead on arrays should be nowhere near that large. More in the order of 16 bytes.
Tom Hawtin - tackline
It was an example.
Kezzer
+3  A: 

Hello,

You can have a look here about the primitive types in Java.

The main interest between these types are the memory usage. For example, int uses 32bits while byte only uses 8bits.

Imagine that you work on large structure (arrays, matrices...), then you will better take care of the type you are using in order to reduce the memory usage.

romaintaz
+2  A: 

I guess there are several purposes to types of that kind:

1) They enforce restrictions on the size (and sign) of variables that can be stored in them.

2) They can add a bit of clarity to code (e.g. if you use a char, then anyone reading the code knows what you plan to store in it).

3) They can save memory. if you have a large array of numbers, all of which will be unsigned and below 256, you can declare it as an array of bytes, saving some memory compared with if you declared an array of ints.

4) You need long if the numbers you need to store are larger than 2^32 and a double for very large floating point numbers.

Ben
please fix the point about doubles being needed for numbers greater than 2^32
David Schmitt
oops - sorry. Fixed that now.
Ben
double more useful for precise values; the magnitude thing is less important. Point (1) should be "causes overflow errors to be hidden" :).
Tom Hawtin - tackline
+12  A: 

A java int is 32 bits, while a long is 64 bits, so when you need to represent integers larger than 2^31, long is your friend. For a typical example of the use of long, see System.currentTimeMillis()

A byte is 8 bits, and the smallest addressable entity on most modern hardware, so it is needed when reading binary data from a file.

A double has twice the size of a float, so you would usually use a double rather than a float, unless you have some restrictions on size or speed and a float has sufficient capacity.

A short is two bytes, 16 bits. In my opinion, this is the least necessary datatype, and I haven't really seen that in actual code, but again, it might be useful for reading binary file formats or doing low level network protocols. For example ip port numbers are 16 bit.

Char represents a single character, which is 16 bits. This is the same size as a short, but a short is signed (-32768 to 32767) while a char is unsigned (0 to 65535). (This means that an ip port number probably is more correctly represented as a char than a short, but this seems to be outside the intended scope for chars...)

For the really authorative source on these details, se the java language specification.

Rolf Rander
The whole short being signed and char being unsigned thing really bugs me. Please Mr. Java, just give me back my "unsigned" modifier for ints! :-)
Brian Knoblauch
Brian: I'd prefer having byte, short and char non-numeric. Better having int and long non-numeric too, with a sensible arbitrary-sized numeric rational integer.
Tom Hawtin - tackline
One use case for the short type is arrays. If you need to process a lot of numbers in memory, and know that they will all fit in 16 bit, you can save 50 % of your RAM by using short[] instead of int[]. http://www.crazysquirrel.com/computing/java/speed_and_memory/short-array-vs-int-array.jspx
markusk
+6  A: 

With the possible exception of "short", which arguably is a bit of a waste of space-- sometimes literally, they're all horses for courses:

  • Use an int when you don't need fractional numbers and you've no reason to use anything else; on most processors/OS configurations, this is the size of number that the machine can deal with most efficiently;
  • Use a double when you need fractional numbers and you've no reason to use anything else;
  • Use a char when you want to represent a character (or possibly rare cases where you need two-byte unsigned arithmetic);
  • Use a byte if either you specifically need to manipulate a signed byte (rare!), or when you need to move around a block of bytes;
  • Use a boolean when you need a simple "yes/no" flag;
  • Use a long for those occasions where you need a whole number, but where the magnitude could exceed 2 billion (file sizes, time measurements in milliseconds/nanoseconds, in advanced uses for compacting several pieces of data into a single number);
  • Use a float for those rare cases where you either (a) are storing a huge number of them and the memory saving is worthwhile, or (b) are performing a massive number of calculations, and can afford the loss in accuracy. For most applications, "float" offers very poor precision, but operations can be twice as fast -- it's worth testing this on your processor, though, to find that it's actually the case!
  • Use a short if you really need 2-byte signed arithmetic. There aren't so many cases...

Don't get too bogged down in the memory usage of these types unless you really understand it. For example:

  • every object size is rounded to 16 bytes in Hotspot, so an object with a single byte field will take up precisely the same space as a single object with a long or double field;
  • when passing parameters to a method, every type takes up 4 or 8 bytes on the stack: you won't save anything by changing a method parameter from, say, an int to a short! (I've seen people do this...)

Obviously, there are certain API calls (e.g. various calls for non-CPU intensive tasks that for some reason take floats) where you just have to pass it the type that it asks for...!

Note that String isn't a primitive type, so it doesn't really belong in this list.

Neil Coffey