我有很多概念都没明白,现在反过头来认识。
Object是所有类的父类。
java.lang.String也是继承自java.lang.Object中。
先比较一下2个类的toString()、equals()、= = (很多面试题都有),再来说一下String 的特殊。
2个类toString()的比较:
class Test {
public static void main(String [] args) {
Object obj = new Object();
Dog d = new Dog();
String s = new String("abc");
System.out.println("obj = " + obj);
System.out.println("d = " + d);
System.out.println("s = " + s);
}
}
class Dog {}
结果:
obj = java.lang.Object@c17164
d = Dog@1fb8ee3
s = abc
查阅API文档:
Object类的 public String toString() returns
getClass().getName() + '@' + Integer.toHexString(hashCode())
String类的 public String toString() returns
the string itself.
说明String类重写了Object的toString方法。
2个类equals()、= =比较:
class Test {
public static void main(String [] args) {
//比较equals()和==
Dog d1 = new Dog(1);
Dog d2 = new Dog(1);
System.out.println("d1 == d2 " + (d1 == d2)); //false
System.out.println("d1.equals(d2) " + d1.equals(d2)); //false
String s1 = new String("abc");
String s2 = new String("abc");
String s3 = "abc";
System.out.println("s1 == s2 " + (s1 == s2)); //false
System.out.println("s1.equals(s2) " + s1.equals(s2)); //ture
System.out.println("s1 == s3 " + (s1 == s3)); //false
System.out.println("s1.equals(s3) " + s1.equals(s3)); //true
}
}
class Dog {
private int i;
Dog(){}
Dog(int i){
this.i = i;
}
}
"=="是比较2个对象的引用是否指向同一个地址,如果是比较2个基本类型,那么就是比较2个值是否相等。
我new了2个Dog类,他们2个对象的栈引用肯定不能指向同一个堆地址。第二个String对象"=="的比较也是同样道理。所以都返回了false(第三个比较体现了String的特殊类,等下说明)。
查阅jdk的源代码:"equals"在Object中定义为
public boolean equals(Object obj) {
return (this == obj);
}
这就表示一个类如果没有重写该方法的话,它就是比较两个的引用是否指向了同一个地址(和"=="比较是一致的)。
类库里的类基本都重写的该方法,所以是比较2个对象的内容是否一样的(String方法重写了该方法,所以第二个equals比较返回ture),对于外面自己自定义的类,则需要自己重写该方法来达到内容是否相等的逻辑。
特殊对象String的equals()、= =比较:
String s = newString("abc");和String s = "abc";
首先2个对象在内存分布上是不一样的。第2个对象是s的栈引用指向数据片段区的地址(存放字符串常量,静态成员变量)。第1个new出来的对象是s的栈引用指向堆中的地址(存放在堆中)。通过API文档:新创建的字符串对象s是该参数字符串("abc")的副本。
所以如代码所表示:"=="比较是不一样的,equals方法由于String重写了,比较是字符序列。
String s1 = "abc" 和 String s2 = "abc"比较;
"=="和equals方法都返回ture;
s1分配了字符常量"abc",那么再有"abc"要引用给对象,都不会再分配内存空间了。
所以s1 和s2 指向的空间相同,内容也相同。
分享到:
相关推荐
【标题】"my1(java基础+页面设计)"涵盖了两个主要的知识领域:Java基础和页面设计。这是一套学习资源,包括课件、实例、练习、答案以及开发工具的使用指南,旨在帮助初学者掌握Java编程语言的基础知识以及如何在实际...
- **Socket编程**:Java中的Socket类和ServerSocket类是进行网络通信的基础,它们分别代表客户端和服务端的连接。Socket用于建立连接并进行数据传输,ServerSocket则监听特定端口,等待客户端的连接请求。 2. **多...
理解类的定义、构造函数、封装、继承和多态是Java编程的基础。同时,接口也是Java中实现多态性的重要方式。 3. **异常处理**:Java的异常处理机制是通过try-catch-finally语句块来实现的。理解如何正确抛出和捕获...
##Java基础学习记录资料分享 一个纯新手的快速入门,言简意赅,来自一个自学者的提要。参考和部分转载[] Java简介 图片[] 1.Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。 2.Java可运行于多个...
本课程是Java基础课程,有助于快速掌握Java基础语法,理解面向对象思想,为逐步的深入学习打下基础! 本课程是本人呕心沥血制作,转载时请申明。 本课程有部分外部资源必须有外网才能访问。 致谢: 本课程在写作之时...
Java语言入门教程旨在帮助初学者掌握编程基础知识,特别是针对Java编程。这个教程假设读者对编程没有预先的知识,但需要有一定的计算机操作基础,例如文件管理。此外,教程特别指出,无论年龄大小,只要有学习的愿望...
谨以此系列文章,来记录重温Java基础的历程。 为啥费劲写这些文章?和写SpringCloud进阶之路时一样,一是为了巩固自己所学的知识,写下来,远比搞清楚要复杂的多!二是为了写出来,避免大家踩同样的坑,与大家共同...
**JSP简介** JavaServer Pages (JSP) 是一种基于Java技术的动态网页开发标准,它使得开发人员能够轻松地创建包含动态内容的HTML页面。...了解并熟练掌握JSP的基础和特性,对于Web开发人员来说是至关重要的。
- 《Java 核心编程》(Core Java):分为上下两卷,上卷深入讲解Java基础知识,下卷则涉及更实践性的内容,如XML、网络、数据库等。此书对于C++背景的开发者尤其有用,可以帮助理解Java的特性。 2. **进一步提升**...
这篇博客"JAVA数据库连接大全-转载"可能详细介绍了在Java中如何管理和使用数据库连接,包括使用JDBC API,数据库连接池以及相关的工具。这里我们将深入探讨JDBC、数据库连接池的重要性和配置方法。 1. **JDBC基础**...
Java是一种广泛使用的面向对象...这些知识点构成了Java程序设计的基础,包括编程语法、类和对象、数据类型、运算符、流程控制以及Java特有的特性,如Applet和字节码执行。理解和掌握这些内容对于学习Java编程至关重要。
待补充网络通信协议(网络知识相对薄弱,后期补充) Java基础反射JUC多线程及高并发JVM虚拟机MySQL数据库NoSql数据库雷迪斯MQ消息中间件Linux基本命令吉特前世今生GitHub小拓展框架相关第三方API使用
这些题目涵盖了Java编程的基础知识,包括循环控制、线程启动、访问控制和内部类。对于Java开发工程师来说,理解这些概念是非常重要的,它们是编写高效、健壮代码的基础。在面试或笔试中,掌握这些知识将有助于展示...
微信公众号目录算法Java虚拟机春天SpringMVC高并发架构基石-缓存网络篇架构其他主意书单《 Java编程思想(第4版)》-Java领域的圣经,建议稍微有点基础后阅读。不推荐初学者阅读,小心被劝退《深入理解Java虚拟机》-...
1. Java基础:涵盖Java基本语法,数据类型,类和对象,继承,接口,异常处理等核心概念。 2. 容器:包括List、Set、Map等接口的实现类和特点,例如ArrayList、LinkedList、HashMap、TreeMap等,并探讨它们的性能、...
Th is book on Java programming teaches object-oriented design and programming principles in a completely integrated and incremental fashion. Th is book allows the reader to experience the world we ...
java知识体系最强总结版为 转载java知识体系总结,从基础知识到后台开发、大数据等等方面进行全方位解读java,利于学习和求职面试
基础 容器(包括juc) 并发 JVM Java8 计算机网络 计算机操作系统 Linux 数据结构与算法 数据结构 算法 数据库 MySQL mysql(优化思路) 系统设计 秒杀系统相关 前后端分离 单点登录 常用框架 Spring SpringBoot ...
【标题】: "2008十大优秀Java应用程序(转载)" 这些优秀的Java应用程序展示了Java在不同领域的广泛应用和强大性能。以下是对各个程序的详细解释: 10. **无线传感器开发环境Sun SPOT** - Sun SPOT是一个创新的...
Java基础 JVM虚拟机 Spring源码 Netty4.x专题 领域驱动设计 中间件开发 JavaAgent 架构框架搭建 :hot_beverage: Java基础编程 :laptop: 用Java实现jvm虚拟机 :pencil: Spring系列源码解读 :speaker_medium_volume: ...