思维导图:

Java常用类

一、Object

  1. Object 是所 Java 类的跟基类;
  2. 累的生命中未使用 extends 关键字指明基类时,默认基类为 Object;

1. toString

默认打印:ClassName@内存地址

子类可以重写;

2. finalize

不推荐使用

Java 中的内存管理和 objc 中的管理有何异同?Android 中的内存管理又是怎样的?

3. equals

== 比较的是值,因此引用类型比较的是引用的内存地址,而 Object 对象的 equals 方法默认实现是比较内存地址是否相等;

String 重写了 equals 方法;

4. hashCode

该方法返回对象的内存地址经过哈希算法之后的值;

该方法的返回值可以近似的看做是对象的内存地址,如果对象相等(equals),那么hashCode() 的返回值必须一致,反之不一致;

二、String

略;

详情见Java:常量池;

提一嘴:

String 类重写了 hashCode() 方法,其内部逻辑是对字符串进行 hashCode 并返回,所以只要字符串相等,那么 hashCode() 函数的返回值都相等,不能用这个返回值当做内存地址,需要调用 System.identityHashCode(instance) 来获取真实的 hashCode。该方法本质是无论类是否重写了 hashCode() 方法,都只会调用 Object 的 hashCode() 方法;

三、 包装类

1. 概念

8 中基本数据类型对应有 8 中包装类。包装类属于引用数据类型,父类是 object

为什么需要包装类

面向对象的编程中,方法入参基本都是引用类型,基础类型就不能当做参数传递。所以需要一个包装类型来进行传递,在使用时在拆包;

8 中基础类型对应的包装类:

image.png

2. 拆箱和装箱

  • 拆箱

Number 是一个抽象类,有拆箱方法,需要子类实现;

  • 装箱

在 JDK5.0之前是不允许直接将基本数据类型的数据直接赋值给其对应地包装类的,如:Integer i = 5;

但是在JDK5.0中支持这种写法,因为编译器会自动将上面的代码转换成如下代码:Integer i=Integer.valueOf(5);

这就是 Java 的装箱.JDK5.0也提供了自动拆箱:

// 自动装箱
Integer i =5;
// 自动拆箱
int j = i;

特别注意:

  • 双等号不会自动拆箱,只有在运算的时候才会有自动拆箱,装箱的本质还是创建了包装类对象;

3. 包装类的常量池技术

来看一个例子:

代码1:

Integer a = 128;
Integer b = 128;
System.out.println(a == b); //false

这是因为双等号时不会自动拆箱,而 == 的本质是调用 hashCode 并判断值是否相等,所以这里是 false;

代码2:

Integer a = 127;
Integer b = 127;
System.out.println(a == b); //true

原因:

Java 中基本类型的包装类大部分都实现了常量池技术: Byte、Short、Integer、Long、Character、Boolean;只有浮点数类型的包装类没有实现。而且, Byte、Short、Integer、Long、Character 这 5 种类型只有在值小于 127 时才使用常量池,即对象常量池不负责创建和管理大于 127 的这些类对象;

因此,a 和 b 得到的对象都是常量池中的对象,是同一个,所以相等;

包装类具体实现详见:Java:常量池

PS:包装类没有字符串的 intern 方法,所以不能向常量池中添加新的常量对象;

Integer 整数常量池源码实现:

image.png

代码逻辑:静态代码块在 Integer 第一次使用时执行,创建了 256 个 Integer 对象存放在 cache 数组中。cache 数组使用 final 修饰,存储在静态区。整数型常量池的本质就是内存缓存;

四、Enum

1. 基本使用

public class EnumTest {public static void main(String[] args) {XKType.values()XKType type = XKType.XKType1;switch (type){case XKType1:System.out.println("Type1");break;case XKType2:System.out.println("Type2");break;case XKType3:System.out.println("Type3");}}}enum XKType {XKType1,XKType2,XKType3
}

3. 原理

  1. 是一个类;

使用 javac 指令编译 java 文件之后会生成一个枚举类型对应的类:

