Java八大Wrapper类
包装类
- 针对八种基本数据类型相应的引用类型
基本数据类型 | 包装类 |
---|---|
boolean | Boolean |
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
有类的特点, 可以调用类方法
包装类和基本数据类型转换
以int和Integer为例
- jdk5前, 装箱: 基本数据类型->包装类型, 反之拆箱.
- jdk5之后, 自动装箱和拆箱
- 自动装箱底层调用的是valueOf方法, 比如Integer.valueOf()
自动装箱和拆箱可以直接将值赋给包装类, 也可以直接将包装类赋给值
- 包装类和String类型的相互转换
演示Integer和String之间的相互转换.
Integer to String
- Integer + “”
- Integer.toString()
- String.valueOf()
String to Integer
- Integer.parseInt()
- Integer() 调用构造器, 也可以
Integer 和 String 常用的方法
Integer.MIN_VALUE
Integer.MAX_VALUE
String.isUpperCase() 判断是否是大写
String.toUpperCase() 转换为大写格式
Character.isDigit()
包装类
-128 到 127 调用的Integer都是在cache中的, 不会重新 new, 这些数据是在创建类的时候提前创建好的
String类结构刨析
- String类的理解和创建对象.
理解
-
String对象用于保存字符串
-
字符串常量使用双引号括起来的字符序列
-
字符串使用Unicode编码, 一个字符占两个字节
-
String类较常用的构造器
String()
String(String original)
String(char[] a)
String(char[] a, int startIndex, int count)
String(byte[] b)
实现了Serializable, 说明可以串行化, 可以在网络传输.
Comparable, 说明可以比较大小.
常用的构造器有
使用了两个重要的接口
- String类是final类, 不能被继承
- value, String类保存数据, 实际保存在value数组中
- value是一个 final 类型, 一旦赋值后, 不能修改, 指的是value的地址不能再修改
创建String对象的两种方式
- 方式一:直接赋值 String s = “zhx”;
- 方式二:调用构造器 String s2 = new String(“zhx”);
区别
- 方式一: 先从常量池查看是否有"zhx"数据空间, 如果有, 直接指向, 没有则重新拆功能键, 然后指向, 最终指向的是常量池的空间地址
- 方式二: 先在堆中创建空间, 里面维护了value属性, 指向常量池的’zhx’空间. 如果常量池没有’zhx’, 重新创建, 如果有, 直接通过value指向. 最终指向的是堆中的空间地址.
- 内存分布图
String中的练习
intern
方法将字符串添加到池中, 并返回池中的字符串对象的引用
字符串特性
- String是一个final类, 代表不可变的字符序列
- 字符串是不可变的, 一个字符串对象一旦被分配, 其内容是不可变的
画出内存布局图
String s1 = "hello";
s1 = "haha";
String a = "hello" + "abc";
// 创建了几个对象, 不是3!!! 只有一个对象
- 编译器会优化, 等价于直接 String a = “helloabc”; 判断引用是否有指向
String a = "hello";
String b = "abc";
String c = a + b; // 创建了几个对象, 画出内存图
String c = "hello" + "abc";
// 关键是分析 String c = a + b; 是如何运行的