Skip to main content

Best Way to use ArrayList in Java

                     In the following post we are goning to discuss a little variation in use of ArrayList in java. We will see how we can improve the performance by just a small change. First of all run the below java code on your machine.

import java.util.ArrayList;
import java.util.List;

public class Test{
 
 public static void main(String... args) {

  int s = 10000000;
  String v = "PROGRAMMING";
  long t1,t2;

  //Segment-1
  t1 = System.currentTimeMillis();
  List<String> l1 = new ArrayList<>();
  for(int i=0; i<s; ++i){
   l1.add(v);
  }
  t2 = System.currentTimeMillis();
  System.out.println("Time for above segment-1 : "+(t2-t1)+" ms");

  //Segment-2
  t1 = System.currentTimeMillis();
  List<String> l2 = new ArrayList<>(s);
  for(int i=0; i<s; ++i){
   l2.add(v);
  }
  t2 = System.currentTimeMillis();
  System.out.println("Time for above segment-2 : "+(t2-t1)+" ms");
 }

}

I executed it on my machine and got the following result. I hope you would also got the similar output.

Time for above segment-1 : 115 ms
Time for above segment-2 : 39 ms

Despite the execution time difference between the two code segments. You will always found that time taken by segment-1 is greater than segment-2. If you will look both code segments carefully You will find only one minute difference in Constructor. In the first segment: No argument in constructor

List<String> l1 = new ArrayList<>();
In the second segment: Capacity passed in constructor
List<String> l1 = new ArrayList<>(s);

When We don't pass capacity in ArrayList it initialize with capacity=10. Every time the ArrayList reached to limit It has to resize the array. There is a grow() method used in ArrayList.java class to expand the array. Internal logic of the grow() method

(1) newCapacity = oldCapacity + (oldCapacity/2)
(2) create a new array of newCapcity.
(3) Copy the elements of old Array to new Array.

The below code snipet are from the ArrayList.java class

/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;

/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
 // overflow-conscious code
 int oldCapacity = elementData.length;
 int newCapacity = oldCapacity + (oldCapacity >> 1);
 if (newCapacity - minCapacity < 0)
     newCapacity = minCapacity;
 if (newCapacity - MAX_ARRAY_SIZE > 0)
     newCapacity = hugeCapacity(minCapacity);
 // minCapacity is usually close to size, so this is a win:
 elementData = Arrays.copyOf(elementData, newCapacity);
}
 

So every time the ArrayList reach to limit, costly operation grow() method called. If you have an estimate of capacity of list requirement, you can pass it as argument in the constructor of ArrayList.


Comments

Popular posts from this blog

How to Create a Namespace in Aerospike Database

                      T his post is about creating a namespace in Aerospike. I could not find any concrete method to create a namespace like create database in MySQL and MongoDB. So I am suggesting a way to create a namespace in Aerospike Database. Step-1: Locate config file aerospike.conf and open it in your favorite editor and make sure you have permission to modify the file. In my system the path of file /etc/aerospike/aerospike.conf (Default in Ubuntu). Here the content of the file. # Aerospike database configuration file. service { user root group root paxos-single-replica-limit 1 # Number of nodes where the replica pidfile /var/run/aerospike/asd.pid service-threads 4 transaction-queues 4 transaction-threads-per-queue 4 proto-fd-max 15000 } logging { # Log file must be an absolute path. file /var/log/aerospike/aerospike.log { context any info } } network { service { address any port 3000 } heartbeat { mode multicast address 239.1.99.222 p

java.lang.IllegalArgumentException: Could not instantiate implementation: org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager

If you are trying to get started with Janus Graph with Apache Cassandra. You may get the following error. Caused by: org.janusgraph.diskstorage.TemporaryBackendException: Temporary failure in storage backend at org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager.getCassandraPartitioner(CassandraThriftStoreManager.java:219) ~[janusgraph-cassandra-0.2.0.jar:na] at org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager.<init>(CassandraThriftStoreManager.java:198) ~[janusgraph-cassandra-0.2.0.jar:na] ... 48 common frames omitted Caused by: org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused (Connection refused) at org.apache.thrift.transport.TSocket.open(TSocket.java:187) ~[libthrift-0.9.2.jar:0.9.2] at org.apache.thrift.transport.TFramedTransport.open(TFramedTransport.java:81) ~[libthrift-0.9.2.jar:0.9.2] at org.janusgraph.diskstorage.cassandra.thrift.thriftpool.CTConnectionFactory.makeR

com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server

If you are trying to connect Mongo DB Server and it insanely throwing following error. com.mongodb.MongoTimeoutException : Timed out after 1000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=192.168.1.10:27010, type=UNKNOWN, state=CONNECTING, exception={ com.mongodb.MongoSecurityException: Exception authenticating MongoCredential {mechanism=null, userName='user123', source='admin', password=<hidden>, mechanismProperties={}}}, caused by {com.mongodb.MongoCommandException: Command failed with error 18 : 'Authentication failed.' on server 192.168.1.10:27010 . The full response is { "ok" : 0.0, "code" : 18, "errmsg" : "Authentication failed." }}}] If you start looking the error content First you encounter with Timeout Exception which may mislead you. It is basically an authentication error. I