diff --git a/src/main/java/org/apache/commons/fileupload/ParameterParser.java b/src/main/java/org/apache/commons/fileupload/ParameterParser.java
index 14f8b6e..ee14f4e 100644
--- a/src/main/java/org/apache/commons/fileupload/ParameterParser.java
+++ b/src/main/java/org/apache/commons/fileupload/ParameterParser.java
@@ -129,8 +129,8 @@
      */
     private boolean isOneOf(char ch, final char[] charray) {
         boolean result = false;
-        for (int i = 0; i < charray.length; i++) {
-            if (ch == charray[i]) {
+        for (char element : charray) {
+            if (ch == element) {
                 result = true;
                 break;
             }
@@ -235,11 +235,11 @@
         char separator = separators[0];
         if (str != null) {
             int idx = str.length();
-            for (int i = 0;  i < separators.length;  i++) {
-                int tmp = str.indexOf(separators[i]);
+            for (char separator2 : separators) {
+                int tmp = str.indexOf(separator2);
                 if (tmp != -1 && tmp < idx) {
                     idx = tmp;
-                    separator = separators[i];
+                    separator = separator2;
                 }
             }
         }
diff --git a/src/test/java/org/apache/commons/fileupload/DefaultFileItemTest.java b/src/test/java/org/apache/commons/fileupload/DefaultFileItemTest.java
index dd8f982..cf27803 100644
--- a/src/test/java/org/apache/commons/fileupload/DefaultFileItemTest.java
+++ b/src/test/java/org/apache/commons/fileupload/DefaultFileItemTest.java
@@ -259,8 +259,8 @@
     private static String constructString(int[] unicodeChars) {
         StringBuilder buffer = new StringBuilder();
         if (unicodeChars != null) {
-            for (int i = 0; i < unicodeChars.length; i++) {
-                buffer.append((char) unicodeChars[i]);
+            for (int unicodeChar : unicodeChars) {
+                buffer.append((char) unicodeChar);
             }
         }
         return buffer.toString();
@@ -281,8 +281,8 @@
                 true,
                 null);
         OutputStream outstream = item.getOutputStream();
-        for (int i = 0; i < SWISS_GERMAN_STUFF_ISO8859_1.length; i++) {
-            outstream.write(SWISS_GERMAN_STUFF_ISO8859_1[i]);
+        for (int element : SWISS_GERMAN_STUFF_ISO8859_1) {
+            outstream.write(element);
         }
         outstream.close();
         assertEquals(teststr, teststr, item.getString());
@@ -294,8 +294,8 @@
                 true,
                 null);
         outstream = item.getOutputStream();
-        for (int i = 0; i < SWISS_GERMAN_STUFF_UTF8.length; i++) {
-            outstream.write(SWISS_GERMAN_STUFF_UTF8[i]);
+        for (int element : SWISS_GERMAN_STUFF_UTF8) {
+            outstream.write(element);
         }
         outstream.close();
         assertEquals(teststr, teststr, item.getString());
@@ -309,8 +309,8 @@
                 true,
                 null);
         outstream = item.getOutputStream();
-        for (int i = 0; i < RUSSIAN_STUFF_KOI8R.length; i++) {
-            outstream.write(RUSSIAN_STUFF_KOI8R[i]);
+        for (int element : RUSSIAN_STUFF_KOI8R) {
+            outstream.write(element);
         }
         outstream.close();
         assertEquals(teststr, teststr, item.getString());
@@ -322,8 +322,8 @@
                 true,
                 null);
         outstream = item.getOutputStream();
-        for (int i = 0; i < RUSSIAN_STUFF_WIN1251.length; i++) {
-            outstream.write(RUSSIAN_STUFF_WIN1251[i]);
+        for (int element : RUSSIAN_STUFF_WIN1251) {
+            outstream.write(element);
         }
         outstream.close();
         assertEquals(teststr, teststr, item.getString());
@@ -335,8 +335,8 @@
                 true,
                 null);
         outstream = item.getOutputStream();
-        for (int i = 0; i < RUSSIAN_STUFF_UTF8.length; i++) {
-            outstream.write(RUSSIAN_STUFF_UTF8[i]);
+        for (int element : RUSSIAN_STUFF_UTF8) {
+            outstream.write(element);
         }
         outstream.close();
         assertEquals(teststr, teststr, item.getString());
diff --git a/src/test/java/org/apache/commons/fileupload/HttpServletRequestFactory.java b/src/test/java/org/apache/commons/fileupload/HttpServletRequestFactory.java
index 0a56b54..0f478dd 100644
--- a/src/test/java/org/apache/commons/fileupload/HttpServletRequestFactory.java
+++ b/src/test/java/org/apache/commons/fileupload/HttpServletRequestFactory.java
@@ -36,9 +36,8 @@
 
         StringBuilder sbRequestData = new StringBuilder();
 
-        for (int i = 0; i < strFileNames.length; i++)
-        {
-            sbRequestData.append(strFileNames[i]);
+        for (String strFileName : strFileNames) {
+            sbRequestData.append(strFileName);
         }
 
         byte[] requestData = null;
