Thursday, April 19, 2012

Features of JAVA 1.7

Java 1.7 - What's new? Release date, code examples and performance

[10 Apr 10 at 09:17:26 - 53 comment(s)]
I have been reading quite a lot about Java 1.7. There are articles about what's new, some code examples, some benchmark to compare performance with previous version of Java and discussion on when it will be released. I have decided to regroup all I have discovered in this article so that I and maybe you, won't have to spend hours surfing the web to find all this information. Don't hesitate to leave a comment if I missed something.

What's new in Java 1.7?

First thing first. To determine what set of small language changes should be added to JDK 7, a project has been set up called Project Coin. The final five changes (bit more than 5) are described on the following blog entry of Joseph D. Darcy.
So what made it through is the following:
  • Strings in switch
  • Automatic Resource Management
  • Improved Type Inference for Generic Instance Creation (diamond)
  • Simplified Varargs Method Invocation
  • An omnibus proposal for better integral literals
  • Language support for Collections
  • Language support for JSR 292
There is a list of other features available on the OpenJDK 7 features page.
These features are divided in different categories:

VM
  • Compressed 64-bit object pointers
  • Garbage-First GC (G1)
  • JSR 292: VM support for non-Java languages (InvokeDynamic)

lang
  • SR 294: Language and VM support for modular programming
  • JSR 308: Annotations on Java types
  • JSR TBD: Small language enhancements (the Project Coin I was talking about)
  • JSR TBD: Project Lambda

core
  • Modularization (Project Jigsaw)
  • Upgrade class-loader architecture
  • Method to close a URLClassLoader
  • Unicode 5.1
  • Concurrency and collections updates (jsr166y)
  • JSR 203: More new I/O APIs for the Java platform (NIO.2)
  • SCTP (Stream Control Transmission Protocol)
  • SDP (Sockets Direct Protocol)
  • Elliptic-curve cryptography (ECC)

client
  • XRender pipeline for Java 2D
  • Forward-port 6u10 deployment features
  • Create new platform APIs for 6u10 graphics features
  • Nimbus look-and-feel for Swing
  • Swing JLayer component

web
  • Update the XML stack
As you can see there is a lot of stuff. I personally tried the new Garbage Collector (G1) a few months back and was really impressed by the performance. Unfortunately the JVM was crashing every few hours so it couldn't be used for production. This GC is available in Java 1.6 as well but same thing, it crashes every so often.
I think that's it for the new features. Maybe it's a good idea to see some code examples now.

Code examples for new features in Java 1.7

Most of what is below come from the excellent article from Joe Wright on his blog about New language features in Java 7

Language support for collections

This is all about writing less code when you create a List, a Set or a Map. You don't have to instantiate the Object and then add the element to the Collection. You can now do it in 1 line.
List list = ["item"];
String item = list[0];

Set set = {"item"};

Map map = {"key" : 1};
int value = map["key"];

Automatic Resource Management