枚举类

  1. public static final ;
内部实现

枚举类的内部会使用 public static final 生成对应的枚举值;

这里反编译代码已经没有具体实现了,但是网上看到了具体的实现代码,可能和 JDK 或者 javap 指令的版本有关,以下是一个星期一到星期天的枚举实现:

.java 文件:

// 字符串最好使用大写
enmu Day {SUNDAY,MONDAY, TUESDAY, WEDNESDAY,THURSDAY, FRIDAY, SATURDAY
}

反编译 .class 文件:

//反编译Day.class
final class Day extends Enum
{//编译器为我们添加的静态的values()方法public static Day[] values(){return (Day[])$VALUES.clone();}//编译器为我们添加的静态的valueOf()方法,注意间接调用了Enum也类的valueOf方法public static Day valueOf(String s){return (Day)Enum.valueOf(com/zejian/enumdemo/Day, s);}//私有构造函数private Day(String s, int i){super(s, i);}//前面定义的7种枚举实例public static final Day MONDAY;public static final Day TUESDAY;public static final Day WEDNESDAY;public static final Day THURSDAY;public static final Day FRIDAY;public static final Day SATURDAY;public static final Day SUNDAY;private static final Day $VALUES[];static {    //实例化枚举实例MONDAY = new Day("MONDAY", 0);TUESDAY = new Day("TUESDAY", 1);WEDNESDAY = new Day("WEDNESDAY", 2);THURSDAY = new Day("THURSDAY", 3);FRIDAY = new Day("FRIDAY", 4);SATURDAY = new Day("SATURDAY", 5);SUNDAY = new Day("SUNDAY", 6);$VALUES = (new Day[] {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY});}
}

原文链接:https://blog.csdn.net/javazejian/article/details/71333103

如上代码所示,枚举类的实现方式大概为:

  1. 按照枚举名新建一个枚举类;
  2. 类中按照枚举值添加成员属性,且使用 pulic static final 修饰;
  3. 构造方法中为 String 类型的枚举值赋 Int 类型的值,完成关联。以此达到使用 String 的形式来使用,但本质还是 Int 来进行区分;
  4. 静态代码块中确保类在被加载时,所有的枚举值被添加到 VALUES 数组中,供 values() 方法访问;

http://www.taodudu.cc/news/show-1912750.html

相关文章:

  • Java基础(四):异常处理
  • Java基础(五):多线程
  • Android:权限处理
  • AsyncTask的基本使用
  • 在Nginx中配置SSL证书
  • Base64编码流程
  • Nginx配置基础认证
  • Cookie、Session、Token、RefreshToken
  • JSCore浅析及其在iOS上的使用
  • 编程语言的动态性(Dart和OC对比)
  • iOS:Universal Link
  • AFN中的鉴权
  • openGL ES 教程(二):渲染管线
  • MySQL(2)----DDL语句之增、删、改、查操作
  • MySQL(3)-----DML数据库操作(上)
  • 线性表的基本运算
  • MySQL(4)-----DML数据库操作(下)
  • MySQL(1)----帮助使用
  • MySQL(6)-----数据类型
  • (1)封装JSON数据的三种方式
  • (2)从文件中解析JSON数据
  • (1)I/O流对象-----FileInputStream与FileOutputStream
  • MyBatis(一)------目录
  • MyBatis(二)------使用JDBC编程问题总结
  • MySQL(5)-----DQL语句的基本查询与高级查询
  • MySQL(7)-----常用约束
  • MySQL(8)-----truncate清空表和字段自增
  • MySQL(9)-----多表创建及描述表关系(需求)
  • (1)Spring框架----通俗易懂的IoC原理
  • MySQL(10)-----多表创建及描述表关系(一对多的分析和实现)

