diff --git a/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java
index b1fd223..1a4b212 100644
--- a/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/arj/ArjArchiveInputStream.java
@@ -248,7 +248,7 @@
         localFileHeader.name = readString(basicHeader);
         localFileHeader.comment = readString(basicHeader);
 
-        final ArrayList<byte[]> extendedHeaders = new ArrayList<byte[]>();
+        final ArrayList<byte[]> extendedHeaders = new ArrayList<>();
         int extendedHeaderSize;
         while ((extendedHeaderSize = read16(in)) > 0) {
             final byte[] extendedHeaderBytes = new byte[extendedHeaderSize];
diff --git a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java
index eb51484..105e86c 100644
--- a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java
@@ -77,7 +77,7 @@
     private final short entryFormat;
 
     private final HashMap<String, CpioArchiveEntry> names =
-        new HashMap<String, CpioArchiveEntry>();
+        new HashMap<>();
 
     private long crc = 0;
 
diff --git a/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveEntry.java b/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveEntry.java
index caeb25a..47e53ce 100644
--- a/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveEntry.java
+++ b/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveEntry.java
@@ -823,7 +823,7 @@
         }
 
         public static Set<PERMISSION> find(final int code) {
-            final Set<PERMISSION> set = new HashSet<PERMISSION>();
+            final Set<PERMISSION> set = new HashSet<>();
 
             for (final PERMISSION p : PERMISSION.values()) {
                 if ((code & p.code) == p.code) {
diff --git a/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java
index 23d7245..f2d82ef 100644
--- a/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/dump/DumpArchiveInputStream.java
@@ -63,10 +63,10 @@
     protected TapeInputStream raw;
 
     // map of ino -> dirent entry. We can use this to reconstruct full paths.
-    private final Map<Integer, Dirent> names = new HashMap<Integer, Dirent>();
+    private final Map<Integer, Dirent> names = new HashMap<>();
 
     // map of ino -> (directory) entry when we're missing one or more elements in the path.
-    private final Map<Integer, DumpArchiveEntry> pending = new HashMap<Integer, DumpArchiveEntry>();
+    private final Map<Integer, DumpArchiveEntry> pending = new HashMap<>();
 
     // queue of (directory) entries where we now have the full path.
     private Queue<DumpArchiveEntry> queue;
@@ -136,7 +136,7 @@
 
         // use priority based on queue to ensure parent directories are
         // released first.
-        queue = new PriorityQueue<DumpArchiveEntry>(10,
+        queue = new PriorityQueue<>(10,
                 new Comparator<DumpArchiveEntry>() {
                     @Override
                     public int compare(final DumpArchiveEntry p, final DumpArchiveEntry q) {
@@ -415,7 +415,7 @@
     private String getPath(final DumpArchiveEntry entry) {
         // build the stack of elements. It's possible that we're 
         // still missing an intermediate value and if so we
-        final Stack<String> elements = new Stack<String>();
+        final Stack<String> elements = new Stack<>();
         Dirent dirent = null;
 
         for (int i = entry.getIno();; i = dirent.getParentIno()) {
diff --git a/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java b/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java
index 5cffd0d..6b1975a 100644
--- a/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java
+++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/Folder.java
@@ -52,7 +52,7 @@
      * from the output of the first and so on.</p>
      */
     Iterable<Coder> getOrderedCoders() {
-        final LinkedList<Coder> l = new LinkedList<Coder>();
+        final LinkedList<Coder> l = new LinkedList<>();
         int current = (int) packedStreams[0]; // more that 2^31 coders?
         while (current != -1) {
             l.addLast(coders[current]);
diff --git a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZArchiveEntry.java b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZArchiveEntry.java
index 098e306..63db4cb 100644
--- a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZArchiveEntry.java
+++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZArchiveEntry.java
@@ -455,7 +455,7 @@
      */
     public void setContentMethods(final Iterable<? extends SevenZMethodConfiguration> methods) {
         if (methods != null) {
-            final LinkedList<SevenZMethodConfiguration> l = new LinkedList<SevenZMethodConfiguration>();
+            final LinkedList<SevenZMethodConfiguration> l = new LinkedList<>();
             for (final SevenZMethodConfiguration m : methods) {
                 l.addLast(m);
             }
diff --git a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java
index 1056840..c3d8e6a 100644
--- a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java
+++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java
@@ -77,7 +77,7 @@
     private InputStream currentFolderInputStream = null;
     private byte[] password;
 
-    private final ArrayList<InputStream> deferredBlockStreams = new ArrayList<InputStream>();
+    private final ArrayList<InputStream> deferredBlockStreams = new ArrayList<>();
 
     static final byte[] sevenZSignature = {
         (byte)'7', (byte)'z', (byte)0xBC, (byte)0xAF, (byte)0x27, (byte)0x1C
@@ -868,7 +868,7 @@
             new BufferedInputStream(
               new BoundedRandomAccessFileInputStream(file,
                   archive.packSizes[firstPackStreamIndex]));
-        final LinkedList<SevenZMethodConfiguration> methods = new LinkedList<SevenZMethodConfiguration>();
+        final LinkedList<SevenZMethodConfiguration> methods = new LinkedList<>();
         for (final Coder coder : folder.getOrderedCoders()) {
             if (coder.numInStreams != 1 || coder.numOutStreams != 1) {
                 throw new IOException("Multi input/output stream coders are not yet supported");
diff --git a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZOutputFile.java b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZOutputFile.java
index bbd5549..c2c0171 100644
--- a/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZOutputFile.java
+++ b/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZOutputFile.java
@@ -44,7 +44,7 @@
  */
 public class SevenZOutputFile implements Closeable {
     private final RandomAccessFile file;
-    private final List<SevenZArchiveEntry> files = new ArrayList<SevenZArchiveEntry>();
+    private final List<SevenZArchiveEntry> files = new ArrayList<>();
     private int numNonEmptyStreams = 0;
     private final CRC32 crc32 = new CRC32();
     private final CRC32 compressedCrc32 = new CRC32();
@@ -54,7 +54,7 @@
     private CountingOutputStream[] additionalCountingStreams;
     private Iterable<? extends SevenZMethodConfiguration> contentMethods =
             Collections.singletonList(new SevenZMethodConfiguration(SevenZMethod.LZMA2));
-    private final Map<SevenZArchiveEntry, long[]> additionalSizes = new HashMap<SevenZArchiveEntry, long[]>();
+    private final Map<SevenZArchiveEntry, long[]> additionalSizes = new HashMap<>();
     
     /**
      * Opens file to write a 7z archive to.
@@ -280,7 +280,7 @@
         }
 
         OutputStream out = new OutputStreamWrapper();
-        final ArrayList<CountingOutputStream> moreStreams = new ArrayList<CountingOutputStream>();
+        final ArrayList<CountingOutputStream> moreStreams = new ArrayList<>();
         boolean first = true;
         for (final SevenZMethodConfiguration m : getContentMethods(files.get(files.size() - 1))) {
             if (!first) {
@@ -730,7 +730,7 @@
     }
 
     private static <T> Iterable<T> reverse(final Iterable<T> i) {
-        final LinkedList<T> l = new LinkedList<T>();
+        final LinkedList<T> l = new LinkedList<>();
         for (final T t : i) {
             l.addFirst(t);
         }
diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
index e542c64..f03e968 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStream.java
@@ -79,7 +79,7 @@
     final String encoding;
 
     // the global PAX header
-    private Map<String, String> globalPaxHeaders = new HashMap<String, String>();
+    private Map<String, String> globalPaxHeaders = new HashMap<>();
 
     /**
      * Constructor for TarInputStream.
@@ -451,7 +451,7 @@
     // https://www.gnu.org/software/tar/manual/html_section/tar_92.html#SEC188
     Map<String, String> parsePaxHeaders(final InputStream i)
         throws IOException {
-        final Map<String, String> headers = new HashMap<String, String>(globalPaxHeaders);
+        final Map<String, String> headers = new HashMap<>(globalPaxHeaders);
         // Format is "length keyword=value\n";
         while(true){ // get length
             int ch;
diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
index af5c307..3d34e96 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
@@ -275,7 +275,7 @@
             throw new IOException("Stream has already been finished");
         }
         final TarArchiveEntry entry = (TarArchiveEntry) archiveEntry;
-        final Map<String, String> paxHeaders = new HashMap<String, String>();
+        final Map<String, String> paxHeaders = new HashMap<>();
         final String entryName = entry.getName();
         final boolean paxHeaderContainsPath = handleLongName(entry, entryName, paxHeaders, "path",
                                                        TarConstants.LF_GNUTYPE_LONGNAME, "file name");
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtils.java b/src/main/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtils.java
index ea7b6e7..c4d07f4 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtils.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtils.java
@@ -38,7 +38,7 @@
     private static final Map<ZipShort, Class<?>> implementations;
 
     static {
-        implementations = new ConcurrentHashMap<ZipShort, Class<?>>();
+        implementations = new ConcurrentHashMap<>();
         register(AsiExtraField.class);
         register(X5455_ExtendedTimestamp.class);
         register(X7875_NewUnix.class);
@@ -135,7 +135,7 @@
     public static ZipExtraField[] parse(final byte[] data, final boolean local,
                                         final UnparseableExtraField onUnparseableData)
         throws ZipException {
-        final List<ZipExtraField> v = new ArrayList<ZipExtraField>();
+        final List<ZipExtraField> v = new ArrayList<>();
         int start = 0;
         LOOP:
         while (start <= data.length - WORD) {
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/PKWareExtraHeader.java b/src/main/java/org/apache/commons/compress/archivers/zip/PKWareExtraHeader.java
index 89bebd1..5436ccf 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/PKWareExtraHeader.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/PKWareExtraHeader.java
@@ -216,7 +216,7 @@
         private static final Map<Integer, EncryptionAlgorithm> codeToEnum;
 
         static {
-            final Map<Integer, EncryptionAlgorithm> cte = new HashMap<Integer, EncryptionAlgorithm>();
+            final Map<Integer, EncryptionAlgorithm> cte = new HashMap<>();
             for (final EncryptionAlgorithm method : values()) {
                 cte.put(Integer.valueOf(method.getCode()), method);
             }
@@ -271,7 +271,7 @@
         private static final Map<Integer, HashAlgorithm> codeToEnum;
 
         static {
-            final Map<Integer, HashAlgorithm> cte = new HashMap<Integer, HashAlgorithm>();
+            final Map<Integer, HashAlgorithm> cte = new HashMap<>();
             for (final HashAlgorithm method : values()) {
                 cte.put(Integer.valueOf(method.getCode()), method);
             }
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java b/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java
index 43a56a4..de437b1 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java
@@ -55,7 +55,7 @@
     private final List<ScatterZipOutputStream> streams = synchronizedList(new ArrayList<ScatterZipOutputStream>());
     private final ExecutorService es;
     private final ScatterGatherBackingStoreSupplier backingStoreSupplier;
-    private final List<Future<Object>> futures = new ArrayList<Future<Object>>();
+    private final List<Future<Object>> futures = new ArrayList<>();
 
     private final long startedAt = System.currentTimeMillis();
     private long compressionDoneAt = 0;
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
index 9179707..de64243 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ScatterZipOutputStream.java
@@ -46,7 +46,7 @@
  * @since 1.10
  */
 public class ScatterZipOutputStream implements Closeable {
-    private final Queue<CompressedEntry> items = new ConcurrentLinkedQueue<CompressedEntry>();
+    private final Queue<CompressedEntry> items = new ConcurrentLinkedQueue<>();
     private final ScatterGatherBackingStore backingStore;
     private final StreamCompressor streamCompressor;
 
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/Simple8BitZipEncoding.java b/src/main/java/org/apache/commons/compress/archivers/zip/Simple8BitZipEncoding.java
index f8958da..1bd0f9c 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/Simple8BitZipEncoding.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/Simple8BitZipEncoding.java
@@ -105,7 +105,7 @@
     public Simple8BitZipEncoding(final char[] highChars) {
         this.highChars = highChars.clone();
         final List<Simple8BitChar> temp =
-            new ArrayList<Simple8BitChar>(this.highChars.length);
+            new ArrayList<>(this.highChars.length);
 
         byte code = 127;
 
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java
index 795ff59..7a21ef5 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveEntry.java
@@ -321,7 +321,7 @@
      * @param fields an array of extra fields
      */
     public void setExtraFields(final ZipExtraField[] fields) {
-        final List<ZipExtraField> newFields = new ArrayList<ZipExtraField>();
+        final List<ZipExtraField> newFields = new ArrayList<>();
         for (final ZipExtraField field : fields) {
             if (field instanceof UnparseableExtraFieldData) {
                 unparseableExtra = (UnparseableExtraFieldData) field;
@@ -469,7 +469,7 @@
             throw new java.util.NoSuchElementException();
         }
 
-        final List<ZipExtraField> newResult = new ArrayList<ZipExtraField>();
+        final List<ZipExtraField> newResult = new ArrayList<>();
         for (final ZipExtraField extraField : extraFields) {
             if (!type.equals(extraField.getHeaderId())){
                 newResult.add( extraField);
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
index 4ed2998..a184d97 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipArchiveOutputStream.java
@@ -171,7 +171,7 @@
      * List of ZipArchiveEntries written so far.
      */
     private final List<ZipArchiveEntry> entries =
-        new LinkedList<ZipArchiveEntry>();
+        new LinkedList<>();
 
     private final StreamCompressor streamCompressor;
 
@@ -201,7 +201,7 @@
      * Holds the offsets of the LFH starts for each entry.
      */
     private final Map<ZipArchiveEntry, Long> offsets =
-        new HashMap<ZipArchiveEntry, Long>();
+        new HashMap<>();
 
     /**
      * The encoding to use for filenames and the file comment.
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipEncodingHelper.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipEncodingHelper.java
index bc3f9d2..bcfb8cf 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipEncodingHelper.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipEncodingHelper.java
@@ -69,7 +69,7 @@
 
     static {
         final Map<String, SimpleEncodingHolder> se =
-            new HashMap<String, SimpleEncodingHolder>();
+            new HashMap<>();
 
         final char[] cp437_high_chars =
             new char[] { 0x00c7, 0x00fc, 0x00e9, 0x00e2, 0x00e4, 0x00e0,
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
index 7647ead..b38381d 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipFile.java
@@ -90,13 +90,13 @@
      * directory.
      */
     private final List<ZipArchiveEntry> entries =
-        new LinkedList<ZipArchiveEntry>();
+        new LinkedList<>();
 
     /**
      * Maps String to list of ZipArchiveEntrys, name -> actual entries.
      */
     private final Map<String, LinkedList<ZipArchiveEntry>> nameMap =
-        new HashMap<String, LinkedList<ZipArchiveEntry>>(HASH_SIZE);
+        new HashMap<>(HASH_SIZE);
 
     private static final class OffsetEntry {
         private long headerOffset = -1;
@@ -537,7 +537,7 @@
     private Map<ZipArchiveEntry, NameAndComment> populateFromCentralDirectory()
         throws IOException {
         final HashMap<ZipArchiveEntry, NameAndComment> noUTF8Flag =
-            new HashMap<ZipArchiveEntry, NameAndComment>();
+            new HashMap<>();
 
         positionAtCentralDirectory();
 
@@ -987,7 +987,7 @@
             final String name = ze.getName();
             LinkedList<ZipArchiveEntry> entriesOfThatName = nameMap.get(name);
             if (entriesOfThatName == null) {
-                entriesOfThatName = new LinkedList<ZipArchiveEntry>();
+                entriesOfThatName = new LinkedList<>();
                 nameMap.put(name, entriesOfThatName);
             }
             entriesOfThatName.addLast(ze);
diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/ZipMethod.java b/src/main/java/org/apache/commons/compress/archivers/zip/ZipMethod.java
index 5f7bb41..f4fbe59 100644
--- a/src/main/java/org/apache/commons/compress/archivers/zip/ZipMethod.java
+++ b/src/main/java/org/apache/commons/compress/archivers/zip/ZipMethod.java
@@ -173,7 +173,7 @@
     private static final Map<Integer, ZipMethod> codeToEnum;
 
     static {
-        final Map<Integer, ZipMethod> cte = new HashMap<Integer, ZipMethod>();
+        final Map<Integer, ZipMethod> cte = new HashMap<>();
         for (final ZipMethod method : values()) {
             cte.put(method.getCode(), method);
         }
diff --git a/src/main/java/org/apache/commons/compress/changes/ChangeSet.java b/src/main/java/org/apache/commons/compress/changes/ChangeSet.java
index c69c6de..55f5c4e 100644
--- a/src/main/java/org/apache/commons/compress/changes/ChangeSet.java
+++ b/src/main/java/org/apache/commons/compress/changes/ChangeSet.java
@@ -34,7 +34,7 @@
  */
 public final class ChangeSet {
 
-    private final Set<Change> changes = new LinkedHashSet<Change>();
+    private final Set<Change> changes = new LinkedHashSet<>();
 
     /**
      * Deletes the file with the filename from the archive. 
@@ -161,6 +161,6 @@
      * @return the changes as a copy
      */
     Set<Change> getChanges() {
-        return new LinkedHashSet<Change>(changes);
+        return new LinkedHashSet<>(changes);
     }
 }
diff --git a/src/main/java/org/apache/commons/compress/changes/ChangeSetPerformer.java b/src/main/java/org/apache/commons/compress/changes/ChangeSetPerformer.java
index f3bac85..3f7f9d6 100644
--- a/src/main/java/org/apache/commons/compress/changes/ChangeSetPerformer.java
+++ b/src/main/java/org/apache/commons/compress/changes/ChangeSetPerformer.java
@@ -113,7 +113,7 @@
             throws IOException {
         final ChangeSetResults results = new ChangeSetResults();
 
-        final Set<Change> workingSet = new LinkedHashSet<Change>(changes);
+        final Set<Change> workingSet = new LinkedHashSet<>(changes);
 
         for (final Iterator<Change> it = workingSet.iterator(); it.hasNext();) {
             final Change change = it.next();
diff --git a/src/main/java/org/apache/commons/compress/changes/ChangeSetResults.java b/src/main/java/org/apache/commons/compress/changes/ChangeSetResults.java
index e3e4d49..cf2f019 100644
--- a/src/main/java/org/apache/commons/compress/changes/ChangeSetResults.java
+++ b/src/main/java/org/apache/commons/compress/changes/ChangeSetResults.java
@@ -25,9 +25,9 @@
  * Stores the results of an performed ChangeSet operation.
  */
 public class ChangeSetResults {
-    private final List<String> addedFromChangeSet = new ArrayList<String>();
-    private final List<String> addedFromStream = new ArrayList<String>();
-    private final List<String> deleted = new ArrayList<String>();
+    private final List<String> addedFromChangeSet = new ArrayList<>();
+    private final List<String> addedFromStream = new ArrayList<>();
+    private final List<String> deleted = new ArrayList<>();
 
     /**
      * Adds the filename of a recently deleted file to the result list.
diff --git a/src/main/java/org/apache/commons/compress/compressors/FileNameUtil.java b/src/main/java/org/apache/commons/compress/compressors/FileNameUtil.java
index 22205d8..f97bb8e 100644
--- a/src/main/java/org/apache/commons/compress/compressors/FileNameUtil.java
+++ b/src/main/java/org/apache/commons/compress/compressors/FileNameUtil.java
@@ -35,7 +35,7 @@
      * versions of those file types. For example: from ".tar" to ".tgz".
      */
     private final Map<String, String> compressSuffix =
-        new HashMap<String, String>();
+        new HashMap<>();
 
     /**
      * Map from common filename suffixes of compressed files to the
diff --git a/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2Utils.java b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2Utils.java
index 2a8c04f..5582d98 100644
--- a/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2Utils.java
+++ b/src/main/java/org/apache/commons/compress/compressors/bzip2/BZip2Utils.java
@@ -33,7 +33,7 @@
 
     static {
         final Map<String, String> uncompressSuffix =
-            new LinkedHashMap<String, String>();
+            new LinkedHashMap<>();
         // backwards compatibilty: BZip2Utils never created the short
         // tbz form, so .tar.bz2 has to be added explicitly
         uncompressSuffix.put(".tar.bz2", ".tar");
diff --git a/src/main/java/org/apache/commons/compress/compressors/gzip/GzipUtils.java b/src/main/java/org/apache/commons/compress/compressors/gzip/GzipUtils.java
index ed801cf..0edf655 100644
--- a/src/main/java/org/apache/commons/compress/compressors/gzip/GzipUtils.java
+++ b/src/main/java/org/apache/commons/compress/compressors/gzip/GzipUtils.java
@@ -35,7 +35,7 @@
         // compressed extension of .tar as FileNameUtil will use the
         // first one found
         final Map<String, String> uncompressSuffix =
-            new LinkedHashMap<String, String>();
+            new LinkedHashMap<>();
         uncompressSuffix.put(".tgz", ".tar");
         uncompressSuffix.put(".taz", ".tar");
         uncompressSuffix.put(".svgz", ".svg");
diff --git a/src/main/java/org/apache/commons/compress/compressors/lzma/LZMAUtils.java b/src/main/java/org/apache/commons/compress/compressors/lzma/LZMAUtils.java
index f3323ba..c4579ff 100644
--- a/src/main/java/org/apache/commons/compress/compressors/lzma/LZMAUtils.java
+++ b/src/main/java/org/apache/commons/compress/compressors/lzma/LZMAUtils.java
@@ -45,7 +45,7 @@
     private static volatile CachedAvailability cachedLZMAAvailability;
 
     static {
-        final Map<String, String> uncompressSuffix = new HashMap<String, String>();
+        final Map<String, String> uncompressSuffix = new HashMap<>();
         uncompressSuffix.put(".lzma", "");
         uncompressSuffix.put("-lzma", "");
         fileNameUtil = new FileNameUtil(uncompressSuffix, ".lzma");
diff --git a/src/main/java/org/apache/commons/compress/compressors/pack200/Pack200Utils.java b/src/main/java/org/apache/commons/compress/compressors/pack200/Pack200Utils.java
index 164fa2f..da539f5 100644
--- a/src/main/java/org/apache/commons/compress/compressors/pack200/Pack200Utils.java
+++ b/src/main/java/org/apache/commons/compress/compressors/pack200/Pack200Utils.java
@@ -128,7 +128,7 @@
     public static void normalize(final File from, final File to, Map<String, String> props)
         throws IOException {
         if (props == null) {
-            props = new HashMap<String, String>();
+            props = new HashMap<>();
         }
         props.put(Pack200.Packer.SEGMENT_LIMIT, "-1");
         final File f = File.createTempFile("commons-compress", "pack200normalize");
diff --git a/src/main/java/org/apache/commons/compress/compressors/xz/XZUtils.java b/src/main/java/org/apache/commons/compress/compressors/xz/XZUtils.java
index 4da6425..e4e4be6 100644
--- a/src/main/java/org/apache/commons/compress/compressors/xz/XZUtils.java
+++ b/src/main/java/org/apache/commons/compress/compressors/xz/XZUtils.java
@@ -48,7 +48,7 @@
     private static volatile CachedAvailability cachedXZAvailability;
 
     static {
-        final Map<String, String> uncompressSuffix = new HashMap<String, String>();
+        final Map<String, String> uncompressSuffix = new HashMap<>();
         uncompressSuffix.put(".txz", ".tar");
         uncompressSuffix.put(".xz", "");
         uncompressSuffix.put("-xz", "");
