本日のTIL
前提として。
Java 書いたことないんじゃあ! Java どころか静的型言語をまともに書いたことがありませんでした。 今までやってきたのは JS ( 主にサーバーサイドNode.js ) と Ruby ( Rails ) でした。 しかもやってきたと言ってもたかだか一年間で、エンジニアとしてのバイトやインターンは複数の会社でやっていましたがまだまだひよっこです。 そんな私がマネーフォワードに入社するにあたり Java を書くことになって、インターン期間中は Java の勉強をしていました。
この記事を読むときは一応前提として上記のことを頭においていただければなと思います。
Java のコレクション
Java には様々な種類のコレクションがあるのですが、そのうち私がこの一週間半で使ってみたコレクションについてまとめます。
配列
配列という言葉はお馴染みのものですが、Java の配列は私が知っている JS や Ruby の配列とは決定的に違うことが一つありました。 長さが変えられない ということです。
また、初期化の方法も少し馴染みのない感じでした。
// 例えばこんな感じとか
int array[] = new int[5];
// こんな感じ
int array[] = { 1, 2, 3, 4, 5 };
# 例えばこんな感じとか
array = Array.new(5)
# こんな感じ
array = [1, 2, 3, 4, 5]
array[]
という書き方や {
}
で囲うのは新鮮だなあと感じました ( だからと言ってどうというわけでもないのですがw )。
リスト
リストも配列と同じような複数のデータを扱うためのデータ構造です。 ただし、サイズの変更が可能です。
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
System.out.println(list.get(0)); //=> 1
list.set(0, 0);
System.out.println(list.get(0)); // => 0
list = []
list << 1 << 2
# list.push(1, 2)
p list[0] # => 1
list[0] = 0
p list[0] # => 0
こうして書くと Ruby ってものすごくスッキリしてるなあって改めて思いますね。 Ruby や JS でいう配列が Java でいう ArrayList なのかなと思って今の所使っています。 リストには ArrayList の他にも具象クラスがあるそうですが、公式ドキュメントを読んでもよくわかりませんでした……。 「これは知っておいたほうがいいよ」というものがありましたら教えてくださると嬉しいです!
マップ
キーに関連付けてデータ ( 値 ) を格納するデータ構造です。 いわゆる連想配列だと理解しています。
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("a", 1);
map.put("b", 2);
System.out.println(map.get("a")); // => 1
map.put("a", 0);
System.out.println(map.get("a")); // => 0
map = {}
map[:a] = 1
map[:b] = 2
p map[:a] # => 1
map[:a] = 0
p map[:a] # => 0
こちらも色々な具象クラスがあって、順番を保持しない HashMap, 挿入された順に順番を保持する LinkedHashMap, キーの自然順序付け (具体的にどういう順序付けなのか詳しく調べてないです申し訳ないです。) に従ってソートされる TreeMap などがあるみたいです。 リストの時と同じく「これ知っておいたほうがいいよ」というのがありましたら教えてください。
セット
重複要素のないコレクションです。 これは私の知る限り JS にはないコレクションですね ( ES2017とか最新のものを追っていないので知らないだけかも…… )。
Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(1);
System.out.println(set); // => [1]
set = set.new
set << 1 # set.add(1)
set << 1
p set # => #<Set: {1}>
セットにも HashSet, LinkedHashSet, TreeSet というマップの時と似た具象クラスがありますね。
ふう。
結構長かったですね。 本当は各コレクションについての反復処理とかについても書きたかったのですが、 Java のループもなんだか色々あってまだまとめられるレベルになっていないので今回はここまでです。 自分が知っているものに当てはめて覚えた方が物事の習得が早くなると聞いてなんとなく Ruby と並べて書いてみましたが、だいたい同じことを書いているつもりなので間違い勘違い等見つけてくださった方は是非教えてください。
まとめ
そんなこんなでインターン期間を終えて、4月から正社員としてマネーフォワードで働きます! Java と Rails どっちもバリバリ書いてたくさんの価値を生み出せるサーバーサイドエンジニアを目指していますので皆さんよろしくお願いします!
comments powered by Disqus