正确答案:D
Java中集合分为三种
Set,List,Map
Set集合代表不可重复,List代表有序可重复的集合,Map带变得具有映射关系的集合
Java中的集合的接口主要由collection和map来实现
collection
set:EnumSet,SortedSet:TreeSet,HashSet:LickedHashSet
List:ArrayList,Vector:stack
Queue:Deque:LinkedList,PriorityQueue:ArrayQueue,
Map:
EnumMap,HashMap:LickedHashMap,HashTable:Properties,sortedMap:TreeMap,WeakHashMap
Integer i = 42;
Long l = 42l;
Double d = 42.0;
A (i == l)
B (i == d)
C (l == d)
D i.equals(d)
E d.equals(l)
F i.equals(l)
G l.equals(42L)
正确答案: G
可以自动拆箱封箱
int a=100;
Integer a1=100;
System.out.println(a==a1);//最后输出的结果是true
两个Integer进行比较,如果两个的值在-128~127之间的时候,结果为true
简单来说原因就是因为在最开始的时候Integer a=100;
变量a为Integer类型,而1为int类型,且Integer和int之间并无继承关系,
按照Java的一般处理方法,这行代码应该报错。
但是因为有自动装箱,自动拆箱装箱是指什么呢?
将基本数据类型数据转换为对应的包装器类对象叫做装箱。
将包装器类对象转换为对应的基本数据类型数据叫做拆箱。
所有基本数据类型包装类,都提供通过向包装类构造器中传入一个字符串参数的方式来创建包装类对象。
但是如果传入的字符串参数不符合基本数据类型格式,那么将引发java.lang.NumberFormatException异常。数据转换格式化异常。
在为Integer类型的变量赋int类型值时,Java会自动将int类型转换为Integer类型,
Integer a=Integer.valueof();
Integer a = 1;即,Integer a = Integer.valueOf(1);
valueOf()方法返回一个Integer类型值,并将其赋值给变量a。这就是int的自动装箱。
具体的描述我就不说了,为什么Integer在-128~127之间会相等呢?
按照正常道理来说两个对象用来判断会判断他们的地址是否相同,
但是在:Integer.class在装载(Java虚拟机启动)时,其内部类型IntegerCache的static块即开始执行,
实例化并暂存数值在-128到127之间的Integer类型对象。
当自动装箱int型值在-128到127之间时,即直接返回IntegerCache中暂存的Integer类型对象。
基本类型 | 装箱类型 | 取值范围 | 是否缓存 | 缓存范围 |
---|---|---|---|---|
byte | Byte | -128 ~ 127 | 是 | -128 ~ 127 |
short | Short | -2^15 ~ (2^15 - 1) | 是 | -128 ~ 127 |
int | Integer | -2^31 ~ (2^31 - 1) | 是 | -128 ~ 127 |
long | Long | -2^63 ~ (2^63 - 1) | 是 | -128 ~ 127 |
float | Float | – | 否 | – |
double | Double | – | 否 | – |
boolean | Boolean | true, false | 是 | true, false |
char | Character | \u0000 ~ \uffff | 是 | \u0000 ~ \u007f |
.equals方法会先比较类型,在比较值,如果都相同才会返回true
我们来分析一下.equals方法,下面是String重写.equals方法
为了String本身的方便调用,他自己重写了方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
如果是String本身重写的方法,会先进行判断,先看他是否内存相等,如果不相等
看他是不是String的实例
instanceof,就是看看这个实例是不是属于这个类
很多类也会自己重写.equals方法为了便于使用,例如说Integer,还有我们自己写的类,比如说你需要完成一个学生管理系统
可以重写.equals方法进行判断学生是否是重复的
基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,
基本型转换为其封装类型,再进行的比较。
int a=1;
int b=2;
Integer c=3;
System.out.println(c.equals(b+a));//最后的答案是true