Why second dimension is not mandatory in 2d array in java? - java

int a[][]=new int[2][]; // It works without any error
Why is the second dimension missing in this snippet?

A 2D array is, technically, an array of arrays. The code that you have specified tells you how many arrays you want to have.
You can further initialize this as follows:
int a[][] = new int[2][];
a[0] = new int[3];
a[1] = new int[5];
Something like new int[2][2] is nothing more than a condensed version of the code above.

It's not mandatory because the second dimension is not required to calculate how much memory is required to hold the array.
Compare the following:
int[] a = new int[2];
In this case the JVM needs to be instructed to allocate space for one array that holds two integers.
On the other hand:
int[][] = new int[2][];
In this case the JVM needs to be instructed to allocate space for two references to integer array objects. It doesn't matter what size these integer array objects end up being, as it doesn't change the size of the reference.
In fact, these two arrays can have different sizes or even not be created at all.

Second dimension in array is optional in Java. You can create a two dimensional array without specifying both dimension e.g. int[4][] is valid array declaration.
The reason behind that is Java doesn't support multi-dimensional array in true sense. In a true two dimensional array all the elements of array occupy a contiguous block of memory , but that's not true in Java.
Instead a multi-dimensional array is an array of array. For example two dimensional array in Java is simply an array of one dimensional array like String[][] is an array of array of String[] or "array of array of strings". This diagram shows how exactly two dimensional arrays are stored in Java :

Related

Can I Reuse Array Variables With Changed length?

Can I Use Array Variables With Changed Length Each Time
like
int [] primes = new int[6];
...
primes = new int[4];
Can I Use Prime Again Like I Did Above ? Is It Possible ? If Not Can You Give Me Reason Thanks .
You are not reusing the same array, but creating new instances of array object. The java array object has a fixed length (final int), so it's impossible to change the length of an array after instantiation.
Some explanation to your question.
You can run the following code and will get better understanding.
As java can't get the address, so here using hashcode to show the object address.
int[] prime = new int[]{1,2,3,4};
System.out.println(Arrays.hashCode(prime));
System.out.println("prime[0]="+prime[0]);
prime = new int[]{4,3,2,1,0};
System.out.println(Arrays.hashCode(prime));
System.out.println("prime[0]="+prime[0]);
Output like this:
955331
prime[0]=1
1045631
prime[0]=4
Array can not be resized once memory is being allocated as array get a contiguous memory block.
int arr[] = new int[3];
Once memory space is hold, resizing the array is not possible as next contiguous memory block may not be available. You can either create a new array and shift all the elements of previous array to the new array with different size.
I would recommend using ArrayList for dynamic array. If you get in any such situation.
Two separate arrays
You are not changing the length of the array. You are creating a second array, separate and distinct from the first.
You created two arrays but used only a single reference variable (primes) to track them. When you assigned the second array to primes, the first was forgotten. The first array is still floating around in memory, a candidate for eventual garbage collection if no other reference points to it.
ArrayList
If you want resizing, use a List implementation such as ArrayList rather than a mere array. You’ll need to store objects (Integer) rather than primitives (int). The auto-boxing feature in Java can mask the difference.
int initialCapacity = 6 ;
ArrayList< Integer > primes = new ArrayList<>( initialCapacity ) ;
primes.add( 7 ) ; // The primitive `int` 7 literal is automatically converted via autoboxing to be an `Integer` Object.
The ArrayList automatically grows its capacity as needed to store additional items.
If you wish to free up extra capacity not allocated to hold any objects, call ArrayList::trimToSize().

Selectively allocate dimensions for multi-dimensional array at construction

Java supports multi-dimensional arrays, which are represented as "arrays of arrays". For instance, I can create an array of String arrays using the following code:
int rows = ...
int cols = ...
String[][] array2d = new String[rows][cols];
What I'd like to do is have the second dimension be "nulled out". In other words, a for-loop like for(String[] array : array2d) System.err.println(array); would print out:
null
...
null
The reason I'd like to do this is because I have already allocated a bunch of String[] instances that I want to just drop into array2d. I have a couple of solutions but both seem sub-optimal for the following reasons:
Solution 1
I could just do something like String[][] array2d = new String[rows][0], use a for-loop to null out the first dimension, and populate the rows later, but this seems ugly to me because Java will create a new empty String[] for every row, and I really don't need it to.
Solution 2
I could also do something like String[][] array2d = new String[][]{null, null, ... null}, but this is even worse because I have to hard code the length of the first dimension of array2d via the bracketed section of code, which is disgusting.
I recognize that this isn't a huge problem, especially when the dimensionality is small, and any programmer worth his salt would choose some other construct over creating arrays of many dimensions. I'm mostly just curious if there is a way to partially allocate dimensions of a multi-dimensional array at construction.
Easiest solution possible:
int rows = ...
String[][] array2d = new String[rows][];
If you don't initialize the second dimension, you array will have null entries in dimension 1.

How does a program locate the index of an array?