Java基础(三):常用对象相关推荐

  1. Java基础复习-常用类

    Java基础复习-常用类 本文仅对学习过程中所缺java知识点的查缺补漏复习 String 代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现. St ...

  2. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  3. Java基础:常见对象

    第一讲   API 一.API概述 1.API(Application Programming Interface) :应用程序编程接口 2.编写一个机器人程序去控制机器人踢足球,程序就需要向机器人发 ...

  4. java基础(三) 加强型for循环与Iterator

    戳上面的蓝字关注我们哦! 精彩内容 精选java等全套视频教程 精选java电子图书 大数据视频教程精选 java项目练习精选 引言   从JDK1.5起,增加了加强型的for循环语法,也被称为 &q ...

  5. Java 基础——类和对象

    Java作为一种面向对象语言.支持以下基本概念: •多态 •继承 •封装 •抽象 •类 •对象 •实例 •方法 •消息解析 本节我们重点研究类与对象的概念. 对象:对象是类的一个实例,有状态和行为.例 ...

  6. java基础之类、对象、实例、属性、方法等概念理解

    在之前的文章里,讲过一些java基础概念,并写了一个简单的java入门代码,通过这些代码,对类和方法的定义做了部分说明. java基础介绍及第一个java程序 如果是了解java的同学,可能就没什么问 ...

  7. Java基础之序列化对象Serialized

    文章目录 序列化对象Serialized 目的: 序列化类型 应用场景 代码案例 直接应用 自定义对象序列化 序列化对象Serialized 目的: 序列化机制允许将实现序列化的Java对象转换成字节 ...

  8. Java反射基础(三)--Methods对象的使用

    Method 原文地址:http://docs.oracle.com/javase/tutorial/reflect/member/method.html 1.获得方法类型信息 一个方法的声明包括方法 ...

  9. 【Java基础】 ⾯向对象编程三⼤特性 --封装、继承、多态

    文章目录 封装 继承 多态 封装 把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性. 通俗的说 ...

  10. java基础-day08-面向对象(三) this关键字、继承、static关键字

    this 关键字 1.当 成员变量 名 和 局部变量 相同时,优先使用 局部变量,通过 this 使用 成员变量. public class Test1 {public static void mai ...

最新文章

  1. 说说大型高并发高负载网站的系统架构【转】
  2. python操作三大主流数据库(6)python操作mysql⑥新闻管理后台功能的完善(增、ajax异步删除新闻、改、查)...
  3. java_多线程_基于接口的多线程
  4. 【Java进阶】云存储-创建子模块作为第三方整合模块
  5. c++ set 遍历_47. Set 是如何工作的(3) 遍历顺序是如何确定的?
  6. 20 Excellent AJAX Effects You Should Know
  7. x61 linux 驱动 无线网卡,Linux环境Thinkpad X61 4G内存Mtrr表错误
  8. element ui下拉框实现
  9. tftp服务器默认ip怎么修改,tftp服务器的ip地址
  10. Cocos2d-x手机游戏开发视频教程
  11. sublime text 3 插件 OmniMarkupPreviewer 报404解决办法
  12. 怎样做出完美的高达模型
  13. iOS 常用动画第三方
  14. 怎么制作地图分布图,如何在地图上画出区域
  15. 企业级监控系统zabbix---通过qqmail发送告警信息
  16. Vivado DDS IP核使用、仿真、多相处理和相关计算验证
  17. word2010 论文引用/文献插入 保姆级图解
  18. 如何防止跨站点脚本攻击
  19. videoJs实现手机视频播放功能
  20. 03.OpenWrt-系统固件烧录

热门文章

  1. Windows 安装配置Java开发环境《jdk8》
  2. Oracle如何选择合适的列作为索引?
  3. Web开发之Cookie
  4. udev   ksm
  5. 《专家系统破解篇 六、IL代码破解--配套乱说》之 FeatherskyExpertSystem
  6. MyBatis逆向工程生成代码(附源码)
  7. 中南民族大学计算机图像处理实验报告,中南民族大学数字图像处理实验报告.doc...
  8. continue 结束本次循环,继续下一次循环
  9. php fseek函数,在php中fseek函数起什么作用呢?
  10. php 和 java_Java和php怎么选择??