diff --git a/pom.xml b/pom.xml
index aa11784..2349b14 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 
     <groupId>com.baidu.hugegraph</groupId>
     <artifactId>hugegraph-common</artifactId>
-    <version>1.6.8</version>
+    <version>1.6.9</version>
 
     <name>hugegraph-common</name>
     <url>https://github.com/hugegraph/hugegraph-common</url>
@@ -212,7 +212,7 @@
                         <manifestEntries>
                             <!-- Must be on one line, otherwise the automatic
                                  upgrade script cannot replace the version number -->
-                            <Implementation-Version>1.6.8.0</Implementation-Version>
+                            <Implementation-Version>1.6.9.0</Implementation-Version>
                         </manifestEntries>
                     </archive>
                 </configuration>
diff --git a/src/main/java/com/baidu/hugegraph/util/StringUtil.java b/src/main/java/com/baidu/hugegraph/util/StringUtil.java
index 8a2a723..f7dcbb9 100644
--- a/src/main/java/com/baidu/hugegraph/util/StringUtil.java
+++ b/src/main/java/com/baidu/hugegraph/util/StringUtil.java
@@ -19,22 +19,107 @@
 
 package com.baidu.hugegraph.util;
 
-import java.nio.CharBuffer;
-import java.util.ArrayList;
-import java.util.List;
-
 public final class StringUtil {
 
-    public static List<CharSequence> split(String line, String delimiter) {
+    public static Chars[] splitToCharsArray(String text, String delimiter) {
         E.checkArgument(delimiter.length() > 0,
                         "The delimiter can't be empty");
-        List<CharSequence> results = new ArrayList<>();
-        int from = 0;
-        for (int to; (to = line.indexOf(delimiter, from)) >= 0;
-             from = to + delimiter.length()) {
-            results.add(CharBuffer.wrap(line, from, to));
+        Chars[] buffer = new Chars[text.length()];
+        int count = Chars.split(text, delimiter, buffer);
+        if (count == buffer.length) {
+            return buffer;
         }
-        results.add(CharBuffer.wrap(line, from, line.length()));
-        return results;
+        Chars[] result = new Chars[count];
+        System.arraycopy(buffer, 0, result, 0, count);
+        return result;
+    }
+
+    public static String[] split(String text, String delimiter) {
+        E.checkArgument(delimiter.length() > 0,
+                        "The delimiter can't be empty");
+        Chars[] buffer = new Chars[text.length()];
+        int count = Chars.split(text, delimiter, buffer);
+        String[] result = new String[count];
+        for (int i = 0; i < count; i++) {
+            result[i] = buffer[i].toString();
+        }
+        return result;
+    }
+
+    public static class Chars implements CharSequence {
+
+        private final char[] chars;
+        private final int start;
+        private final int end;
+
+        public Chars(char[] chars, int start, int end) {
+            E.checkArgument(0 < start && start < chars.length || start == 0,
+                            "Invalid start parameter %s", start);
+            E.checkArgument(start <= end && end <= chars.length,
+                            "Invalid end parameter %s", end);
+            this.chars = chars;
+            this.start = start;
+            this.end = end;
+        }
+
+        @Override
+        public int length() {
+            return this.end - this.start;
+        }
+
+        @Override
+        public char charAt(int index) {
+            return this.chars[this.start + index];
+        }
+
+        @Override
+        public CharSequence subSequence(int start, int end) {
+            return new Chars(this.chars, this.start + start, this.start + end);
+        }
+
+        @Override
+        public boolean equals(Object object) {
+            if (!(object instanceof Chars)) {
+                return false;
+            }
+            Chars other = (Chars) object;
+            return this.toString().equals(other.toString());
+        }
+
+        @Override
+        public int hashCode() {
+            return this.toString().hashCode();
+        }
+
+        @Override
+        public String toString() {
+            return new String(this.chars, this.start, this.length());
+        }
+
+        public static Chars of(String string) {
+            return new Chars(string.toCharArray(), 0, string.length());
+        }
+
+        public static Chars[] of(String... strings) {
+            Chars[] results = new Chars[strings.length];
+            for (int i = 0; i < strings.length; i++) {
+                results[i] = Chars.of(strings[i]);
+            }
+            return results;
+        }
+
+        public static int split(String text, String delimiter, Chars[] buffer) {
+            int count = 0;
+            int from = 0;
+            char[] chars = text.toCharArray();
+            for (int to; (to = text.indexOf(delimiter, from)) >= 0;
+                 from = to + delimiter.length()) {
+                buffer[count++] = new Chars(chars, from, to);
+            }
+            if (from < text.length()) {
+                buffer[count++] = new Chars(chars, from, text.length());
+            }
+            return count;
+        }
     }
 }
diff --git a/src/main/java/com/baidu/hugegraph/version/CommonVersion.java b/src/main/java/com/baidu/hugegraph/version/CommonVersion.java
index 81c9333..5d16637 100644
--- a/src/main/java/com/baidu/hugegraph/version/CommonVersion.java
+++ b/src/main/java/com/baidu/hugegraph/version/CommonVersion.java
@@ -27,5 +27,5 @@
 
     // The second parameter of Version.of() is for all-in-one JAR
     public static final Version VERSION = Version.of(CommonVersion.class,
-                                                     "1.6.8");
+                                                     "1.6.9");
 }
