一、包装类
1. 什么是包装类
以前定义变量,经常使用基本数据类型,对于基本数据类型,它就是一个数。加点属性,加点方法,加点构造器,对基本数据类型对应进行了封装产生了一个新的类,这种类叫包装类(改造基本数据类型的的类)。
int, byte...-->基本数据类型
包装类 -->引用数据类型
2. 基本数据类型对应的包装类
3.为什么要把基本数据类型封装为包装类
Java语言,面向对象的语言,最擅长的操作各种各样的类
以前学习装数据的---> 数组,int[] String[] double[] Student[]
以后学习装数据的---> 集合,有一个特点,只能装引用数据类型的数据
4. 有了包装类以后用基本数据类型吗?
并不是。
5. Integer学习(其他包装类学习同理)
打开Java api文档,搜索Integer开始学习
从属与java.lang包(属于这个包意味着直接使用,不用导入包)
类的继承关系
java.lang.Object
java.lang.Number
java.lang.Integer
实现接口
被final修饰,那么这个类不能有子类,不能被继承
包装类是对基本数据类型的封装:对int类型封装产生了Integer。
类的历史
字段摘要 Field Summary
构造方法摘要,可以在idea上点进去看
包装类特有机制,拆箱装箱(底层使用了方法完成,velueOf() 和 intValue() )可以自行断点查看
常用方法,主要查看JavaAPI文档自学,下面列举主要几个方法,可以在idea点进方法查看底层
1.comperTo() 在数字上比较两个Integer对象。
2.Integer i = 2;
Integer i1 = 3;
Integer i2 = 3;
System.out.println(i.compareTo(i1));//-1
System.out.println(i1.compareTo(i));//1
System.out.println(i1.compareTo(i2));//0
equals()将对象和指定对象进行比较
1. intValue()以 int 类型返回该Integer的值
2.parseInt()将字符串转成 int 类型
3.toString()返回一个表示该Integer的字符串
二、日期相关类
1. util.Date (方法很多自己试,API里有)
Date d = new Date();
System.out.println(d);
System.out.println(d.toGMTString());//有横线花掉的是过失、过期、废弃方法
System.out.println(d.toLocaleString());
System.out.println(d.getTime());
System.out.println(System.currentTimeMillis());//效果一样,但是用第二个,因为是静态方法,快!第一个因为要创建对象,所以不够第二个效率高
//currentTimeMillis()是本地方法,没有方法体,因为方法体的实现不是通过Java写的
//这俩方法的作用,测试算法速度
2. sql.Date
3. SimpleDateFormat
从前台过来的日期数据一般都是有格式的String,需要转换成util.Date类型
1.String-->sql.Date
2.sql.Date-->util.Date
3.局限性:日期必须是规定格式!
4.引入新类DateFormat
4. Calendar
Calendar是一个抽象类,不能直接创建对象,使用子类实现
可以使用静态方法Calendar.getInstance()创建。
常用方法:get(),set()
如何从String转换为Calendar
练习:给出一个日期,打印出那一月正确的日历,且在给定日期标星号,如下图。
5. jdk1.8新增第三批API LocalDate、LocalTime、LocalDateTime
缺陷:
可变性和不可变性不合理(不应该有set方法,不应该可以改日历,一个日历对象仅仅永远只能是一个时间,不可变)
偏移性:getYear(),是从1900开始的,有偏移性
格式化,格式化只能对Date格式化,而不能对Calendar格式化
基于这些缺陷,创造了第三批Api。但是前面两批都有人用
1) LocalDate
2) LocalTime
3) LocalDateTime (最常用)
get方法
with方法(不可变体现)
加减方法
toString() (无偏移性体现)
4) Demo
三、Math类
1. API文档中学习
1.基本概述
1.字段概述
1.构造器私有化(不想让任何人实例化出对象)
四、Random类
1. 自行在API文档中初步了解Random类
2. 不管是无参数构造Random,还是Math类的random方法,最后底层都是到Random类的有参构造中。
3. Demo
五、String类
API文档中自行先把概述了解
1. String类的本质
将字符串起来,就是字符串,是不可变类
所有的字符串都是一个实例化出来的对象,例如"abc","你好世界","helloworld"等。
字符串内容不可变,类比LocalDateTime类的不可变性。
String底层是一个char类型的数组
2. String的常用方法
String()空参构造器,给出一个空的value。
String(String original),将original的value和hash给到正构造的String对象。
String(char value[]),将value数组中的值复制到正构造的String对象的属性value中。
length(),字符串底层数组长度。
isEmpty(),字符串底层数组是否为空。
charAt(int index),字符串中底层数组相对应下标的对应值。
equals(Object object),比较两个字符串是否值相等,已被重写。
compareTo(String anotherString),对比两个字符串,实现了一个Comparable接口,需要重写compareTo方法,已被重写。
3. String内存分析
String在常量池中放置了一个变量,如果后续有结果相同的变量那就不会在增加一个变量,比如String s = "abc";后续如果再来了一个String s1 = "ab"+"c",常量池中也只会有一个"abc",不会有两个。但是注意使用String(String original)构造的String对象则不同。
上面的字符串会进行编译优化,合并成完整的字符串,可使用反编译工具查看class文件如下:
进行反汇编命令后得到反汇编代码,我们观察:
在观察中知道用了两次append,所以在使用变量a和"def"进行拼接的时候,不会进行编译优化,不会直接变成"abcdef",而是会使用StringBuilder类中的方法进行追加。
5.解释可变和不可变
如下图
6. StringBuffer概述
基本方法和StringBuilder基本一样,包括追加和构造基本一样。
synchronized,按下不表,多线程部分重点。
7. String,StringBuilder,StringBuffer的区别与联系
String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。
StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String
JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。
不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder
StringBuilder:JDK1.5开始效率高线程不安全
StringBuffer:JDK1.0开始效率低瞭线程安全。