基本类型与引用数据类型及其比较-创新互联
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
10年积累的成都网站制作、成都网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有肇东免费网站建设让你可以放心的选择与我们合作。1.1 整数型
整数型分别包括byte(8位)、short(16位)、int(32位)、long(64位)。
浮点型包括float(32位单精度浮点数)、double(64位双精度浮点数)。
1.2 字符型
char 类型是一个单一的 16 位 Unicode 字符。
1.3 布尔型
boolean类型作为标志用来表示真或假,只有两个取值true和false。
2.引用数据类型在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。
对象、数组都是引用数据类型。
所有引用类型的默认值都是null。
一个引用变量可以用来引用任何与之兼容的类型。
3.元素的比较 3.1 基本类型的比较在Java中,基本类型的对象可以直接使用 >,<,==,!= 操作符比较大小,此时比较的是值的大小。
public class TestCompare {
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a >b);
System.out.println(a< b);
System.out.println(a == b);
char c1 = 'A';
char c2 = 'B';
System.out.println(c1 >c2);
System.out.println(c1< c2);
System.out.println(c1 == c2);
boolean b1 = true;
boolean b2 = false;
System.out.println(b1 == b2);
System.out.println(b1 != b2);
}
}
3.2 引用数据类型的比较Java中引用类型的变量不能直接按照 >或者< 方式进行比较。但是可以使用==直接比较,因为:对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equal方法,而==默认情况下调 用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址,但有些情况下该种比较就不符合题意。
在需要比较引用对象内容的情况下,我们该如何处理?
想象以下一个场景,在我们手中有一副扑克牌,扑克牌包括花色和牌号,我们将其抽象为Card类,属性包括牌号 rank 和花色 suit,在这种情况下,我们要比较牌的大小,需要比较的是对象的rank值,应该如何实现?在这里,给出以下三种方式。
3.2.1 覆写基类的equals方法
public class Card {
private int rank;
private String suit;
public Card(int rank,String suit){
this.rank = rank;
this.suit = suit;
}
@Override
public boolean equals(Object o) {
if(this == o){
return true;
}
if(o == null || !(o instanceof Card)){
return false;
}
Card c = (Card)o;
//rank属于基本数据类型,直接使用==符号比较 suit属于引用数据类型,调用equals方法比较
return rank == c.rank && suit.equals(c.suit);
}
}
一般覆写 equals 的套路就是上面演示的
1. 如果指向同一个对象,返回 true
2. 如果传入的为 null,返回 false
3. 如果传入的对象类型不是 Card,返回 false
4. 按照类的实现目标完成比较,例如这里只要花色和数值一样,就认为是相同的牌
5. 注意下调用其他引用类型的比较也需要 equals,例如这里的 suit 的比较 覆写基类equal的方式虽然可以比较,但缺陷是:equal只能按照相等进行比较,不能按照大于、小于的方式进行比较。
3.2.2 基于Comparble接口类的比较
对用用户自定义类型,如果要想按照大小与方式进行比较时:在定义类时,实现Comparble接口即可,然后在类 中重写compareTo方法。
public class Card implements Comparable{
private int rank;
private String suit;
public Card(int rank,String suit){
this.rank = rank;
this.suit = suit;
}
@Override
public boolean equals(Object o) {
if(this == o){
return true;
}
if(o == null || !(o instanceof Card)){
return false;
}
Card c = (Card)o;
//rank属于基本数据类型,直接使用==符号比较 suit属于引用数据类型,调用equals方法比较
return rank == c.rank && suit.equals(c.suit);
}
@Override
public int compareTo(Card o) {
if(o == null){
return 1;
}
if(rank - o.rank == 0){
return 0;
}
return rank-o.rank >0 ? 1 :-1;
}
}
3.2.3 基于比较器比较
import java.util.Comparator;
public class Card implements Comparable{
private int rank;
private String suit;
public Card(int rank,String suit){
this.rank = rank;
this.suit = suit;
}
@Override
public boolean equals(Object o) {
if(this == o){
return true;
}
if(o == null || !(o instanceof Card)){
return false;
}
Card c = (Card)o;
//rank属于基本数据类型,直接使用==符号比较 suit属于引用数据类型,调用equals方法比较
return rank == c.rank && suit.equals(c.suit);
}
@Override
public int compareTo(Card o) {
if(o == null){
return 1;
}
if(rank - o.rank == 0){
return 0;
}
return rank-o.rank >0 ? 1 :-1;
}
class cardComparator implements Comparator{
@Override
public int compare(Card o1, Card o2) {
if (o1 == o2) {
return 0;
}
if (o1 == null) {
return -1;
}
if (o2 == null) {
return 1;
}
return o1.rank - o2.rank;
}
}
}
按照比较器方式进行比较,具体步骤如下: 1.用户自定义比较器类,实现Comparator接口
2.覆写Comparator中的compare方法
3.3 三种方式对比
覆写的方法 | 说明 |
Object.equals | 因为所有类都是继承自 Object 的,所以直接覆写即可,不过只能比较相等与否 |
Comparable.compareTo | 需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于内部顺序 |
Comparator.compare | 需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性强 |
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站标题:基本类型与引用数据类型及其比较-创新互联
分享地址:http://cdiso.cn/article/ecghi.html