20200515のJavaに関する記事は6件です。

Listのメソッド

Listのメソッドについてまとめていきます。
随時更新していく予定です。

add(E e)

指定された要素をこのリストの最後に追加します。

List<String> list = new ArrayList<>();
list.add("あいう");
list.add("えお");
list.add("asdf");
System.out.println(list);
[あいう, えお, asdf]

add(int index, E element)

リスト内の指定された位置に、指定された要素を挿入します。

List<String> list = new ArrayList<>();
list.add("あいう");
list.add("えお");
//0番目に挿入する
list.add(0, "ABCD");
list.add("asdf");
System.out.println(list);
[ABCD, あいう, えお, asdf]

clear()

すべての要素をこのリストから削除します。

List<String> list = new ArrayList<>();
list.add("あいう");
list.add("えお");
list.add(0, "ABCD");
list.add("asdf");
System.out.println(list);
list.clear();
System.out.println(list);
[ABCD, あいう, えお, asdf]
[]

contains(Object o)

指定の要素がこのリストに含まれている場合にtrueを返します。

List<String> list = new ArrayList<>();
list.add("あいう");
list.add("えお");
list.add(0, "ABCD");
list.add("asdf");

//"asdf"はlistに含まれているので、true
System.out.println(list.contains("asdf"));
//"a"はlistに含まれていないので、false
System.out.println(list.contains("a"));
true
false

containsAll(Collection<?> c)

指定されたコレクションのすべての要素がこのリストに含まれている場合にtrueを返します。

List<String> list = new ArrayList<>();
List<String> list3 = new ArrayList<>();
List<String> list4 = new ArrayList<>();

list.add("あい");
list.add("うえ");
list.add(0, "AB");
list3.add("あい");
list3.add("うえ");
list3.add(0, "AB");
list4.add("あい");
list4.add("う");
list4.add(0, "AB");

//listとlist3の含まれている要素が同じなので、true
System.out.println(list.containsAll(list3));
//listとlist4の含まれている要素が相違しているので、false
System.out.println(list.containsAll(list4));
true
false

equals(Object o)

指定されたオブジェクトがこのリストと等しいかどうかを比較します。

List<String> list = new ArrayList<>();
List<String> list3 = new ArrayList<>();
List<String> list4 = new ArrayList<>();

list.add("あい");
list.add("うえ");
list.add(0, "AB");
list3.add("あい");
list3.add("うえ");
list3.add(0, "AB");
list4.add("あい");
list4.add("う");
list4.add(0, "AB");

System.out.println(list.equals(list3));
System.out.println(list.equals(list4));
true
false

get(int index)

このリスト内の指定された位置にある要素を返します。

List<String> list = new ArrayList<>();

list.add("あい");
list.add("うえ");
list.add(0, "AB");

System.out.println(list.get(1));
System.out.println(list.get(2));
//IndexOutOfBoundsException
System.out.println(list.get(3));

あい
うえ
IndexOutOfBoundsException

hashCode()

このリストのハッシュ・コード値を返します。

List<String> list = new ArrayList<>();

list.add("あい");
list.add("うえ");
list.add(0, "AB");

System.out.println(list.hashCode());
14680320

indexOf(Object o)

指定された要素がこのリスト内で最初に検出された位置のインデックスを返します。指定された要素がこのリストにない場合は -1を返します。

List<String> list = new ArrayList<>();

list.add("あい");
list.add("うえ");
list.add(0, "AB");

System.out.println(list.indexOf("あい"));
System.out.println(list.indexOf("AB"));
System.out.println(list.indexOf("q"));
1
0
-1

isEmpty()

このリストに要素がない場合にtrueを返します。

List<String> list = new ArrayList<>();
List<String> list3 = new ArrayList<>();
List<String> list4 = new ArrayList<>();

list.add("あい");
list.add("うえ");
list.add(0, "AB");
list3.add("");

