よくわからないことを調べて解説してみるブログ。
2015
まとめ
・Enumクラスは抽象クラスである。
・EnumクラスはComparableを実装している。
・Enumクラスはequalsをfinal実装している。
・列挙型はEnumクラスを実装している。
・列挙型における列挙値は列挙型の実装である。
・Enumクラスでは、ordinalと呼ばれる順序付け変数を持っており、
列挙値のデフォルトコンストラクタの引数で与えられる。
この引数は、列挙型における列挙値の定義順と同値。
・列挙型は、インタフェースを実装することが出来る。
・列挙型は、new によるインスタンス化はできない。
・列挙型は、メソッドを定義出来る。呼び出し方法は、列挙値.メソッド名。
・列挙型は、抽象メソッドを定義出来る。列挙値ブロックで@Overrideを実装必須。
・列挙型は、内部にインタフェースを定義することが出来る。
併せて読みたい生かし方
・[Java] enum basics
・[Java] enumをもうちょっと使う
・Enumクラスは抽象クラスである。
・EnumクラスはComparableを実装している。
・Enumクラスはequalsをfinal実装している。
・列挙型はEnumクラスを実装している。
・列挙型における列挙値は列挙型の実装である。
・Enumクラスでは、ordinalと呼ばれる順序付け変数を持っており、
列挙値のデフォルトコンストラクタの引数で与えられる。
この引数は、列挙型における列挙値の定義順と同値。
・列挙型は、インタフェースを実装することが出来る。
・列挙型は、new によるインスタンス化はできない。
・列挙型は、メソッドを定義出来る。呼び出し方法は、列挙値.メソッド名。
・列挙型は、抽象メソッドを定義出来る。列挙値ブロックで@Overrideを実装必須。
・列挙型は、内部にインタフェースを定義することが出来る。
併せて読みたい生かし方
・[Java] enum basics
・[Java] enumをもうちょっと使う
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; import java.util.List; public class EunmMethod { public static void main(String[] args) { System.out.println(Arrays.asList(AttackType.values())); System.out.println(AttackType.valueOf("PANCH")); System.out.println("----------------------------------------------"); // インタフェースへのポリモフィズムは有効 Listlist = new ArrayList (); list.add(AttackType.THROW); list.add(AttackType.PANCH); list.add(AttackType.KICK); // Collections.sort(list);// コンパイルエラー。擬態の結果、Enumに実装されていたComparableは未実装扱いに。当然といえば、当然か。 for (AttackTypeInterface superAttackType : list) { System.out.println(superAttackType); } System.out.println("----------------------------------------------"); List list2 = new ArrayList (); list2.add(AttackType.THROW); list2.add(AttackType.PANCH); list2.add(AttackType.KICK); Collections.sort(list2); // ENUM実装クラスにおける列挙順にソートする。Enumに実装されているComparable#compareToによる。 for (AttackTypeInterface superAttackType : list2) { System.out.println(superAttackType + ", ordinal = " + ((AttackType)superAttackType).ordinal()); //順番の表示 } System.out.println("----------------------------------------------"); EnumSet enumSet = EnumSet.allOf(AttackType.class); // Enum実装クラスの集合生成 // EnumSet enumIfSet = EnumSet.allOf(AttackTypeInterface.class); // 上記は、シグネチャ違反になりコンパイルエラー。public static > EnumSet allOf(Class elementType) for (AttackType attackType : enumSet) { System.out.println(attackType); } } } interface AttackTypeInterface { void allCheck(); } enum AttackType implements AttackTypeInterface { PANCH, KICK, THROW, ; @Override public void allCheck() { for (AttackType element : Arrays.asList(AttackType.values())) { System.out.println(this == element); } } // equals はオーバーライドできない。Enum型のfinalメソッドとなっている。 @Override public String toString() { return super.toString(); } }
実行結果
[PANCH, KICK, THROW]PANCH----------------------------------------------THROWPANCHKICK----------------------------------------------PANCH, ordinal = 0KICK, ordinal = 1THROW, ordinal = 2----------------------------------------------PANCHKICKTHROW
PR
2015
- あるオブジェクト同士のequalsメソッドがtrueを返すとき、それぞれのオブジェクトのhashCodeは同一の値を返却しなくてはならない。
- ある2つのオブジェクトのhashCodeが不一致であるとき、そのオブジェクト同士によるequalsメソッドはfalseを返却しなくてはならない。
- ある2つのオブジェクト同士のequalsメソッドがfalseを返すとき、それぞれのオブジェクトはtrue,falseのいずれの値を返却しても良い。
- hashCodeは、同一のオブジェクトであるかぎり、同一の値を返さなくてはならない。
import java.util.HashSet; public class EqualsHashCodeError1 { public static void main(String[] args) { Unit unit1 = new EqualsHashCodeError1().new Unit(1); Unit unit2 = new EqualsHashCodeError1().new Unit(2); HashSet実行結果set = new HashSet (); set.add(unit1); set.add(unit2); System.out.println("unit1 hash = " + unit1.hashCode() + ", set contains unit1 = " + set.contains(unit1)); System.out.println("unit2 hash = " + unit2.hashCode() + ", set contains unit2 = " + set.contains(unit2)); } class Unit { int id; public Unit(int id) { this.id = id; } @Override public int hashCode() { return id++;// hashCodeはいかなる状況でも同じ値を返すこと。 } @Override public boolean equals(Object obj) { return this.id == ((Unit) obj).id; } } }
unit1 hash = 2, set contains unit1 = false
unit2 hash = 3, set contains unit2 = false
例2
import java.util.Hashtable; public class EqualsHashCodeError2 { public static void main(String[] args) { Unit unit1 = new EqualsHashCodeError2().new Unit(1); Unit unit2 = new EqualsHashCodeError2().new Unit(2); Hashtable<Integer, Unit> map = new Hashtable<Integer, EqualsHashCodeError2.Unit>(); for (int i = 0; i < 1000; i++) { map.put(i, new EqualsHashCodeError2().new Unit(i)); } System.out.println("unit1 hash = " + unit1.hashCode() + ", set contains unit1 = " + map.containsValue(unit1)); System.out.println("unit2 hash = " + unit2.hashCode() + ", set contains unit2 = " + map.containsValue(unit2)); System.out.println("unit1 hash = " + unit1.hashCode() + ", set contains unit1 = " + map.containsValue(unit1)); } class Unit { int id; boolean equals; public Unit(int id) { this.id = id; } @Override public int hashCode() { return id;// hashCodeはいかなる状況でも同じ値を返すこと。 } @Override public boolean equals(Object obj) { if (this.id == ((Unit) obj).id) { this.id = (int) Math.random() * 100; return true; // equalsがtrueを返すとき、hashCodeは同じ値となる。 } return false; } } }実行結果
unit1 hash = 1, set contains unit1 = trueunit2 hash = 2, set contains unit2 = trueunit1 hash = 1, set contains unit1 = false
2015
リテラル数値を宣言する際に、
0bを振ることで、2進数の表現が可能。
0xを振ることで、ヘキサ(16進数)での表現が可能。
当然、数値同士なので和を求めることも可能。
アンダースコアには、区切り文字の意味。
0bを振ることで、2進数の表現が可能。
0xを振ることで、ヘキサ(16進数)での表現が可能。
当然、数値同士なので和を求めることも可能。
アンダースコアには、区切り文字の意味。
public class BinaryValue { public static void main(String[] args) { int a = 0b010101; System.out.println(a); a = 0b11; System.out.println(a); a = 0xa; System.out.println(a); a = 0xa + 0b01; System.out.println(a); a = 0b1_1; System.out.println(a); } }
実行結果
21310113
プロフィール
HN:
たんてーくん
性別:
非公開
最新記事
(03/29)
(03/29)
(06/26)
(05/21)
(04/23)
カテゴリー
最新CM
[09/25 http://2017.bblbuy.com]
[09/24 http://www.japanform.com]
[09/23 http://www.japanform.com]
[09/22 http://www.japanform.com]
[09/21 http://2017.bblbuy.com]
ブログ内検索