二 ==与 equals(重要)

二 ==与 equals(重要)

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)

equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

  • 情况 1:类没有覆盖 equals()方法。则通过 equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。
  • 情况 2:类覆盖了 equals()方法。一般,我们都覆盖 equals()方法来两个对象的内容相等;若它们的内容相等,则返回 true(即,认为这两个对象相等)。

举个例子:

public class test1 {
    public static void main(String[] args) {
        String a = new String("ab"); // a 为一个引用
        String b = new String("ab"); // b为另一个引用,对象的内容一样
        String aa = "ab"; // 放在常量池中
        String bb = "ab"; // 从常量池中查找
        if (aa == bb) // true
            System.out.println("aa==bb");
        if (a == b) // false,非同一对象
            System.out.println("a==b");
        if (a.equals(b)) // true
            System.out.println("aEQb");
        if (42 == 42.0) { // true
            System.out.println("true");
        }
    }
}

说明:

  • String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。
  • 当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现这样一个可拓展的后端对象,我们可以先定义一个基本的文章对象。它包含了文章的标题、日期和文本内容等信息: ```java public class Article { private String title; private LocalDate date; private String content; private List<Article> subArticles; public Article(String title, LocalDate date, String content) { this.title = title; this.date = date; this.content = content; this.subArticles = new ArrayList<>(); } public void addSubArticle(Article subArticle) { subArticles.add(subArticle); } // getters and setters } ``` 这个对象有一个重要的属性是 `subArticles`,用来存储子文章。我们可以通过 `addSubArticle` 方法来添加子文章。 接下来,我们可以定义一个 `ArticleCatalog` 对象来管理所有的文章。它包含了一个列表来存储所有的文章: ```java public class ArticleCatalog { private List<Article> articles; public ArticleCatalog() { this.articles = new ArrayList<>(); } public void addArticle(Article article) { articles.add(article); } // getters and setters } ``` 现在我们已经有了基本的文章和文章目录对象。接下来,我们需要考虑如何支持子章节的拓展。 为了支持子章节的拓展,我们可以为每个文章定义一个编号,例如 1、2、3。子文章可以使用父文章的编号加上一个小数作为自己的编号,例如 1.1、1.2、2.1 等等。这样我们就可以很方便地对文章进行拓展。 我们可以修改 `Article` 对象的构造函数,加入一个新的参数 `id`,用来表示文章的编号。我们还需要添加一个 `getId` 方法来获取文章的编号。 ```java public class Article { private String id; private String title; private LocalDate date; private String content; private List<Article> subArticles; public Article(String id, String title, LocalDate date, String content) { this.id = id; this.title = title; this.date = date; this.content = content; this.subArticles = new ArrayList<>(); } public void addSubArticle(Article subArticle) { subArticles.add(subArticle); } public String getId() { return id; } // getters and setters } ``` 现在我们可以为 `ArticleCatalog` 对象添加一个新的方法 `getArticleById`,用来根据文章编号获取文章对象: ```java public class ArticleCatalog { private List<Article> articles; public ArticleCatalog() { this.articles = new ArrayList<>(); } public void addArticle(Article article) { articles.add(article); } public Article getArticleById(String id) { for (Article article : articles) { if (article.getId().equals(id)) { return article; } for (Article subArticle : article.getSubArticles()) { if (subArticle.getId().equals(id)) { return subArticle; } } } return null; } // getters and setters } ``` 现在我们已经可以根据文章编号获取文章对象了。接下来,我们需要添加一个新的方法 `addSubArticleById`,用来根据文章编号添加子文章。这个方法的实现比较复杂,需要对文章编号进行解析,并且要处理好父子关系等问题: ```java public class ArticleCatalog { // ... public void addSubArticleById(String id, Article subArticle) { Article parentArticle = getArticleById(getParentId(id)); if (parentArticle != null) { String subId = getNextSubId(parentArticle, getSubId(id)); subArticle.setId(subId); parentArticle.addSubArticle(subArticle); } } private String getParentId(String id) { int lastDotIndex = id.lastIndexOf("."); if (lastDotIndex >= 0) { return id.substring(0, lastDotIndex); } else { return ""; } } private String getSubId(String id) { int lastDotIndex = id.lastIndexOf("."); if (lastDotIndex >= 0) { return id.substring(lastDotIndex + 1); } else { return id; } } private String getNextSubId(Article parentArticle, String subId) { if (subId.isEmpty()) { int nextSubIndex = parentArticle.getSubArticles().size() + 1; return parentArticle.getId() + "." + nextSubIndex; } else { return parentArticle.getId() + "." + subId; } } } ``` 现在我们已经实现了一个支持子章节拓展的文章管理系统。我们可以通过 `addSubArticleById` 方法来添加子文章,例如: ```java ArticleCatalog catalog = new ArticleCatalog(); Article article1 = new Article("1", "First article", LocalDate.now(), "This is the first article."); Article article2 = new Article("2", "Second article", LocalDate.now(), "This is the second article."); Article article3 = new Article("3", "Third article", LocalDate.now(), "This is the third article."); catalog.addArticle(article1); catalog.addArticle(article2); catalog.addArticle(article3); Article subArticle1 = new Article("", "Introduction", LocalDate.now(), "This is the introduction."); catalog.addSubArticleById("1", subArticle1); // 添加到第一篇文章下面 Article subArticle2 = new Article("", "Conclusion", LocalDate.now(), "This is the conclusion."); catalog.addSubArticleById("2.1", subArticle2); // 添加到第篇文章的第一节下面 Article subArticle3 = new Article("", "Section 1", LocalDate.now(), "This is section 1."); catalog.addSubArticleById("3", subArticle3); // 添加到第三篇文章下面 ``` 这样,我们就可以很方便地拓展文章结构了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值