2
2

More than 1 year has passed since last update.

Java Silver SE11 3章

Last updated at Posted at 2021-12-28

Java Silver SE11 3章

黒本をもとに学んだことをアウトプットしていきます。
主に問題を解いていて、間違えた箇所もしくは知らなかった内容になります。

インクリメント デクリメント

変数の値に1を加算、減算するための演算子。

public class Main {
	public static void main(String[] args) {
		int a = 3;
		int b = a += 5; //1.a = a+5 2.b = a
		System.out.println(a); //8
		System.out.println(b); //8

		//コンパイルエラー intにlongを格納させようとしている
		int c = 2 * 3L; //エラー

		int d = 10;
		int e = d++ + d + d-- - d-- +  ++d; // 10 11 11 10 10
		System.out.println(e); //32

		int f = 10;
		int g = f++ + f; // 10 11
		System.out.println(g); //21
		int h = 10;
		int i = ++h + h; // 11 11
		System.out.println(i); // 22
	}
}

関係演算子

左右オペランドを比較し真偽値を戻す演算子のこと。

演算子 内容
a == b aとbが等しければtrue
a !=b aとbが等しくなければtrue
a > b aがbより大きければtrue
a >= b bがa以下であればtrue
a < b bがaより大きければtrue
a <= b aがb以下であればtrue
a instanceof b aがbと同じクラスかbのサブクラスのインスタンスであればtrue

理論演算子

複数の関係演算子を組み合わせて、条件を指定することができる。
「&&」と「||」は、条件1(左オペランド)が「&であればfalse」「||がtrue」であれば、
条件2(右オペランド)を確認(評価)しない。

演算子 内容
a & b aとbの両方がtrueであればtrue (aとb両方を評価する)
a && b aとbの両方がtrueであればtrue (aがfalseであれば、b両方を評価しない)
a | b aもしくはbのいずれかがtrueであればtrue (aとb両方を評価する)
a || b aもしくはbのいずれかがtrueであればtrue (aがtrueであれば、bを評価しない)
!a aがtrueであればfalse

同一性 同値性

同一

  • 複数の変数が同じインスタンスを参照していること
  • ==演算子で判別する

同値

  • インスタンスは異なるが同じ値をもっていること
  • Objectクラスにあるequalsメソッドで判別する
    • equalsメソッドは、オーバーライドを前提としている
    • nullが引数として渡された時は、falseを返す

equalsメソッド
自分自身への参照を表すthisと、引数の参照を比較している。

Objectクラスのequalsメソッド
public boolean equals(Object obj){
  return (this == obj);
}
Sampleクラス
package chapter3_operator.Q10;

public class Sample {
	 private int num;

	public Sample(int num) {
		this.num = num;
	}

	public boolean equals(Sample obj) {
		if (obj == null) {
			return false;
		}
		return this.num == obj.num;
	}

	public Sample getThis() {
		return this;
	}
}
Mainクラス
public class Main {
	public static void main(String[] args) {

		// Objectクラスで宣言
		Object a = new Sample(10);
		Object b = new Sample(10);
		// Sampleクラスで宣言
		Sample c = new Sample(10);
		Sample d = new Sample(10);

		System.out.println(a == b);      // false
		System.out.println(a.equals(b)); // false
		System.out.println(c == d);      // false
		System.out.println(c.equals(d)); // true
		System.out.println(c.getThis()); // Sample@7344699f
		System.out.println(d.getThis()); // Sample@6b95977
	}
}
nullが渡された場合
public class Main {
	public static void main(String[] args) {
		Object a = new Object();
		Object b = null;
		System.out.println(a.equals(b)); // false
	}
}

コンスタントプール

文字列リテラルは大量に登場するためメモリを大量に消費する。
そこで定数値として、インスタンスとは異なる定数用のメモリ空間に作成され、
そこへの参照が変数に格納される。

これにより同じ文字列リテラルが登場すると、参照が使い回されメモリ消費を軽減できる。
(文字列リテラルのみ有効で、new演算子を用いた場合は新しいインスタンスが作成され、それぞれの変数が異なる参照を持つ。)

実際に検証
public class Main {
  public static void main(String[] args) {

    String st1 = new String("Sample");
    String st2 = st1;
    System.out.println(st1 == st2); //true
    System.out.println(st1.equals(st2)); //true
    System.out.println("=====");

    String st3 = new String("Sample");
    String st4 = new String("Sample");
    System.out.println(st3 == st4);  //false
    System.out.println(st3.equals(st4)); //true
    System.out.println("=====");

    String sample1 = "Sample";
    String sample2 = "Sample";
    System.out.println(sample1 == sample2); //true コンスタントプールが影響
    System.out.println(sample1.equals(sample2)); //true
  }
}

if文

  • Javaではthenはない
  • 下記3種類のif文で、{}は省略可能
  • 省略した場合は次の1文に対して、条件に合致した時の処理として実行される
  • elseとifの間は改行はできない
if文
if (条件){
  //条件に合致した時の処理
}

if (条件){
  //条件に合致した時の処理
} else {
  //条件に合致しなかった時の処理
}

if (条件A){
  //条件Aに合致した時の処理
} else if (条件B) {
  //条件Bに合致した時の処理
} else if (条件C)  {
  //条件Cに合致した時の処理
} else {
  //全ての条件に一致しなかった時の処理
}
public class Main {
	public static void main(String[] args) {
		int num = 10;
		// thenは使えない {}は省略可能
		if (num >= 10)
			System.out.println("OK"); //OK

		if (false)
			System.out.println("A"); //表示されない if文内にある
			System.out.println("B"); //Bは表示される if文とは無関係
	}
}

switch文

  • 条件式が戻せる型には制限がある
    • long、double、float、boolean型は使えない
  • case値は以下の条件を満たす必要がある
    • 条件式が戻す値と同じ型か互換性がある型
    • final宣言された定数もしくは、リテラル、コンパイル時に値が決まるもの
    • nullでないこと
  • breakを記載しない場合、以降の処理をbreakが現れるまで実行する
    • default式も実行される
  • case式に何も記述しない場合、何もしないことになる
    • コンパイルエラーにはならない
switch文
switch (条件式){
  case  : 処理
    break;
  case  : 処理
    break;
  default : 処理
    break;
}

2進数

2進数から10進数に変換する時に、覚えておくと便利な表

128 64 32 16 8 4 2 1
7乗 6乗 5乗 4乗 3乗 2の2乗 2の1乗 2の0乗
10進数100を2進数で表すと?
100-64=36
36-32=4
答え: 1100100
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2