//要素があるので、false
System.out.println(list.isEmpty());
//要素にブランクが入っているので、false
System.out.println(list3.isEmpty());
//要素がないので、true
System.out.println(list4.isEmpty());
false
false
true

lastIndexOf(Object o)

指定された要素がこのリスト内で最後に検出された位置のインデックスを返します。指定された要素がこのリストにない場合は -1を返します。

List<String> list = new ArrayList<>();

list.add("あい");
list.add("あい");
list.add("うえ");

//検出される最後の位置が1
System.out.println(list.lastIndexOf("あい"));
//"あ"は存在しないので、-1
System.out.println(list.lastIndexOf("あ"));
1
-1

remove(int index)

このリスト内の指定された位置にある要素を削除します。

List<String> list = new ArrayList<>();

list.add("あい");
list.add("あい");
list.add("うえ");

System.out.println(list);
System.out.println(list.remove(1));
System.out.println(list);
[あい, あい, うえ]
あい
[あい, うえ]

remove(Object o)

指定された要素がこのリストにあれば、その最初のものをリストから削除します。

List<String> list = new ArrayList<>();

list.add("あい");
list.add("あい");
list.add("うえ");

System.out.println(list);
//文字を指定しても削除可能
list.remove("あい");
System.out.println(list);
[あい, あい, うえ]
[あい, うえ]

removeAll(Collection<?> c)

このリストから、指定されたコレクションに含まれる要素をすべて削除します。

List<String> list = new ArrayList<>();


list.add("あい");
list.add("あい");
list.add("うえ");

System.out.println(list);
list.removeAll(list);
System.out.println(list);
[あい, あい, うえ]
[]

retainAll(Collection<?> c)

このリスト内で、指定されたコレクションに含まれている要素だけを保持します。

※指定されたコレクションに含まれていないすべての要素をこのリストから削除します。

List<String> list = new ArrayList<>(Arrays.asList("Apple","Orange", "Melon"));
List<String> list3 = new ArrayList<>(Arrays.asList("Orange","Melon"));

//listにlist3と同じ要素が含まれているもののみ保持
list.retainAll(list3);
System.out.println(list);
[Orange, Melon]

set(int index, E element)

このリスト内の指定された位置にある要素を、指定された要素に置き換えます。

List<String> list = new ArrayList<>(Arrays.asList("Apple","Orange", "Melon"));

//0番目の"Apple"と"Banana"を入れ替える
list.set(0, "Banana");
System.out.println(list);
[Banana, Orange, Melon]

size()

このリスト内にある要素の数を返します。

List<String> list = new ArrayList<>(Arrays.asList("Apple","Orange", "Melon"));

System.out.println(list.size());

list.add("Banana");
//直前にaddしているので、要素数が増加
System.out.println(list.size());
3
4

subList(int fromIndex, int toIndex)

このリストの、指定されたfromIndex (これを含む)からtoIndex (これを含まない)までの部分のビューを返します。

ArrayList<Integer> foo = new ArrayList<>(Arrays.asList(10, 30, 5, 1, 11, 90));

System.out.println(foo.subList(0, 3));
System.out.println(foo.subList(1, 2));
System.out.println(foo.subList(4, 5));
[10, 30, 5]
[30]
[11]

toArray(T[] a)

このリスト内のすべての要素を適切な順序で(最初の要素から最後の要素へ)含んでいる配列を返します。
リストから配列に変換するには、toArrayメソッドを利用します。

List<String> list = new ArrayList<>(Arrays.asList("Apple","Orange", "Melon"));

String[] str = new String[list.size()];
list.toArray(str);

System.out.println(Arrays.toString(str));
System.out.println(list);
[Apple, Orange, Melon]
[Apple, Orange, Melon]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Javaの基礎知識】型変換について

はじめに

こちらの記事は、
- Javaをこれから学習し始める
- 基本的なことをおさらいしたい

という方向けです。

型や変数については下記の記事に記載しております。
【Javaの基礎知識】型や変数について

