Wednesday, 28 October 2015
We all know in java ArrayList does not have limit unlike Array where we can only add fixed number of elements.
ArrayList allows dynamically adding and removing the elements in this list. So question comes HOW?
By default initial capacity of an array is defined with constant DEFAULT_CAPACITY
If we closely look at the add method in the source code of ArrayList.java. Click here to get whole file.
We can see in above code that before adding the element into the ArrayList its calling one method named “ensureCapacity”. This method makes sure what is the current size of the existing elements containing in the array and what is the maximum allowed size for the array at this point of time?
So if we are trying to add more element than its maximum allowed size then maximum allowed size needs to be increased in order to accommodate new elements.
But here we must notice that “elementData” is an array only and array does not grow dynamically.
Here is the main thing to notice
Internally new array is created with new capacity and then elements from existing array are copied to the new array with bigger capacity.
New capacity is calculated with below expression:
If you want to see this happening, You can try to execute the below code snippet in debug mode and monitor elementData array as shown in below figure.
I hope you now know how the size of ArrayList grows dynamically. Please let me know by comments if you still have any doubts.
Cheers!!!
ArrayList allows dynamically adding and removing the elements in this list. So question comes HOW?
By default initial capacity of an array is defined with constant DEFAULT_CAPACITY
private static final int DEFAULT_CAPACITY = 10;
If we closely look at the add method in the source code of ArrayList.java. Click here to get whole file.
public boolean add(E e) { ensureCapacity(size+1); elementData[size++] = e; return true; }
We can see in above code that before adding the element into the ArrayList its calling one method named “ensureCapacity”. This method makes sure what is the current size of the existing elements containing in the array and what is the maximum allowed size for the array at this point of time?
So if we are trying to add more element than its maximum allowed size then maximum allowed size needs to be increased in order to accommodate new elements.
But here we must notice that “elementData” is an array only and array does not grow dynamically.
private transient Object[] elementData;
Here is the main thing to notice
Internally new array is created with new capacity and then elements from existing array are copied to the new array with bigger capacity.
elementData = Arrays.copyOf(elementData, newCapacity);
New capacity is calculated with below expression:
int newCapacity = (oldCapacity * 3)/2 + 1;
If you want to see this happening, You can try to execute the below code snippet in debug mode and monitor elementData array as shown in below figure.
package com.javageekzone.collection; import java.util.ArrayList; import java.util.List; public class ArrayListExample { public static void main(String[] args) { List list = new ArrayList(); for (int counter = 1; counter < 1000; counter++) { list.add(counter); } } }
I hope you now know how the size of ArrayList grows dynamically. Please let me know by comments if you still have any doubts.
Cheers!!!
Monday, 26 October 2015
In most of the interviews of Java, We are often checked with the in depth knowledge of Collection APIs and its capabilities.
One of the very famous interview questions is: Why Set does not allow duplicate value?
Now, don’t tell me you were also asked the same
We all know Set theory in mathematics that all elements in Set are always unique. The same has been applied to the Set API. Let’s try to understand this with very small java code snippet.
Basically I want to add elements in Set where I want to try adding some duplicates as well as shown below.
In above code we are invoking add method to insert the element. Let’s see the source code of this method in the class HashSet.java.
Above code is part of rt.jar file in your jre under java/util package. Click here to get full code.
You can see below facts in the HashSet.java
One of the very famous interview questions is: Why Set does not allow duplicate value?
Now, don’t tell me you were also asked the same
We all know Set theory in mathematics that all elements in Set are always unique. The same has been applied to the Set API. Let’s try to understand this with very small java code snippet.
Basically I want to add elements in Set where I want to try adding some duplicates as well as shown below.
package com.javageekzone.collection; import java.util.HashSet; import java.util.Set; public class DuplicateSetElements { public static void main(String[] args) { Set subjects=new HashSet(); subjects.add("Spring"); subjects.add("Java"); subjects.add("Oracle"); System.out.println("Subjects: "+subjects); subjects.add("Java"); subjects.add("Cobol"); subjects.add("Spring"); System.out.println("Subjects: "+subjects); } }
In above code we are invoking add method to insert the element. Let’s see the source code of this method in the class HashSet.java.
public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable { private transient HashMap<E,Object> map; // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); public HashSet() { map = new HashMap<>(); } // More Code goes here ,i.e Other methods in Hash Set public boolean add(E e) { return map.put(e, PRESENT)==null; } // More Code goes here ,i.e Other methods in Hash Set }
Above code is part of rt.jar file in your jre under java/util package. Click here to get full code.
You can see below facts in the HashSet.java
- When you instantiate HashSet it’s actually instantiating HashMap in the constructor
- PRESENT is the member variable of the HashSet which is instantiated with type Object and it acts as dummy value which it passes to put method.
- In the add method implementation internally its calling put method of the HashMap.
- put method is considering actual value passed in add method as key and PRESENT as value.
So if I try to add the element “java” by add method.
subject.add(“java”)
It will put that element E here “java” as a key in the HashMap and the dummy value PRESENT as a value to the key.
Now if you look at the code of the HashMap’s put(Key k,Value V) method , you will see put method something like this
public V put(K key, V value)
{
//Some code goes here
}
Here we can notice that put (key,value) will
- return NULL if the key is unique and the element is added to the map.
- return old value of the key if key is duplicate.
Hence , in HashSet add() method , it check the return value of map.put(key,value) method with null value i.e
public boolean add(E e)
{
return map.put(e, PRESENT)==null;
}
So , if map.put(key,value) returns null ,then
map.put(e, PRESENT)==null will return true and element is added to the HashSet.
So, if map.put(key,value) returns old value of the key ,then
map.put(e, PRESENT)==null will return false and element is not added to the HashSet .
Conclusion: HashSet internally utilize HashMap to facilitate the storage and uniqueness of the element.
I hope you are clear with this internal mechanism now. If you still have any doubt please feel free to contact me.
Cheers!!!
Friday, 23 October 2015
Below are few Eclipse shortcuts which can make your life easier/faster to work with it.
1. Manage Files and Projects | |
Ctrl+N | Create new project using the Wizard |
Ctrl+Alt+N | Create new project, file, class, etc. |
Alt+f, then . | Open project, file, etc. |
Ctrl+Shift+R | Open Resource (file, folder or project) |
Alt+Enter | Show and access file properties |
Ctrl+S | Save current file |
Ctrl+Shift+S | Save all files |
Ctrl+W | Close current file |
Ctrl+Shift+W | Close all files |
F5 | Refresh content of selected element with local file system |
2. Editor Window | |
Focus/ cursor must be in Editor Window for these to work. | |
F12 | Jump to Editor Window |
Ctrl+Page Down/Ctrl+Page Up | Switch to next editor / switch to previous editor |
Ctrl+M | Maximize or un-maximize current Editor Window (also works for other Windows) |
Ctrl+E | Show list of open Editors. Use arrow keys and enter to switch |
Ctrl+F6/Ctrl+Shift+F6 | Show list of open Editors. Similar to ctrl+e but switches immediately upon release of ctrl |
Alt+Arrow Left/Alt+Arrow Right | Go to previous / go to next Editor Window |
Alt+- | Open Editor Window Option menu |
Ctrl+F10 | Show view menu (features available on left vertical bar: breakpoints, bookmarks, line numbers, …) |
Ctrl+F10, then n | Show or hide line numbers |
Ctrl+Shift+Q | Show or hide the diff column on the left (indicates changes since last save) |
3. Navigate in Editor | |
Home/End | Jump to beginning / jump to end of indention. Press home twice to jump to beginning of line |
Ctrl+Home/End | Jump to beginning / jump to end of source |
Ctrl+Arrow Right/Arrow Left | Jump one word to the left / one word to the right |
Ctrl+Shift+Arrow Down/Arrow Up | Jump to previous / jump to next method |
Ctrl+L | Jump to Line Number. To hide/show line numbers, press ctrl+F10 and select 'Show Line Numbers' |
Ctrl+Q | Jump to last location edited |
Ctrl+./Ctrl+, | Jump to next / jump to previous compiler syntax warning or error |
Ctrl+Shift+P | With a bracket selected: jump to the matching closing or opening bracket |
Ctrl+[+]/Ctrl+- on numeric keyboard | Collapse / Expand current method or class |
Ctrl+[/]/Ctrl+* on numeric keyboard | Collapse / Expand all methods or classes |
Ctrl+Arrow Down/Ctrl+Arrow Up | Scroll Editor without changing cursor position |
Alt+Page Up/Alt+Page Down | Next Sub-Tab / Previous Sub-Tab |
4. Select Text | |
Shift+Arrow Right/Arrow Left | Expand selection by one character to the left / to the right |
Ctrl+Shift+Arrow Right/Arrow Left | Expand selection to next / previous word |
Shift+Arrow Down/Arrow Up | Expand selection by one line down / one line up |
Shift+End/Home | Expand selection to end / to beginning of line |
Ctrl+A | Select all |
Alt+Shift+Arrow Up | Expand selection to current element (e.g. current one-line expression or content within brackets) |
Alt+Shift+Arrow Left/Arrow Right | Expand selection to next / previous element |
Alt+Shift+Arrow Down | Reduce previously expanded selection by one step |
5. Edit Text | |
Ctrl+C/Ctrl+X/Ctrl+V | Cut, copy and paste |
Ctrl+Z | Undo last action |
Ctrl+Y | Redo last (undone) action |
Ctrl+D | Delete Line |
Alt+Arrow Up/Arrow Down | Move current line or selection up or down |
Ctrl+Alt+Arrow Up/Ctrl+Alt+Arrow Down/ | Duplicate current line or selection up or down |
Ctrl+Delete | Delete next word |
Ctrl+Backspace | Delete previous word |
Shift+Enter | Enter line below current line |
Shift+Ctrl+Enter | Enter line above current line |
Insert | Switch between insert and overwrite mode |
Shift+Ctrl+Y | Change selection to all lower case |
Shift+Ctrl+X | Change selection to all upper case |
6. Search and Replace | |
Ctrl+F | Open find and replace dialog |
Ctrl+K/Ctrl+Shift+K | Find previous / find next occurrence of search term (close find window first) |
Ctrl+H | Search Workspace (Java Search, Task Search, and File Search) |
Ctrl+J/Ctrl+Shift+J | Incremental search forward / backwards. Type search term after pressing ctrl+j, there is now search window |
Ctrl+Shift+O | Open a resource search dialog to find any class |
7. Indentions and Comments | |
Tab/Shift+Tab | Increase / decrease indent of selected text |
Ctrl+I | Correct indention of selected text or of current line |
Ctrl+Shift+F | Autoformat all code in Editor using code formatter |
Ctrl+/ | Comment / uncomment line or selection ( adds '//' ) |
Ctrl+Shift+/ | Add Block Comment around selection ( adds '/... */' ) |
Ctrl+Shift+\ | Remove Block Comment |
Alt+Shift+J | Add Element Comment ( adds '/** ... */') |
8. Editing Source Code | |
Ctrl+Space | Opens Content Assist (e.g. show available methods or field names) |
Ctrl+1 | Open Quick Fix and Quick Assist |
Alt+/ | Propose word completion (after typing at least one letter). Repeatedly press alt+/ until reaching correct name |
Ctrl+Shift+Insert | Deactivate or activate Smart Insert Mode (automatic indention, automatic brackets, etc.) |
9. Code Information | |
Ctrl+O | Show code outline / structure |
F2 | Open class, method, or variable information (tooltip text) |
F3 | Open Declaration: Jump to Declaration of selected class, method, or parameter |
F4 | Open Type Hierarchy window for selected item |
Ctrl+T | Show / open Quick Type Hierarchy for selected item |
Ctrl+Shift+T | Open Type in Hierarchy |
Ctrl+Alt+H | Open Call Hierarchy |
Ctrl+U | Find occurrences of expression in current file |
Ctrl+move over method | Open Declaration or Implementation |
10. Refactoring | |
Alt+Shift+R | Rename selected element and all references |
Alt+Shift+V | Move selected element to other class or file (With complete method or class selected) |
Ctrl+Shift+C | Change method signature (with method name selected) |
Alt+Shift+M | Extract selection to method |
Alt+Shift+L | Extract local variable: Create and assigns a variable from a selected expression |
Alt+Shift+I | Inline selected local variables, methods, or constants if possible (replaces variable with its declarations/ assignment and puts it directly into the statements) |
11. Run and Debug | |
Ctrl+F11 | Save and launch application (run) |
F11 | Debug |
F5 | Step Into function |
F6 | Next step (line by line) |
F7 | Step out |
F8 | Skip to next Breakpoint |
12. The Rest | |
Ctrl+F7/Ctrl+Shift+F7 | Switch forward / backward between views (panels). Useful for switching back and forth between Package Explorer and Editor. |
Ctrl+F8/Ctrl+Shift+F8 | Switch forward / backward between perspectives |
Ctrl+P | |
F1 | Open Eclipse Help |
Shift+F10 | Show Context Menu right click with mouse |
13. Team (SVN Subversive) | |
Ctrl+Alt+S | Synchronize with Repository |
Ctrl+Alt+C | Commit |
Ctrl+Alt+U | Update |
Ctrl+Alt+D | Update to Revision |
Ctrl+Alt+E | Merge |
Ctrl+Alt+T | Show Properties |
Ctrl+Alt+I | Add to svn:ignore |
Often we write the code and import the classes in the import section of the class file.
Code never stays unchanged for lifetime as change is the
only constant thing in programming.
Many times, after code refactoring or bug fixed, Eclipse IDE
will show a yellow underline for all unused imports at the top of your class
and said “The import xxx is never used“
When we change the code sometimes we forget to remove the
old imported classes under import section. Keeping something which is never
used in code is not considered a good practice.
Eclipse provides multiple options to get rid of those unused
imports. I will explain all the options available in eclipse to achieve this.
Option-1
This option is not much useful as it only works for single
line and not for all unused import in whole class.
- Open your class file
- Go to the line of unused import
- Press ctrl + 1 which is a eclipse shortcut of quick fix, this will display a drop down menu to fix this and you will see an option "remove unused imports"
- Click on "remove unused imports"
Option-2
This option will remove all unused imports from whole class.
- Open your class file
- Right click on code area
- Go to “Source”
- Click on “Organize Imports”
Option-3
This option will also remove all unused imports from whole
class.
- Open your class file
- Press Shift + Ctrl + O for PC or Command + Shift + O for Mac
Advance Options :
Option-4
This option will allow you to remove all unused imports when you save your class file
- Click on “Window”
- Click on “Preferences”
- Select & Expand “Java”
- Select & Expand “Editor”
- Click on “Save Actions”
- Check the option “Perform the selected actions on save”
- Check the option “Organize Imports”
- Click on “Apply” in Preference window
- Click on “OK” in Preference window
Above option also allows you to set preference for formatting source code and invoking other additional actions.
Option-5
This option will allow you to remove all unused imports from all class files of your package. It’s very nice and efficient option to achieve this in one go.
- Go to “Project Explorer”
- Right click on your package
- Go to “Source”
- Click on “Organize Imports”
Option-6
This option will allow you to remove all unused imports from all class files of your package/project. You can configure this setting in Eclipse [built-in] profile or you can create your own profile for the same. I will show you by creating your own profile and configuring it.
Configuration Actions:
- Click on “Window”
- Click on “Preferences”
- Select & Expand “Java”
- Select & Expand “Code Style”
- Click on “Clean Up”
- Click on “New”
- Enter the “Profile Name” of your choice
- Click on “OK”
- Go to Tab “Code Organizing”
- Check the option “Organize Imports”
- Click on “Apply” in profile window
- Click on “OK” in profile window
- Click on “Apply” in preference window
- Click on “OK” in preference window
Executing Actions:
- Go to “Project Explorer”
- Right click on your package
- Go to “Source”
- Click on “Clean Up”
- Choose a profile you configured.
- Click on “Next”
- Click on “Finish”
I hope these options will make your life easier to work with eclipse and make code neat and cleaner.
I will come up with more eclipse tips soon till then happy coding…
Cheers!!!
Subscribe to:
Posts (Atom)