JJUG CCC 2023 fall
GMOインターネットグループ ブース企画
「Java クイズチャレンジ 監修 GMOペイメントゲートウェイ」
■クイズで知る!GMO ペイメントゲートウェイ
Q1. GMOペイメントゲートウェイ株式会社は決済のオンライン化やキャッシュレス化を推進するサービスを展開しています。しかし、日本のEC(電子商取引)化率やキャッシュレス比率は、諸外国と比較して依然として低いのが現状です。では、2022年時点の日本のEC化率とキャッシュレス比率の組み合わせで正しいものはどれでしょうか。
1.EC化率 :9.1% キャッシュレス比率 :36.0%
2.EC化率 :8.8% キャッシュレス比率 :36.0%
3.EC化率 :8.8% キャッシュレス比率 :32.5%
4.EC化率 :9.1% キャッシュレス比率 :32.5%
【解答】 1
2022年のEC化率:9.1%、2022年のキャッシュレス比率:36.0%
2021年のEC化率:8.8%、2021年のキャッシュレス比率:32.5%
当社は中長期的に大きな拡大余地を残した市場にてビジネスを展開している成長企業です!
市場の成長を享受しつつ、新たなビジネスにも挑戦をし、持続的な成長を実現して参ります。
--------
■Javaクイズ
監修:
GMOインターネットグループ デベロッパーエキスパート 駒井 直
GMOペイメントゲートウェイ 佐藤 宗一郎
--------
Q2. 以下はある本のカバーイラストです。この本のタイトルは以下のどれでしょうか。
1. Effective Java Programming Language Guide
2. Effective Java 第2版
3. Effective Java 第3版
4. Effective Java 第4版
【解答】 3
初版には電動ドリルがありません。2版は劇画タッチでしたが、3版はのっぺりしています。4版について、2022年2月時点でJoshua Blochはまだ書き始めておらず、数年後には…と発言しています。
--------
Q3. 次のコードを実行した場合、どういう結果になるでしょうか。Javaのバージョンは21です。
try{
List<String> list = new ArrayList<>();
list.add("P");
list.add("G");
list.removeFirst();
list.get(0);
System.out.print("p");
list.addLast("M");
list.getFirst();
System.out.print("a");
list.removeFirst();
list.get(0);
System.out.print("y");
list.removeLast();
list.getLast();
list.get(0);
System.out.print("ment");
}catch(IndexOutOfBoundsException e){
System.out.print("gateway");
}finally{
System.out.print("!");
}
1."payment!"
2."paygateway!"
3."pay!"+実行時例外
4.コンパイルエラー
【解答】 3
SequencedCollectionの基本的なAPI知識です。removeLast()で空になった配列から要素取得を試みた場合、SequencedCollection#getLast()はNoSuchElementExceptionをスローします。
List#get(i)はIndexOutOfBoundExceptionをスローするので、最後のgetLastとget(0)が逆ならpaygateway!になりました。ところで、IndexOutOfBoundExceptionは"指標が範囲外です"と丁寧に教えてくれているけど、NoSuchElementExceptionは"そんな要素は無ぇよ"と強めに怒られている気がします。 "No!Such!"の響きがそう思わせるんでしょうか。どうでもいいですね。
--------
Q4. 次のコードを実行した場合、どういう結果になるでしょうか。Javaのバージョンは21です。
Object a = "gmo";
Object b = null;
Object c = "pg";
switch (a) {
case String a -> System.out.print("G");
case Integer a -> System.out.print("M");
case null,default -> System.out.print("O");
}
switch (b) {
case String b -> System.out.print("-");
case Integer b -> System.out.print("P");
case null,default -> System.out.print("G");
}
switch (c) {
case String c when c.length() < 3 -> c.toUpperCase();
case String c -> System.out.print("PAY");
default -> System.out.print("MENT");
}
System.out.print(c);
}
1."G","G","PG"
2.コンパイルエラー
3. "G","G","pg"
4."G","G","PAY","PG"
【解答】 3
Java21の「441: Pattern Matching for switch」の問題。同じ変数名「c」を定義してcase句で加工しているがswich句の外には影響しないため最後の出力は「pg」となる。
--------
Q5. Virtual Threadsを利用する事で、JVMのスループットが最も向上すると思われる場面は、次のうちどれでしょうか。
1.データ分析パイプラインの中で、大量テキストのベクトル化をvirtual threadで並列実行する
2.アクセスの多いweb apiサービスの処理において、依存する外部APIの呼び出しをvirtual threadで実装する
3.GUIアプリでボタン押下後の画像生成をvirtual threadを用いてバックグランドで行う
4.上記はすべて等しく効率化される
【解答】 2
Virtual Threadsは、I/Oなど計算処理以外の部分で待ちが発生する場合に、JVM上で仮想スレッドを他の処理に受け渡す事で、OSのコンテキストスイッチを回避しJVMのスループットを上げるアーキテクチャです。
従って、この選択肢の中では外部I/O(web apiの呼び出し)を待ちながら並列して多数のワークロードを実行する2のユースケースで効率化が大きく、ベクター化や画像生成のようにOSの演算処理リソースを要求するワークロードではvirtual threadsの恩恵は相対的に小さくなると思われます。