基本型(プリミティブ型)の変換

ある基本型の変数から他の基本型の変数に変換す方法をご紹介します。

変換元の基本型 型変換が可能な変更先の基本型
char int, long, float, double
byte short, int, long, float, double
short int, long, float, double
int long, float, double
long float, double
float double
double なし

小さい型から大きい型

整数のデータ型は、
byte < short < int < long
というサイズ感です。
小さい型から大きい型に変換するとき、自動的に型が変換される場合と、プログラマが意識的に変換を行うキャストがあります。

    自動的に型が変換される場合

    byte a = 127;
    short b = a;
    System.out.println(b);//出力結果=127

    short c = 32767;
    long d = c;
    System.out.println(d);//出力結果=32767
    プログラマが意識的に変換を行うキャスト

    byte a = 127;
    byte b = 127;
    System.out.println((long)a + b);//出力結果=254

    int c = 2147483647;
    int d = 2147483647;
    System.out.println((long)c + d);//出力結果=4294967294

大きい型から小さい型

大きい型から小さい型への変換は注意が必要です。

以下のやり方だとエラーがでます。

    long a = Long.MAX_VALUE;//longの最大値を代入しています
    System.out.println(a);//出力結果=9223372036854775807
    short b = a;//Type mismatch: cannot convert from long to short

エラーを直す方法はありますが、変数の中身が変わってしまいます。
そのデータ型が持つことのできるサイズを超えるとデータの切り捨て(データの溢れ)が生じ、想定された実行結果になりません。

    long a = Long.MAX_VALUE;//longの最大値を代入しています
    System.out.println(a);//出力結果=9223372036854775807
    short b = (short) a;//キャストで型変換しています
    System.out.println(b);//出力結果=-1

参照型の変換

今回は、クラス型の型変換のみの説明になります。
変換元の参照型がクラス型の場合の変換先の参照型と、型変換のルールが下図の通りです。

変換先の参照型 型変換のルール
クラス型 変換先のクラス型が変換元のクラス型のスーパークラスであること。
インタフェース型 変換先のインタフェース型のインタフェースを変換元のクラス型のクラスが実装していること。
配列型 型変換不可。


参照型暗黙の型変換
親クラス型 変数 = new 子クラス();

//親クラス
class Oya {
  void greet() {
    String a = "おはよう";
      System.out.println(a);
  }
}

//親クラスを継承した子クラス
class Kodomo extends Oya {
  void name() {
    String b = "イニエスタ";
      System.out.println(b);
  }
  public static void main(String[] args) {
      Oya oy = new Kodomo();
      oy.greet();//出力結果=おはよう
      Oya oy2 = new Oya();
      oy2.greet();//出力結果=おはよう

      Kodomo ko = new Kodomo();
      ko.greet();//出力結果=おはよう
      ko.name();//出力結果=イニエスタ
      Kodomo ko2 = new Oya();//エラー:Type mismatch: cannot convert from Oya to Kodomo

  }
}

エラーが出ているところにあるように、
子クラス型 変数 = new 親クラス();
はできません。

文字列への変換

全ての型から文字型へ変換が可能です。

    Integer a1 = 123;
    String s1 = "あ" + a1;
    System.out.println(s1);//出力結果=あ123
    System.out.println(s1 instanceof String);//出力結果=true


    int a2 = -123;
    String s2 = String.valueOf(a2);
    System.out.println(s2);//出力結果=-123
    System.out.println(s2 instanceof String);//出力結果=true

最後に

参照型の変換に関してまだまだ深くは理解できていないので、
わかり次第追記していく予定です。

それでは、ありがとうございました☕️

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

コードを書く上で使えそうなJava14新機能

Java14

2020/3/17にJava14がリリースされました。
Java14で追加された機能のうち、コードを書く上で使えそうな機能を紹介してみようと思います。

record(preview)

データ保持用のクラスが簡単に作ることができる。

public record Customer(String name, String age){}