Annoyed to have verbose code because of try / catch statement. You will love this one.
Indeed, this:
BufferedReader br = new BufferedReader(new FileReader(path));
try {
   return br.readLine();
} finally {
   br.close();
}
Become this:
try (BufferedReader br = new BufferedReader(new FileReader(path)) {
   return br.readLine();
}

Improved Type Inference for Generic Instance Creation (diamond)

Same thing, today you specify the Generic when you declare the interface of your object and then you have to repeat yourself when you instantiate the object. You won't have to now as you can do:
Map> map = new HashMap<>();

Underscores in numeric literals

Not sure this one will be useful to lot of people. You can do:
int billion = 1_000_000_000;

Strings in switch

Nothing to explain here, the title says it all.
String availability = "available";
switch(availability) {
 case "available":
    //code
    break;

  case "unavailable":
    //code
    break;

  case "merged":
    //code

  default:
    //code
    break;
}

Binary literals

You can create binary literals using the 0b prefix
int binary = 0b1001_1001;

That's it for the code examples. It would be great if someone can point me on more things. I am sure there are plenty of other cool stuff.

Performance of Java 1.7

I have picked up the tests I ran from an article from Taranfx posted here.
So the tests are the following (my code, not his but I followed the same ideas). I ran all of this on a Macbook Pro running ArchLinux (the one with an Intel(R) Core(TM)2 Duo CPU T7700 @ 2.40GHz. I think 2 years old). I have 2Gb of RAM. I set the Heap Size to 728m (-Xms728m -Xmx728m).
Test 1. Add 1 Million String values to a List (the String is a UUID generated using UUID.randomUUID()).
Test 2. HashMap with 1 million keys, values. Each key, value pair is being calculated via concurrent thread. The key is a UUID and the int is generated using Math.random()
Test 3. Printing 1 million items of ArrayList to number of Files (1000). Writing to different files happening in parallel.
I am just comparing Java 1.6 (1.6.0_19) vs Java 1.7 (b87). I added Java 1.5 to this benchmark following a request in the comments but not Java 1.4 as it is from an other age to me.
So here is the result
Performance benchmark Java 1.5 vs Java 1.6 vs Java 1.7

Java 1.5Java 1.6Java 1.7
Test 110,698 sec9,481 sec9,328 sec
Test 269,827 sec37,935 sec36,636 sec
Test 326,931 sec30,868 sec27,383 sec
The difference of performance is clearly not as big as it is in the article of Taranfx. It appears that our implementation of his tests are probably quite different as well as my tests are taking a lot more time than his.

Release date of Java 1.7

In November 2009, it was planned to be in September 2010 as there would be 3 more milestones. Milestone 6 was completed with build 84. b85 was scheduled for the 4th of March 2010, first build of Milestone 7. b87 used in this article has been released the 25th of March 2010. So it looks like a release for September 2010 is more than likely. Though I have been reading an interesting subject on the stackoverflow forum here. You can check the blog of Alex Miller as well. He publishes links to all blog and news items referring to the progress of Java7

What are the new features in JDBC 4.1 of Java 1.7?

JDBC 4.1 becomes part of Java 1.7 / Java SE 7. The upcoming JDBC 4.1 will have two new features when compared to JDBC 4.0 and earlier versions. They are:
Usage of try-with-resources Statement: In JDBC 4.1, the statement try-with-resources can be used to close the JDBC resources automatically. Using this try-with-resources, the objects of type java.sql.connection, java.sql.ResultSet and java.sql.statement can be automatically closed. Example of try-with-resources in JDBC 4.1 is:
public static void sampleQueryProcessing(Connection sampleCon) throws SQLException {
     String sampleQuery = "select ROLLNO, NAME, ADDRESS from STUDENT";
     try (Statement sampleStmt = sampleCon.createStatement()) 
 
   {
       ResultSet sampleResultSet = sampleStmt.executeQuery(sampleQuery);
       while (rs.next()) 
 
      {
            int rollNo = sampleResultSet.getInt("ROLLNO");
            String studentName = sampleResultSet.getString("NAME");
            String studentAddress = sampleResultSet.getString("ADDRESS");
            System.out.println(“ROLLNO:” + rollNo + " NAME: " + studentName + "
                     ADDRESS: " + studentAddress);
      }
    }
  } 
In this Java code snippet, a method called sampleQueryProcessing processes a query to retrieve records from STUDENT table of Oracle database. Notice the difference in try statement.
The try statement “try (Statement sampleStmt = sampleCon.createStatement())” is an example of the try-with-resources statement in JDBC 4.1. In this line of code, a new Statement instance called sampleStmt is created within the try statement. When the try block terminates, the object sampleStmt will be automatically closed.
RowSetFactoryInterface and RowSetProviderClass: The JDBC 4.1 belonging to Java 1.7 / Java 7 introduces a new interface called RowSetFactoryInterface and a new class called RowSetProvider class using which any types of row sets that are supported by the JDBC Driver can be created. Example of RowSetFactory and RowSetProvider is:
public void sampleMethod(String sampleUserName, String samplePassword) throws SQLException  
{
               RowSetFactory sampleRowSetFactory = null;
               JdbcRowSet sampleRowSet = null;
                   try 
 
               {
                               sampleRowSetFactory = RowSetProvider.newFactory();
                               sampleRowSet = sampleRowSetFactory.createJdbcRowSet();
                               sampleRowSet.setUrl("jdbc:sampleDriver:sampleAttribute");
                               sampleRowSet.setUsername(sampleUserName);
                               sampleRowSet.setPassword(samplePassword);
                               sampleRowSet.setCommand(""select ROLLNO, NAME, ADDRESS 
 
                                              from STUDENT");
                               sampleRowSet.execute();
                              // …
               }
               catch(Exception e)
               {
               }
}
Here the object sampleRowSetFactory of the interface RowSetFactory is initially set to null. Then inside try block, the object is instantiated using:
sampleRowSetFactory = RowSetProvider.newFactory();
The object is thus assigned with default implementation of RowSetFactory namely com.sun.rowset.RowSetFactoryImpl. If the JDBC Driver has any RowSetFactory Implementation defined, then that can be used instead of newFactory. When sampleRowSetFactory is instantiated, it can be used to create an object of JDBCRowSet and configure its database connection properties.
When Java 1.7 is released, these two features will be extensively used in JDBC 4.1

No comments:

Post a Comment