上强度了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
基本数据类型与引用数据类型
区别:
- 基本是数据类型是Java内置好的数据类型,可以直接使用。比如赋值或进行运算。
- 除字符串以外的引用数据类型都不可以直接使用,必须new实例化之后才可以操作。
- 引用数据类型可以是null(空值)。
注意:
1、引用数据类型new 实例化后,变量的值是Java在内存中申请的地址,所以引用数据类型不可以直接使用。在进行值的比较时必须使用特殊的方法进行比较。例如:字符串类的equals()方法。
2、使用引用数据类型,首先应该判断引用数据类型是否为null,不为null在进行后续操作,否则可能会出现空指针异常。
包装类
基本类型包装类
概念:由于基本数据类型是内置类型,与引用数据类型不同,不能调用方法来完成强大的功能。为了更方便使用基本数据类型,统一面向对象基本思想,Java设计了基本数据类型的包装类,即每一种基本数据类型都对应包装类。
基本类型 | byte | short | int | long | char | boolean | float | double |
包装类 | Byte | Short | Integer | Long | Character | Boolean | FLoat | Double |
自动拆箱装箱功能:
基本数据类型包装类这些引用数据类型与其他引用数据类型有些不
同,他们有更强大的功能,即自动装箱拆箱。即在需要的情况下,基本类型
与包装类型可以通用。有些时候我们必须使用引用数据类型时,可以传入基
本数据类型。
比如:
基本类型可以使用运算符直接进行计算,但是引用类型不可以。而基本类型包装类作为引用类型的一种也可以计算,原因在于,Java”偷偷地”自动地进行了数据类型的转换。
相对应的,引用数据类型变量的值必须是new出来的对象,而我们可以将一个基本类型的值赋值给一个基本类型包装类的引用。原因同样在于Java又”偷偷地”自动地进行了数据类型的转换。
常用方法
- 字符串->基本类型
任何基本类型包装类都有一个parseXxx(String data);方法。如Integer.paserInt("10");
- 基本类型->字符串
只需要直接与空字符串相加即可。
优点:
- 变成引用数据类型,可以有特殊属性和方法。
- 引用数据类型的值可以是null。
常用类
Object
Object是所有Java中类的超类(我们创建的所有类都会继承Object类),类中的toString()和equals()方法就是从Object中继承过来的。
toString()
Object类中的toString()方法返回的是对象的类的类型+@+内存地址。
所以我们想要使用toString()方法就需要我们重写它的方法体。
equals()
由于引用数据类型的变量值是Java内存地址,所以我们不能直接用==来判断引用数据类型是否相同。
String类重写了equals()方法所以我们可以直接使用String的equals()来判断两个字符串是否相等,如果字符串没有重写equals()方法那么它比较的也是两个内存地址。
想要比较两个自定义引用数据类型,就需要我们重写它们的equals()方法,根据我们的规则来判断是否相等。例如:比较两个Student对象是否相等,如果我们以Student中的name属性作为判断的依据,那么重写Student的equals()方法即可。
字符串
在前面的学习中我们知道了字符串是一种特殊的引用数据类型,从下图我们一起了解一下它哪里特殊:
由上图我们可以看出当使用==判断两个字符串是否相等时是不严谨的,使用equals()才是最稳定的判断。
String重写了Object的equals()方法[Java帮我们实现了],所以String的equals比较的永远是两个字符串真实的值。
构造方法:
public String() //创建空字符串
public String(byte[] bytes) //将字节数组转为字符串
public String(char[] value) //将字符数组转为字符串
public String(String original) //初始化一个新创建的String对象
普通方法(带√的方法为常用方法):
String toUpperCase(); //小写转大写
String toLowerCase(); //大写转小写
int length(); //获取长度
boolean contains(CharSequence s);//判断调用方法字符串是否包含参数字符串
注意:这里使用到了多态,CharSequence 是String的接口
String substring(int start); //截取从start索引开始到最后的子字符串
String trim(); //去除字符串两端空白
√String replace(char oldChar,char newChar); //替换字符
√String substring(int start,int end); //截取指定位置的子字符串
√char[] toCharArray(); //字符串与字符数组的转变
√char charAt(int index); //根据索引查找内容
√int indexOf(String ch); //根据内容查找索引
√boolean endsWith(String suffix);
√boolean startsWith(String prefix); //以指定内容开头或结尾
√String[] split(String regex); //根据给定的字符串拆分调用此方法的字符串
Stringbuffer
语法:StringBuffer buffer = new StringBuffer(str)/StringBuffer buffer = new StringBuffer();
常用方法:
StringBuffer append(String str); // 追加内容
String toString();// 输出StringBuffer中的内容
StringBuilder
语法:StringBuilder builder = new StringBuilder();/StringBuilder builder = new StringBuilder(str);
常用方法:
StringBuilder append(String str); // 追加内容
String toString();// 输出StringBuffer中的内容
String、Stringbuffer、Stringbuilder区别
String、Stringbuffer、StringBuilder是字符串的三兄弟。String是一个常量,值是不可变的,所以对于每一次赋值操作都会创建一个新的对象。在进行大量字符串拼接时会有性能开销大(频繁创建对象)的问题。StringBuffer和StringBuilder都是可变的,当进行字符串拼接时采用append()方法,在原来的基础上进行追加,所以性能比String要高。又因为StringBuffer是线程安全的而StringBuilder是非线程安全的,所以StringBuilder的效率高于StringBuffer。对于大数据量的字符串的拼接,采用StringBuffer或StringBuilder。
日期
Java的Date、Calendar类型使用起来并不是很方便,而且Date类有着线程不安全等诸多弊端。同时若不进行封装,会在每次使用时特别麻烦。于是Java8推出了线程安全、简易、可靠的时间包(java.time)。
LocalDate(本地日期)
LocalDate只包含日期,不包含时间。
LocalTime(本地时间)
LocalTime只包含时间,不包含日期,同时不涉及时区(当前系统是什么时区就是什么时区)。
LocalDateTime(本地日期时间)
LocalDateTime = LocalDate + LocalTime;包含同时时间和日期。
日期格式化
通过DateTimeFormatter进行日期格式的转换。
格式规则
字符 | 含义 | 规则串 | 效果 |
y | 年 | yyyy-MM-dd | 2017-06-05 |
M | 月 | yyyy-MM-dd hh:mm:ss | 2017-06-05 07:03:05 //12小时制 |
d | 日 | yyyy-MM-dd HH:mm:ss | 2017-06-05 07:03:05 //24小时制 |
H | 时 | yyyy-MM-dd HH:mm:ss:SSS | 2017-06-05 07:03:05:005 //24小时制 |
m | 分 | yyyy-MM-dd | 2017-06-05 |
s | 秒 | yyyy-MM-dd hh:mm:ss | 2017-06-05 07:03:05 //12小时制 |
S | 毫秒 |
日期比较
时间计算
Math
数学工具类,针对数学算法进行操作。
工具类:一般情况下其所有方法均为静态方法,并且一般不会创建对象。
常用方法
static int abs(int a); //绝对值
static double ceil(double a); //向上取整
static double floor(double a); //向下取整
static int max/min(int a,int b); //取最大最小值
static double pow(double a,double b); //a的b次幂
static double random(); //产生随机数
static int round(float a); //四舍五入
BigDecimal
由于计算机都是二进制的,浮点数没有办法是用二进制进行精确表示,这样我们在进行高精度计算时就会丢失精度。
为解决精度丢失的问题,Java为我们提供了BigDecimal类用于处理浮点数的高精度需求。
计算方法
- public BigDecimal add(BigDecimal value); //加法
- public BigDecimal subtract(BigDecimal value); //减法
- public BigDecimal multiply(BigDecimal value); //乘法
- public BigDecimal divide(BigDecimal value); //除法
精度
使用setScale(scale, roundingMode);
Scale:保留小数位数
roundingMode:舍去位数处理方式
BigDecimal.ROUND_DOWN 直接删除多余的小数
BigDecimal.ROUND_UP 进位处理 2.35变为2.4
BigDecimal.ROUND_HALF_UP 四舍五入
BigDecimal.ROUND_HALF_DOWN 四舍五入 向下取整
案例