重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
好程序员Java 培训分享零基础快速入门 Java, 学习 Java ,掌握一些基本的概念是第一步,本文简单为大家介绍一些入门级的内容,希望帮助零基础小白快速入门。
创新互联公司主营黟县网站建设的网络公司,主营网站建设方案,重庆APP开发,黟县h5成都小程序开发搭建,黟县网站营销推广欢迎黟县等地区企业咨询
一、基本概念
JVM : java 虚拟机,负责将编译产生的字节码转换为特定机器代码,实现一次编译多处执行 ;
JRE : java 运行时环境,包含了 java 虚拟机 jvm , java 基础类库。是使用 java 语言编写的程序运行所需要的软件环境 ;
JDK : java 开发工具包,是编写 java 程序所需的开发工具。 JDK 包含了 JRE ,同时还包含了编译器 javac ,调试和分析工具, JavaDoc 。
二、Java 是如何编译和执行的 ?
上图表示了Java 代码是怎么编译和加载的。整个流程从 Java 源码开始,经过 javac 程序处理后得到类文件,这个文件中保存的是编译源码后得到的 Java 字节码。类文件是 Java 平台能处理的最小功能单位,也是把新代码传给运行中程序的唯一方式。
新的类文件通过类加载机制载入虚拟机,从而把新类型提供给解释器执行。
三、Object 的重要方法
所有类都直接或间接扩展 java.lang.Object 类。这个类定义了很多有用的方法,而且你可以根据需求来重写这些方法。
1 、 toString 方法
toString 方法的作用是返回对象的文本表示形式。连接字符串或使用 System.out.println 等方法时,会自动在对象上调用这个方法。给对象提供文本表示形式,十分利于调试或记录日志,而且精心编写的 toString 方法还能给报告生成等任务提供帮助。
Object 类中的 toString 方法返回的字符串由对象所属的类名和对象的十六进制形式哈希码 ( 由 hashCode 方法计算得到,本章节稍后会介绍 ) 组成。这个默认的实现方式提供了对象的类型和标识两个基本信息,但一般并没什么用。
2 、 equals 方法
== 运算符测试两个引用是否指向同一个对象 ( 比较两个内存单元的内容是否一样 ) 。如果要测试两个不同的对象是否相等,必须使用 equals 方法。任何类都能覆盖 equals 方法,定义专用的相等比较方式。 Object.equals 方法直接使用 == 运算符,只有两个对象是同一个对象时,才判定二者相等。
很多类以及自定义类的equals 方法都需要重写,是需要根据场景与需求来定制的。 JDK 自带的许多类往往都是:
对比一些简单的属性值
再对比复杂的属性值or 对比业务上最快能区分对象的值
再对比其他的值or 对比地址、长度
主要为了将那些不匹配的情况尽快排除
3 、 hashCode 方法
Java 中的 hashCode 方法就是根据一定的规则将与对象相关的信息 ( 比如对象的存储地址,对象的字段等 ) 映射成一个数值,这个数值称作为散列值。如果集合中已经存在一万条数据或者更多的数据,如果采用 equals 方法去逐一比较,效率必然是一个问题。
此时hashCode 方法的作用就体现出来了,当集合要添加新的对象时,先调用这个对象的 hashCode 方法,得到对应的 hashcode 值,实际上在 HashMap 的具体实现中会用一个 table 保存已经存进去的对象的 hashcode 值,如果 table 中没有该 hashcode 值,它就可以直接存进去,不用再进行任何比较了 ;
如果存在该hashcode 值,就调用它的 equals 方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用 equals 方法的次数就大大降低了。
另外注意,默认的hashCode 会发起 native 调用,如果用 hashCode 对两个对象对比,会导致开销增大。
hashcode 方法的作用:
只要覆盖了 equals 方法,就必须覆盖 hashCode 方法。 hashCode 方法返回一个整数,用于哈希表数据结构。如果两个对象经 equals 方法测试是相等的,它们就要具有相同的哈希码。
不相等的对象要具有不相等的哈希码( 为了哈希表的操作效率 ) ,这一点很重要,但不是强制要求,最低要求是不相等的对象不能共用一个哈希码。为了满足最低要求, hashCode 方法要使用稍微复杂的算法或位操作。
Object.hashCode 方法和 Object.equals 方法协同工作,返回对象的哈希码。这个哈希码基于对象的身份生成,而不是对象的相等性。 ( 如果需要使用基于身份的哈希码,可以通过静态方法 System.identityHashCode 获取 Object.hashCode 方法的返回值。 )
4 、 hashCode 和 equal 方法
hashCode 的存在主要是用于查找的快捷性,如 Hashtable , HashMap 等, hashCode 是用来在散列存储结构中确定对象的存储地址的 ;
如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的 hashCode 一定要相同 ;
如果对象的equals 方法被重写,那么对象的 hashCode 也尽量重写,并且产生 hashCode 使用的对象,一定要和 equals 方法中使用的一致,否则就会违反上面提到的第 2 点 ;
两个对象的hashCode 相同,并不一定表示两个对象就相同,也就是不一定适用于 equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如 Hashtable ,他们 " 存放在同一个篮子里 " 。
5 、 Comparable::compareTo 方法
如果一个类实现了 Comparable 接口,就可以比较一个实例是小于、大于还是等于另一个实例。这也表明,实现 Comparable 接口的类可以排序。
因为 compareTo 方法不在 Object 类中声明,所以由每个类自行决定实例能否排序。如果能排序就定义 compareTo 方法,实现实例排序的方式。
compareTo 方法返回一个 int 类型的值,这个值需要进一步说明。如果当前对象 (this) 小于传入的对象, compareTo 方法应该返回一个负数 ; 如果两个对象相等,应该返回 0; 如果当前对象大于传入的对象,应该返回一个正数。
6 、 clone 方法
Object 类定义了一个名为 clone 的方法,这个方法的作用是返回一个对象,并把这个对象的字段设为和当前对象一样。 clone 方法不常用,原因有两个。
其一,只有类实现了 java.lang.Cloneable 接口,这个方法才有用。 Cloneable 接口没有定义任何方法 ( 是个标记接口 ) ,因此若想实现这个接口,只需在类签名的 implements 子句中列出这个接口即可。
其二,clone 方法声明为 protected ,因此,如果想让其他类复制你的对象,你的类必须实现 Cloneable 接口,并覆盖 clone 方法,而且要把 clone 方法声明为 public 。
clone 方法很难正确实现,而副本构造方法实现起来更容易也更安全 ;
7 、 finalize 方法
一种古老的资源管理技术叫终结(finalization) ,开发者应该知道有这么一种技术。然而,这种技术几乎完全废弃了,任何情况下,大多数 Java 开发者都不应该直接使用。
只有少数应用场景适合使用终结,而且只有少数 Java 开发者会遇到这种场景。如果有任何疑问,就不要使用终结,处理资源的 try 语句往往是正确的替代品。
终结机制的作用是自动释放不再使用的资源。垃圾回收自动释放的是对象使用的内存资源,不过对象可能会保存其他类型的资源,例如打开的文件和网络连接。垃圾回收程序不会为你释放这些额外的资源,因此,终结机制的作用是让开发者执行清理任务,例如关闭文件、中断网络连接、删除临时文件,等等。
终结机制的工作方式是这样的:如果对象有 finalize 方法 ( 一般叫作终结方法 ) ,那么不再使用这个对象 ( 或对象不可达 ) 后的某个时间会调用这个方法,但要在垃圾回收程序回收分配给这个对象的空间之前调用。终结方法用于清理对象使用的资源。
另外注意,这是一个实例方法。而在类上,没有等效的机制。