I know array lookup has O(1) time, so it cannot be looping through. Does the program store the memory locations of the indices of the array, or how does it look the index instantaneously?
Array elements are always spaced at equal distances in the memory, so finding an element given an index requires a multiplication by the size of the element and an addition of the array's base in memory. Both operations are often done within the space of a single instruction in hardware by employing an appropriate addressing mode.
underneath...
its a memory address + (index postion * the size of the things in the array)
Try this,
1. Arrays are consecutive memory locations which are stored in Heap, as Arrays are objects in java.
2. Assume i have an Array of String as an instance variable
String[] arr = {1,2,3,4,5};
Now its like this
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5
{1,2,3,4,5} are stored over the heap, and Considering array "arr" as instance variable, will lives within the object on the heap.
Now arr will hold the address of the very first element of the Array that is 1. "arr" which is an object reference array variable, will be inside the object, and {1,2,3,4,5} outside somewhere on the heap.
Array elements are stored in a consecutive block, if they grow they need to be moved to a new place. The elements are then accessed using an offset from where the array begins.
In C you can access the element of index i in an array called a using two different methods:
int arrayElement = a[i];
int arrayElement = (int)(a + i * sizeof(int));
This is more or less how it is done in Java under the hood.

Test length of multiple dimensions of an array in Java

I'm a Java noob. I don't know very much about the language (at least, not enough to do complex things) right now, but I'm getting there!
I know you can test the length of a single-dimensioned array by doing arr.length, but is it possible to test other dimensions (in a multidimensional array)?
Yes, it is. Obviously, to test the first dimension you would just do arr.length. Subsequent dimensions are tested by using length with the [0] element of that particular dimension. For example, consider this array:
int[][][][] arr = new int[10][11][12][13];
To test the...
first dimension: arr.length;
second dimension: arr[0].length;
third dimension: arr.[0][0].length;
fourth dimension: arr.[0][0][0].length;
A multidimensional array is just an array of arrays, and each array in the array can have different lengths. I.e.:
int arr[][] = new int[2][];
arr[0] = new int[5];
arr[1] = new int[10];
System.out.println(arr.length);
System.out.println(arr[0].length);
System.out.println(arr[1].length);
Now you have a two-dimensional array. The first dimension (outer) can be referred to as arr and is of size 2. The inner arrays can be referred to as arr[0] and arr[1] and have lengths 5 and 10, respectively. Since each of these refers to a normal Java array, you can use all the normal ways of accessing an arry on them. Further, since we create multidimensional arrays by putting arrays in arrays, you can have as many dimensions as you want, and you access each further level down by indexing into the one above: arr[2][1][5][11][3][0][123][5][42][9][7]....length
Given, say, a 2D array, you can access the length of the ith inner array with arr[i].length.
If you haven't already seen it, check out Arrays (The Java™ Tutorials).
You can test the other dimensions of the other dimensions by directly referrencing the dimension you are wanting to test.
For example, if you have a 2 dimensional array with 3 items in the primary dimension then you can identify the length of each of them by using arr[0].length, arr[1].length, and arr[2].length.
the code below just sets up an array, and then verifies that the lengths are what we expect them to be.
public void testLength(){
//setup the array you are wanting to test
int[][] foo = new int[2][5];
// this just makes sure that we do get 2 dimensions within the primary
Assert.assertEquals(2,foo.length);
Assert.assertEquals(5,foo[0].length);
// change the array stored within foo[0]
foo[0]= new int[8];
Assert.assertEquals(8,foo[0].length);
}

Java native array lengths

I have a 2D array of doubles in Java which is basically a table of values and I want to find out how many rows it has...
It is declared elsewhere (and allocated) like this:
double[][] table;
then passed to a function...
private void doSomething(double[][] table)
{
}
In my function I want to know the length of each dimension without having to pass them around as arguments. I can do this for the number of columns but don't know how to do it for the rows...
int cols = table[0].length;
int rows = ?;
How do I do that?
Can I just say...
int rows = table.length;
Why would that not give rows x cols?
In Java a 2D array is nothing more than an array of arrays.
This means that you can easily get the number of rows like this:
int rows = array.length;
This also means that each row in such an array can have a different amount of elements (i.e. each row can have a varying number of columns).
int columnsInFirstRow = array[0].length;
This will only give you the number of columns in the first row, but the second row could have more or less columns than that.
You could specify that your method only takes rectangular arrays and assume that each row has the same number of columns than the first one. But in that case I'd wrap the 2D-array in some Matrix class (that you might have to write).
This kind of array is called a Jagged Array.
Look at this example. They use .length there to get the row count, [].length to get the column count.
It's because the array consists of "row" pointers and these could lead anywhere, so you have to use .length for each column to get the sizes of these arrays, too.
I don't quite understand your question. You have to realize that in Java, multidimensional arrays are in fact arrays of arrays.
table.length will in fact give you the number of one-dimensional arrays contained in your two-dimensional array (assuming there are no null entries).
table[0].length will give you the size of the first one-dimensional entry. This could be different from the size of the others, and it could throw a NullPointerException (though neither is possible when it's allocated as new double[rows][cols]).
Well, first of all, why don't you just test if
int rows = table.length;
gives the desired result?
It does indeed give you the number of elements in the first dimension. Multidimensional arrays are in fact nothing special, as they are just arrays of arrays of arrays of ... In your case - a 2D array - it is organized like this (in pseudo-code):
double[][] foo = { double[] = {...}, double[] = {...}, ... }
So when accessing foo, it refers to the "outer" array, which has of course the length property, which contains the number of arrays it contains on the second level.
You can read the double[][] as "An array ([]) of double-arrrays (double[])".
No it won't. You can just use table.length
Alternatively, you could wrap your 2d array into a Matrix or Grid class of some sort. Internally, you could represent it as a 1d array and compute offsets for the row/col coordinates.

Categories

Resources