java进阶3-常用类
String
唯一可以直接赋值的引用类型(不用new),由于字符串操作对内存来说,太耗性能,java把String单拎出来。
String name= “wang”
先在方法区中的常量池中,寻找有没有wang这个字符串,有就不在创建,把wang这个字符串的引用赋值给name这个变量,没有则创建字符串,“wang“这个字符串创建之后,就不在改变,这就常说的“字符串不可变”,而不是说属性name不可变,name可以改变赋值为其他引用。
String shu = new shu(“shu”)
先进行上述的流程,然后在new,在堆中创建“shu”这个字符串对象。
注意,加了双引号的字符串,编译期间先放到方法区常量池中,如果字符串要进行相加相减则在堆中在创建一份。
String str = "abc";//在常量池中创建abc
String str1 = "abcd";//在常量池中创建abcd
String str2 = str + "d";//拼接字符串,此时会在堆中新建一个abcd的对象,因为str2编译之前是未知的
String str3 = "abc" + "d";//拼接之后str3还是abcd,所以还是会指向字符串常量池的内存地址
System.out.println(str1 == str2);//false 比较内存地址是否相等
System.out.println(str1 == str3);//true 比较值是否相等
System.out.println(str1.equals(str2));//比较内容是否相等
StringBuffer和StringBuider
StringBuffer
StringBuffer与String最大不同,是StringBuffer可变
StringBuffer原理
先在堆中申请一块内存,存放字符序列,随着字符序列增大而扩大内存。
StringBuffer zhong = new StringBuffer();
for(int i= 0;i<10;i++) {
zhong.append(i).append(",");
}
StringBuider
方法同StringBuffer一样,区别StringBuffer线程安全,速度慢,而StringBuider,线程不安全,速度快。
// 使用StringBuilder也是可以完成字符串的拼接。
StringBuilder sb = new StringBuilder();
sb.append(100);
sb.append(true);
sb.append("hello");
sb.append("kitty");
System.out.println(sb);
包装类 基本类型对应
因为8种基本数据类型不够用。所以SUN又提供对应的8种包装类型。
byte-----Byte
short —Short
int -------integer
long ----Long
float ----Float
double -----Double
char -------Character
boolean ----Boolean
常用方法
valueOf()
parse***,
intValue()
Integer i = new Integer(123);
自动装箱和自动拆箱
基本数据类型 --(自动转换)–> 包装类型:自动装箱
包装类型 --(自动转换)–> 基本数据类型:自动拆箱
integer a= 100;装箱
int b =a; 拆箱
// 900是基本数据类型
// x是包装类型
// 基本数据类型 --(自动转换)--> 包装类型:自动装箱
Integer x = 900;
System.out.println(x);
// x是包装类型
// y是基本数据类型
// 包装类型 --(自动转换)--> 基本数据类型:自动拆箱
int y = x;
System.out.println(y);
日期类
java.util.Date 日期
java util calendar 日历
java.text.SimpleDateFormat 格式
Date nowTime = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
数字类
java.text.DecimalFormat 数字格式类
java.math.BigDecimal 精密数据
BigDecimal v1 = new BigDecimal(100);
DecimalFormat df = new DecimalFormat("###,###.##");
随机数类 Random
java.util.Random
// 创建随机数对象
Random random = new Random();
// 随机产生一个int类型取值范围内的数字。
int num1 = random.nextInt();
System.out.println(num1);
枚举类
enum
创建指定的实例对象用于使用
原理
在类的第一行写上已创建好的实例,实例默认是静态的,可以类名.实例对象名的方式获取。当然也可在枚举类中声明set(形参)函数实现创建好的变量的属性进行操作,在其他类中已枚举类名.valueof(变量名的方式)获取实例对象,再调用set(实参)函数设置实例对象的属性。当然在开发中,最好把实例对象的属性也写死。
- 枚举类默认final,不可继承,也不能用new()这样的方式创建实例对象,要用**枚举类名。valueOf(实例对象名)**的方式获取实例
因为已经创建好了,就没必要再使用new()的方式创建实例了,而且,枚举类的构造函数是用private修饰的,在类外部也不能用new()调用构造函数,这是统一的。 - 创建好的实例对象是类的属性,默认用public static final 修饰
- 枚举类通常设置为不可变。
- 媒体类如同实例对象的集合。
1、枚举是一种引用数据类型
2、枚举类型怎么定义,语法是?
enum 枚举类型名{
枚举值1,枚举值2
}
3、结果只有两种情况的,建议使用布尔类型。
结果超过两种并且还是可以一枚一枚列举出来的,建议使用枚举类型。
例如:颜色、四季、星期等都可以使用枚举类型。
*/
public class EnumTest02 {
public static void main(String[] args) {
Result r = divide(10, 2);
System.out.println(r == Result.SUCCESS ? "计算成功" : "计算失败");
}
/**
* 计算两个int类型数据的商。
* @param a int数据
* @param b int数据
* @return Result.SUCCESS表示成功,Result.FAIL表示失败!
*/
public static Result divide(int a, int b){
try {
int c = a / b;
return Result.SUCCESS;
} catch (Exception e){
return Result.FAIL;
}
}
}
// 枚举:一枚一枚可以列举出来的,才建议使用枚举类型。
// 枚举编译之后也是生成class文件。
// 枚举也是一种引用数据类型。
// 枚举中的每一个值可以看做是常量。
enum Result{
// SUCCESS 是枚举Result类型中的一个值
// FAIL 是枚举Result类型中的一个值
// 枚举中的每一个值,可以看做是“常量”
SUCCESS, FAIL
}