Это все отлично работает, я беспокоюсь об эффективности очистки раздела ...
В самом деле? Вы проверяли полученную «строку»? На моей машине данные в forumContentCleaned
все еще содержат данные &sid=...
.
Это потому что
forumContentList.removeAll(Arrays.asList(sidPattern));
пытается удалить List<byte[]>
из List<Byte>
. Это ничего не сделает. И даже если вы замените аргумент removeAll
действительным List<Byte>
, содержащим байты "&sid="
, то вы удалите ALL вхождений каждого a
, каждого m
, каждого p
и пр. Полученные данные будут выглядеть так:
<l cl"con-logout">< href"./uc.h?oelogout34043284674572e35881e022c68fc8" ttle....
Ну, строго говоря, часть &sid=
пропала, но я совершенно уверен, что это не то, что вы хотели.
Поэтому сделайте шаг назад и подумайте: вы здесь делаете манипуляции со строками, поэтому используйте StringBuilder
, накормите его String(forumContent)
и делайте там свои манипуляции.
Редактировать
Глядя на приведенную в качестве примера строку ввода, я предполагаю, что следует удалить также значение из sid
, а не только ключ. Этот код должен делать это эффективно без регулярных выражений:
String removeSecrets(String input){
StringBuilder sb = new StringBuilder(input);
String sidStart = "&sid=";
String sidEnd = "\"";
int posStart = 0;
while ((posStart = sb.indexOf(sidStart, posStart)) >= 0) {
int posEnd = sb.indexOf(sidEnd, posStart);
if (posEnd < 0) // delete as far as possible - YMMV
posEnd = sb.length();
sb.delete(posStart, posEnd);
}
return sb.toString();
}
Редактировать 2
Вот небольшой тест между StringBuilder
и String.replaceAll
:
public class ReplaceAllBenchmark {
public static void main(String[] args) throws Throwable {
final int N = 1000000;
String input = "<li class=\"icon-logout\"><a href=\"./ucp.php?mode=logout&sid=3a4043284674572e35881e022c68fcd8\" title=\"Logout [ barry ]\" accesskey=\"x\">Logout [ barry ]</a>&sid=3a4043284674572e35881e022c68fcd8\"</li>";
stringBuilderBench(input, N);
regularExpressionBench(input, N);
}
static void stringBuilderBench(String input, final int N) throws Throwable{
for(int run=0; run<5; ++run){
long t1 = System.nanoTime();
for(int i=0; i<N; ++i)
removeSecrets(input);
long t2 = System.nanoTime();
System.out.println("sb: "+(t2-t1)+"ns, "+(t2-t1)/N+"ns/call");
Thread.sleep(1000);
}
}
static void regularExpressionBench(String input, final int N) throws Throwable{
for(int run=0; run<5; ++run){
long t1 = System.nanoTime();
for(int i=0; i<N; ++i)
removeSecrets2(input);
long t2 = System.nanoTime();
System.out.println("regexp: "+(t2-t1)+"ns, "+(t2-t1)/N+"ns/call");
Thread.sleep(1000);
}
}
static String removeSecrets2(String input){
return input.replaceAll("&sid=[^\"]*\"", "\"");
}
}
Результаты:
java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.9) (6b20-1.9.9-0ubuntu1~10.04.2)
OpenJDK 64-Bit Server VM (build 19.0-b09, mixed mode)
sb: 538735438ns, 538ns/call
sb: 457107726ns, 457ns/call
sb: 443282145ns, 443ns/call
sb: 453978805ns, 453ns/call
sb: 458895308ns, 458ns/call
regexp: 2404818405ns, 2404ns/call
regexp: 2196834572ns, 2196ns/call
regexp: 2239056178ns, 2239ns/call
regexp: 2164337638ns, 2164ns/call
regexp: 2177091893ns, 2177ns/call