基本类型与引用数据类型及其比较-创新互联

1.基本数据类型

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://azwzsj.com/article/ecghi.html