以下のクラスと同等のものが作成される。

public class Customer {
    private final String name;

    private final String age;

    public Customer(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String name() {
        return this.name;
    }

    public String age() {
        return this.age;
    }

    public String hashCode() {...}

    public boolean equals() {...}

    public String toString() {...}
}

値設定用のメソッドは定義されないため、インスタンス生成後に値を変更することはできない。

テキストブロック

改行を含んだ文字列を定義することができるようになった。
"ではなく"""で文字列を囲むとテキストブロックとして認識する。

String str1 = "aaaa\n"
    + "bbb";

String str2 = """
   aaa
   bbb\
   """

上記2つの文字列は同じことを示します。
改行をしたくない場合は場合は\を入れる。

Helpful NullPointerExceptions

NullPointerExceptionが発生した際のメッセージが詳細に出せるようになった。

String str = null;
str.length(); // NullPointerException

デフォルトでは以下のような例外が出力される。

Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:5)

java14では「-XX:+ShowCodeDetailsInExceptionMessages」をつけて実行すると、以下のような詳細な例外が出力されるようになる。

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "String.length()" because "<local1>" is null
    at Test.main(Test.java:5)

パターンマッチングinstanceof(preview)

instanceofで型のチェックをしつつ、その型の変数を定義できるようになった。

Object obj = "obj";
if (obj instanceof String str){
    System.out.println(str.length());
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IDE(eclipse)のデバッグ実行、ステップ実行(Java)

はじめに

この記事は現在Javaを勉強する方に向けた私自身の理解している内容の記録です。

統合開発環境でJavaのコードをデバッグ実行し、ステップ実行で動作確認することが多いので、その一連の流れを記載しようと思います。

Eclipseをインストール

Javaの統合開発環境で今時点で無料で使えるeclipseをインストールしましょう。下記リンクでダウンロードできます。

https://mergedoc.osdn.jp/

今時点での最新版のeclipse 2020を選択。

スクリーンショット 2020-05-15 10.17.48.png

すると下記画像の画面が出てきます。今回は私の環境に合わせてインストールしていきます。Macで64bitCPUであり、Javaの環境が必要なので、下記赤枠を選択します。

スクリーンショット 2020-05-15 10.27.14.png

ダウンロードページに遷移され、自動でダウンロードが始まります。ダウンロードができたらファイルを開き、アプリケーションに移しましょう。

スクリーンショット_2020-05-15_10_36_25.png

デバッグ実行用のクラス作成

これでMacにインストールできました。早速起動しましょう。すると画像のような画面が表示されるので、Javaプロジェクトの作成を選択します。

スクリーンショット_2020-05-15_10_54_32.png

作成を選択すると、画像の画面が出てきます。今回はJavaファイルを動かしてデバッグ実行したいので、プロジェクト名だけ入力して完了します。

スクリーンショット_2020-05-15_10_58_45.png

完了したらプロジェクトが作成されるので、プロジェクト内にクラスを作りましょう。右クリックで新規、クラスを選択して作成画面が表示されます。

スクリーンショット_2020-05-15_11_06_15.png

作成画面が表示されたら、名前をMainにし、public static void main(String args[]) にチェックを入れて完了にします。

スクリーンショット_2020-05-15_11_10_19.png

これでクラスが作成できたので、下記のコードをeclipseのエディタに入力します。

public class Main{
    int instans = 60;
    static int global = 95;

    static void debug(){
        System.out.println("デバッグ実行");
    }

    void print(){
        System.out.println("print()");
    }

    public static void main(String args[]){
        Main.debug();
        System.out.println("main start");

        int x = 50;

        String str = "文字型";

        Main m = new Main();

        x = 100;

        str = "文字型変換";

        m.print();

        System.out.println("main end");
    }
}

このコードをデバッグ実行し、どのように動いているのかを確認していきます。

ブレークポイント

ここからデバッグ実行に入りますが、デバッグ実行を行うには、プログラムを止める場所を先に指定する必要があります。それをブレークポイントと言います。実際にeclipseでブレークポイントの設定をしましょう。

System.out.println("main start");

今回は上記の箇所にブレークポイントを設定します。eclipseエディタの上記コードの行数の左側を右クリックし、メニューを表示してブレークポイントの切り替えを選択します。

スクリーンショット_2020-05-15_11_33_58.png

この設定でデバッグ実行ができるので、eclipseの左上の虫マークを選択します。ここでデバッグ実行が始まります。

スクリーンショット_2020-05-15_11_43_40.png

これでデバッグ機能が立ち上がります。そして先ほど設定したブレークポイントで処理が止まっています。
そのため、ブレークポイント前に動作する「デバッグ実行」の出力は出ており、下のf「main end」は出力されていません。
よって、2つの処理の間に置いているブレークポイントで処理が止まっているのがわかります。

スクリーンショット_2020-05-15_11_47_15.png

ステップ実行

ここまでは処理を止めるところまでですが、処理を1行ずつ進めるステップ実行を行なってみましょう。上記の続きでステップオーバーボタンをクリックします。

スクリーンショット_2020-05-15_11_55_58.png

クリック後は止まっている処理が1行実行され、選択状態が次の行に映ります。ブレークポイントを

System.out.println("main start");

にしていて、ステップ実行で1行実行されたので、出力欄にmain startが表示されています。

スクリーンショット_2020-05-15_13_02_56.png

1行ずつ動いているステップ実行のイメージができたと思うので、さらにステップオーバーボタンを2回押して進めてみましょう。
エディタの右側に変数のリストがありますが、内容が更新されています。

スクリーンショット_2020-05-15_13_13_19.png

2回ステップ実行を行なったことで、変数の定義と初期化を行なっています。

int x = 50;
String str = "文字型";

この2つの処理が通ることにより、変数の今時点で保持している値が表示できます。さらにステップオーバーボタンを3回クリックして進めてみましょう。

スクリーンショット_2020-05-15_13_17_39.png

3回ステップ実行を行い、変数xとstrの値が更新される処理があります。

x = 100;
str = "文字型変換";

そのため変数リストの今時点での値が更新されています。

ちなみに間の処理で変数mを定義しており、生成したインスタンスを代入しています。

Main m = new Main();

Mainクラスはインスタンス変数instansがあるので、こちらも定義されているのを確認できます。
変数リストの変数名mの右矢印をクリックしましょう。

スクリーンショット_2020-05-15_13_25_18.png

このようにインスタンス変数も確認できます。
ちなみにstatic変数が表示されないのは、static変数が独立した要素であり、変数mが持っているのではないので表示はされません。

終わりに

この記事ではIDEでのデバッグ実行を行い、その中で重要なステップ実行で1行ずつ動作確認する手順を記載しました。

実行中でプログラムが見ている時点での値の状態がわかるので、動作確認をするときに、任意のタイミングで自分の意図した値が入っているかを確認することができるので、デバッグ実行を取り入れてみてはいかがでしょうか。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Javaと.NETの特性を比較してみた

前説

この記事を書く意図はJavaと.NETを比較することで技術の優劣をつけることではありません。
エンジニア界隈では言語対して、往々にして宗教戦争があります。Javaのエンジニアは.NETがWindowsしか乗らないとディスったり、.NETのエンジニアはJavaは書き方がうるさいと愚痴ったりします。そういう争いは生産性がなく、無意義と考えています。

この記事を書くことで双方の言語体系、Webフレームワーク、デプロイ方法を比較することで片方しか経験していないエンジニアがもう片方の技術特性を理解に役立てれば幸いです。

開発ツール

工、その事をよくせんと欲せば、必ずその器を利とす。(職人が立派な仕事をしたいと思ったらまず道具を研ぐ)。

まずは開発に欠かせないツールについて説明します。

フレームワーク ツール 解説
.NET Visual Studio, Visual Studio Code, Rider Microsoftの公式IDEのVisual Studioは.NETの全プラットフォームに対応できる。
Java Intellij, Eclipse, Visual Studio Code コードの実行とデバッグの役割、JDKに依存する
Java Mavan, Gradle テンプレート管理、パッケージングの役割。JDKに依存する
Java JDK コンパイルと実行(Runtime)の役割を持つ

.NETはVisual Studio(以後VSと略す)をインストールすれば開発に着手できる。JavaはIDEだけインストールしては駄目で、JDKやMavenをインストールして設定しなければいけない。JDKとMavenを自動的にインストールしてくれるIDE(Intellij)あるが、なるべく自分でインストールして設定したほうが良い。そうじゃないと意味のわからない地雷を踏むことになる。

環境構築の手軽さだけで言うなら.NETに軍配が上がる。頭を使わず次へ次へとポチポチすればいい。Javaはまずはツールの特性と責務を理解して設定する必要がある。

初心者にとってJavaの最初の関門を少し狭く感じるかもしれません。しかし、Javaは環境構築に苦労するぶん、プロジェクトの仔細がわかるようになる。

まぁ、どちらもVisual Studio Code(以後Vscodeと略す)を使って開発できるので、技術を体系的に理解する目的なら環境構築はVscodeを推奨する。

次に各種ツールをもう少し詳細的に説明します。

責務 .NET Java 解説
プロジェクト管理 VS,Vscode,Rider Intellij, Eclipse, Vscode Vscode使ってるぶん大差ない、課金してIdeaやRiderを買ったほうが少し効率上がる。Eclipseはゴミ
テンプレート管理 IDE+MSBuild or IDE+SDK IDE+Maven or IDE+Gradle .NETプロジェクトはsln+csprojファイルで構成される。Javaはpom.xmlファイルで構成される。
コンパイル・デバッグ IDE+MSBuild+SDK or IDE+SDK IDE+Maven+SDK or IDE+Gradle+SDK .NETコンパイラは独立してる。 JavaのコンパイラはJDKに統合されており、Mavenプロジェクトはpom.xmlで構成されているが、コンパイラはpom.xmlを認識しないため、コンパイルするにはMavenが必要
パッケージ管理 Nuget Mavan, Gradle Nugetは簡単。JavaのMavanやGradleは柔軟で強力。
パッケージング・デプロイ IDE+MSBuild+SDK or IDE+SDK IDE+Maven+SDK or IDE+Gradle+SDK .NETコンパイラは独立してる。 JavaのコンパイラはJDKに統合されており、Mavenプロジェクトはpom.xmlで構成されているが、コンパイラはpom.xmlを認識しないため、パッケージするにはMavenが必要。

.NETのSDKが提供されてくれる豊富なテンプレートは簡単で使いやすい。JavaのMavenは柔軟で強力だが、複数プロジェクト管理は.NETより不便に感じる。

この差はコンパイラとテンプレートから来てる。

Javaプロジェクトには公式な標準テンプレートがないため、IDEはプロジェクトのフォルダ整理くらいしかしてくれません。そのぶん自分で任意のディレクトリをSourceRootやResourceRootに決めたりでき、非常に柔軟性に優れています。しかし、柔軟がゆえにチーム開発においてプロジェクト管理の負担が増えるデメリットにもなる。まぁ、MavenやGradleのおかげでJavaのカオス時代は終焉しました。

言語の特性

分類 .NET Java
クラス構成 namespace : 命名空間と実際のディレクトリ構成と一致しなくても構わない Package : 命名空間とディレクトリは一致せなばならん
クラス csファイル : クラス名とファイル名は一致しなくてもOK javaファイル : クラス名とファイル名は一致しなくてもOK、だたし、1つのクラスで定義できるpublicクラスは1つのみ
コンパイル出力 .dll, .exeファイル .jar, .warファイル

Webフレームワーク

.NETのWebフレームワークはMicrosoft公式のものがデファクトスタンダードです。Javaは公式のServlet APIあるが、デファクトスタンダードはSpringです。MVCフレームワークで比較して行きたいと思います。

機能 .NET Java 解説
コア機能 ASP.NET Servlet
MVCフレームワーク ASP.NET MVC Spring MVC
テンプレートエンジン Razor Thymeleaf Razorは直感的で使いやすい、Springはテンプレートエンジンの提供がなく、MavenからThymeleafを入れられる
データ永続層 Entity Framework Hibernate or MyBatis EFは簡単で習得しやすい。JavaのHibernateは簡単だけど癖がある、 MyBatisはゴリゴリSQL書く必要がある。

.NETのWebフレームワークは最初からテンプレートエンジンやデータ永続層を提供してくれるので理解しやすく習得が早い。JavaのWebフレームワークはテンプレートエンジンとデータ永続層は選択肢が豊富でプロジェクトの特性に合わせて柔軟に構成できます。Javaのデータ永続層に関して欧米ではHibernateが人気、アジア圏はMyBatisの使用者が多い。(※Googleドレンド調べ)

個人的にデータ永続層なら.NETのEntity FrameworkはHibernateとMyBatisのいいとこ取りして、使ってて心地よい。

デプロイ

.NET Coreのおかげで.NETはやっとWindowsのみの呪縛から開放され、選択肢が増えて非常に喜ばしい。正直、デプロイに関してはもはや.NETもJavaも大差ない。

責務 .NET Java
OS Window, Linux Windows, Linux
Webサーバー IIS, Kestrel Tomcat

IISはGUIなので簡単にデプロイできるが、Windowsでしか使えない難点がある。

まとめ

Javaも.NETも各々の良さがあり、優劣をつけられるものではありません。

フレームワークは所詮手段に過ぎず、両方のフレームワークの特性を理解することで目的を達成するための最適な選択ができるようになります。

しかし、生態圏でいうとJavaのほうが圧倒的に有利です。コミッターの数も.NETの比ではない。
私は.NET畑出身なので、どうしても.NETに愛着がわきます。でも、仮に「新人にNETとJavaどっち勉強したほうがいい?」って聞かれたら、「Windowsに拘らなければJavaのほうがいいよ」とJavaを勧めます。

結局技術は一時的なものでで、生態圏は永遠です。PHPが未だに現役なのもこのためです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

StringUtils#containsAnyメソッドの注意

org.apache.commons.lang3.StringUtilsクラスのcontainsAnyはオーバーロードされたいくつかのメソッドがあるが、ハマりやすい挙動があるため注意。

第2引数がCharSequence

public static boolean containsAny(final CharSequence cs, final CharSequence searchChars) 

の方のメソッドは、第2引数の文字列に含まれるいずれかの文字が含まれていた場合にtrueとなる。

// 例
StringUtils.containsAny("abcde", "aaa"); // true

StringUtils.containsAny("abcde", "efghi"); // true

第2引数がCharSequence...

public static boolean containsAny(final CharSequence cs, final CharSequence... searchCharSequences)

の方のメソッドは、第2引数の文字列配列に含まれるいずれかの文字列が含まれていた場合にtrueとなる。(今回は、こちらが想定していた挙動)

// 例
StringUtils.containsAny("abcde", "aaa", "bbb", "ccc"); // false

StringUtils.containsAny("abcde", "cde", "def", "efg"); // true

可変引数のメソッドなのに、引数の数が1のときだけ挙動が変わるメソッド(のように見える)のため、これからバリエーション増えそうだからStringUtils.contains()じゃなくてStringUtils.containsAny()にしとこうという安易な考えでハマらないように注意。

以下のように無理やりキャストすることで、可変引数のメソッドの方を呼び出すようにできる。

StringUtils.containsAny("abcde", new String[]{"aaa"}); // false

StringUtils.containsAny("abcde", new String[]{"efghi"}); // false
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む