diff --git a/src/test/java/com/baidu/hugegraph/unit/UnitTestSuite.java b/src/test/java/com/baidu/hugegraph/unit/UnitTestSuite.java
index 629e986..e5f65d7 100644
--- a/src/test/java/com/baidu/hugegraph/unit/UnitTestSuite.java
+++ b/src/test/java/com/baidu/hugegraph/unit/UnitTestSuite.java
@@ -43,6 +43,7 @@
 import com.baidu.hugegraph.unit.util.NumericUtilTest;
 import com.baidu.hugegraph.unit.util.OrderLimitMapTest;
 import com.baidu.hugegraph.unit.util.ReflectionUtilTest;
+import com.baidu.hugegraph.unit.util.StringUtilTest;
 import com.baidu.hugegraph.unit.util.TimeUtilTest;
 import com.baidu.hugegraph.unit.util.VersionUtilTest;
 import com.baidu.hugegraph.unit.version.VersionTest;
@@ -69,6 +70,7 @@
     InsertionOrderUtilTest.class,
     NumericUtilTest.class,
     ReflectionUtilTest.class,
+    StringUtilTest.class,
     TimeUtilTest.class,
     VersionUtilTest.class,
     LongEncodingTest.class,
diff --git a/src/test/java/com/baidu/hugegraph/unit/util/StringUtilTest.java b/src/test/java/com/baidu/hugegraph/unit/util/StringUtilTest.java
index 2c9fd4f..f37ba41 100644
--- a/src/test/java/com/baidu/hugegraph/unit/util/StringUtilTest.java
+++ b/src/test/java/com/baidu/hugegraph/unit/util/StringUtilTest.java
@@ -26,12 +26,20 @@
 
 import com.baidu.hugegraph.testutil.Assert;
 import com.baidu.hugegraph.util.StringUtil;
+import com.baidu.hugegraph.util.StringUtil.Chars;
 import com.google.common.base.Splitter;
 
 public class StringUtilTest {
 
     @Test
     public void testSplit() {
+        Assert.assertArrayEquals(new String[]{"1", "2", "3"},
+                                 StringUtil.split("1, 2, 3", ", "));
+        Assert.assertArrayEquals(new String[]{"1", "1", "1"},
+                                 StringUtil.split("1 1 1", " "));
+        Assert.assertArrayEquals(new String[]{"", "", ""},
+                                 StringUtil.split("111", "1"));
+
         Assert.assertEquals(guavaSplit("123", " "),
                             toStringList(StringUtil.split("123", " ")));
         Assert.assertEquals(guavaSplit("1 2 3", " "),
@@ -48,22 +56,41 @@
                             toStringList(StringUtil.split("1:|2|:3", "|")));
         Assert.assertEquals(guavaSplit("1\t2\t3", "\t"),
                             toStringList(StringUtil.split("1\t2\t3", "\t")));
-        Assert.assertEquals(guavaSplit("111", "1"),
-                            toStringList(StringUtil.split("111", "1")));
 
         Assert.assertThrows(IllegalArgumentException.class, () -> {
             StringUtil.split("123", "");
         });
     }
 
+    @Test
+    public void testSplitToCharsArray() {
+        Assert.assertArrayEquals(Chars.of("1", "2", "3"),
+                                 StringUtil.splitToCharsArray("1, 2, 3", ", "));
+        Assert.assertArrayEquals(Chars.of("1", "1", "1"),
+                                 StringUtil.splitToCharsArray("1 1 1", " "));
+        Assert.assertArrayEquals(Chars.of("", "", ""),
+                                 StringUtil.splitToCharsArray("111", "1"));
+
+        Assert.assertArrayEquals(new Chars[]{Chars.of("123")},
+                                 StringUtil.splitToCharsArray("123", " "));
+        Assert.assertArrayEquals(Chars.of("1", "", "2", "3"),
+                                 StringUtil.splitToCharsArray("1::2:3", ":"));
+        Assert.assertArrayEquals(Chars.of("1", "", "2", "", "3"),
+                                 StringUtil.splitToCharsArray("1::2::3", ":"));
+
+        Assert.assertThrows(IllegalArgumentException.class, () -> {
+            StringUtil.splitToCharsArray("123", "");
+        });
+    }
+
     private static List<String> guavaSplit(String line, String delimiter) {
         return Splitter.on(delimiter).splitToList(line);
     }
 
-    private static List<String> toStringList(List<CharSequence> chars) {
-        List<String> results = new ArrayList<>(chars.size());
-        for (CharSequence seq : chars) {
-            results.add(seq.toString());
+    private static List<String> toStringList(String[] stringArray) {
+        List<String> results = new ArrayList<>(stringArray.length);
+        for (String str : stringArray) {
+            results.add(str);
         }
         return results;
     }
