2010-12-05 13 views
1

自分のJavaコードでの文字列処理を改善するために自分のユーティリティメソッドを絶えず変更しています。たとえば、検索の束を変更し、コードを置き換えて、Commons StringUtils.replaceメソッドを使用します。または、安全なコードを入力するには1.4から1.6 javaにアップグレードしてください。パフォーマンス、セキュリティのためにJava文字列を扱う際のヒントとヒント

文字列操作がスムーズに、安全に、高速で実行され、コードの再利用性が非常にシンプルでエレガントであるようにするために、慣行を投稿するようお願いしたいと思います。

あなたはそれにパターンがあれば、さらに良い。

また、価値のある新しい1.7のJava機能については、ここに投稿してください。

非常に大きな文字列で作業する場合はどうすればよいですか?それらを壊す?

文字列にregexを使用する際に留意すべき点は?

ループ集中アルゴリズムを使用しているときにキャッシュパターンを使用する方法(および一度最適です)

grep、ack、diffと同様の機能を持つライブラリはありますか? |スペルチェック|呪いの言葉(任意の単語)をフィルターにかける...

答えて

3

可能であれば、特に文字列の連結にはStringBuilderを使用する必要があります。パフォーマンスの向上は非常に大きくなる可能性があります。

StringBuilder sb = new StringBuilder("Mat"); 
sb.append(" "); 
sb.append("Bank"); 
// oops 
int i = sb.indexOf("k"); 
sb.insert(i, 'i'); // character 
String mb = sb.toString(); 
// result = "Mat Banik" 

大きなプログラムでは、s1 + s2を使用すると、最も悪い単純なパフォーマンスヒットの1つになります。

StringBuilderには、ほとんどすべてのStringの機能があります。コピーせずに部分文字列を抽出することができます。 String(パターン/マッチャーなど)が必要な場合は、toString()で変換できます。

2

セキュリティの観点から、プレーンテキスト文字列をHTML文字列と連結してHTML文字列を生成するなど、さまざまなコンテンツタイプの文字列を組み合わせるときは、必ず適切にエスケープしてください。

http://commons.apache.org/lang/api-2.5/org/apache/commons/lang/StringEscapeUtils.htmlには、便利なエスケープ機能とその逆があります。 String.substring()は、唯一のオリジナルchar配列に新しい「ビュー」を作成することを忘れないでください

void doGet(HttpServletRequest req, HttpServletResponse resp) { 
    String message = req.getParameter("message"); 
    // Unless I check, in code, that an input is of some other content type, 
    // I need to conservatively assume it's plain text. 
    ... 
    resp.setContentType("text/html;charset=UTF-8"); 
    ... 
    // Since resp is a channel with content-type text/html, 
    // I need to only write HTML to it. 
    resp.getWriter().write(
     "<h2>" // This is already HTML. 
     + StringEscapeUtils.escapeHtml(message) // plain text -> innocuous HTML 
     + "</h2>" // Also already HTML. 
    ); 
    ... 
} 
1

例えば

は、次のような出力をエンコードすることができ、XSS攻撃を避けるために。したがって、大きなStringの小さな部分文字列を取り出して格納するときは、部分文字列だけの新しいStringを作成することをお勧めします。これにより、部分文字列が元の文字列全体を実際に保持するメモリリークを追跡することが困難になります。

IBMとSunのJVMのStringコンストラクタの実装が異なるように動作しますが、注意してください。 Sunはあなたが期待していることを行います。新しい文字配列を作成します。しかし、IBMはそうではありません。最初にchar配列を取得する必要があります。これを避けるために、私は次のコードの醜いビットを実行しなければなりませんでした:

private static final boolean IS_IBM_JVM = System.getProperty("java.vm.vendor").startsWith("IBM"); 
... 
if (IS_IBM_JVM) { 
    substring = new String(substring.toCharArray()); 
} 
else { 
    substring = new String(substring); 
} 
関連する問題