包装类
8个基本类型:byte 1 short 2 int 4 long 8 float 4 double 8 char 2 boolean 2
在java中,有些情况下不能用基本类型,所以每种基本类型都声明了对应的类类型,成为包装类
例如集合
byte Byte
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Char
【说明】基本类型和包装类型之间自动转换
包装类的作用:
- 让基本类型作为引用类型来使用
- 类中封装了一些方法,类型转换的方法
装箱:把子类类型转换父类类型,把基本类型转换为引用类型 自动完成
拆箱:把父类类型转换为子类类型(强转),把引用类型转为基本类型(自动完成)
【说明】把字符串转为数值时,字符串里必须都是数值才行,否则转换失败
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5PPPeVUM-1629105851889)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210813105116134.png)]
由于整型值比较常用所以Java默认缓存了256个整型值
-128~127之间的值,所以当使用此范围之间的数值时,公用缓存区地址中的数值,如果超出范围,那将独立开辟空间存储
String 重点
String:不可变字符串,不能改变里面的值
本质:是一个final修饰的char类型的数组,所以字符串一旦赋值后,不能改变其值
private final char value[];
使用方式1:
String name1=“贾玉堃”;
使用方式2:
String name2=new String(“张磊”);
//使用方式1:
String name1="贾玉堃";
//使用方式2:
String name2=new String("张磊");
//为什么没有输出应用类型的地址?
//因为重写了toString方法
System.out.println(name1);
System.out.println(name2);
//改变字符串的值,改变的并不是原字符串的值
//新开辟方法区中常量池的空间,存放改变后的字符串的值
name1=name1+",生日快乐!";
System.out.println(name1);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eRajK6iy-1629105851892)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210815120403523.png)]
package com.qf.pro2103.day15;
public class Demo7 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String name="贾玉堃";
//每次存放字符串的时候,到常量池中查找,此字符串值是否存在
//如果有,则直接复用其地址
String name2="贾玉堃";
System.out.println(name==name2);
System.out.println(name.equals(name2));
name2=name2+",生日快乐!";
System.out.println(name==name2);
}
}
字符串重用方法:
length() 字符串中字符的个数
charAt(索引) 返回的是字符串中对应索引位置的字符
contains(字符串) 返回boolean值,判断参数字符串是否在字符串中,如果在,返回true,不在,返回false
toCharArray() 把字符串转换为字符型数组
indexOf(参数字符串) 查找参数字符串在字符串中首次出现的索引位置,如果不在返回-1
trim() 去除字符串两端的空格,返回是去除两端空格后的字符串
replace(“要替换的内容”,“替换成的内容”) 把字符串中参数1的部分,用参数2给替换掉
toUpperCase() 把字符串中的小写字母转为大写
toLowerCase() 把字符串中的大写字母转为小写
endsWith(参数) 判断字符串是否以参数结尾,如果是返回true,否则返回false
split(分割标记) 把字符串按照参数进行分割,返回分割后的数组s4
substring(beginindex) 从字符串的参数所指的索引位置开始截取,一直截取到最后,返回截取到的字符串
substring(beginindex,endindex) 从字符串的参数1的索引位置开始截取,截取到参数2所对应的索引位置,但是不包含参数2的位置
【面试题】中间空格如何去掉?
【说明】String类的方法并不是直接修改原字符串,而是复制一份进行修改,返回的对赋值的修改后的字符串
【说明】String是不可变字符串,当频繁改变字符串值时,不建议使用String ,浪费内存空间
使用 StringBuffer 或 StringBuilder,可变字符串
StringBuffer和StringBuilder的使用方式是相同的
区别:
StringBuffer:线程安全,但是效率较低
StringBuilder:非线程安全,但是效率高
package com.qf.pro2103.day15;
public class Demo10 {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer sb=new StringBuffer("贾玉堃");
//给上面的字符串拼接值
sb.append(",你在干什么?"); //追加
System.out.println(sb);
//参数1:插入的索引位置
//参数2:插入的内容
sb.insert(0, "嗨!"); //插入
System.out.println(sb);
sb.insert(5,",正在上课呢");
System.out.println(sb);
//sb.deleteCharAt(0); //删除指定索引位置的字符
sb.delete(0, 2); //从参数1的位置开始删除,删除到参数2的位置,但是不包含参数2
System.out.println(sb);
}
}
BigDecimal
基本类型中的float,double 存放的是近似值,不能用作价钱来使用
BigDecimal是精确存储及计算的小数类型
package com.qf.pro2103.day15;
import java.math.BigDecimal;
public class Demo11 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//精确计算
int num=10;
BigDecimal price=new BigDecimal("0.5");
BigDecimal totalPrice=price.multiply(new BigDecimal(num));
System.out.println(totalPrice);
BigDecimal first=new BigDecimal("1.0");
BigDecimal second=new BigDecimal("0.9");
BigDecimal add=first.add(second); //加法
BigDecimal sub=first.subtract(second);//减法
BigDecimal mul=first.multiply(second); //乘法
//参数1:除数
//参数2:保留的小数位数
//参数3:如何保留,通常四舍五入
BigDecimal div=first.divide(second,3,BigDecimal.ROUND_HALF_UP);//除法
System.out.println(add);
System.out.println(sub);
System.out.println(mul);
System.out.println(div);
}
}
【说明】在计算时,小数要以字符串形式参与,这样是精确数
在除法计算时,遇到除不开的情况需要指定,保留的小数位数,及如何取舍
日期时间
Date 默认是西方的时间格式,不符合中国的时间认知格式,需要进行格式转换
SimplDateFormat 对时间进行格式化
时间工具类
package com.qf.pro2103.util;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
//得到一个符合中国时间格式的字符串时间
public static String getDateTime(){
//1、先创建时间对象
Date date=new Date();
//2、创建格式化对象
//在参数中指定时间格式
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//3、对时间进行格式化
String str=sdf.format(date);
return str;
}
}
package com.qf.pro2103.day15;
import java.util.Date;
import com.qf.pro2103.util.DateUtil;
public class Demo12 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Date dt=new Date();
//输出当前时间
System.out.println(dt);
//变成 年-月-日 小时:分:秒
String str=DateUtil.getDateTime();
System.out.println(str);
}
}
如果要获取当前时间中的一部分,使用日历对象
package com.qf.pro2103.day15;
import java.util.Calendar;
public class Demo13 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//getInstance() 得到日历对象,在此方法中new出的日历对象
Calendar calendar=Calendar.getInstance();
//日历中默认是当前时间
//通过日历对象来获取信息
int year=calendar.get(Calendar.YEAR);
System.out.println(year);
int month=calendar.get(Calendar.MONTH);
//月份:0-11
System.out.println(month+1);
//日期
int day=calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(day);
//小时
int hour=calendar.get(Calendar.HOUR_OF_DAY); //24小时制 HOUR 12小时制
System.out.println(hour);
//分钟
int minute=calendar.get(Calendar.MINUTE);
System.out.println(minute);
//秒
int second =calendar.get(Calendar.SECOND);
System.out.println(second);
}
}
通过修改日历来设置时间 增加、减少时间
package com.qf.pro2103.day15;
import java.util.Calendar;
public class Demo14 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Calendar calendar=Calendar.getInstance();
//设置日期
// calendar.set(Calendar.DAY_OF_MONTH, 5);
//
// System.out.println(calendar.getTime());
//当前时间两个小时后的时间
calendar.add(Calendar.HOUR_OF_DAY, 2);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lF57nUb5-1629105851894)(C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210815120811880.png)]
System.exit(0) 正常退出:程序在退出前会释放掉/清理掉所有占用资源
System.exit(非0) 异常退出:程序退出后,没有释放掉所占资源
package com.qf.pro2103.day15;
public class Demo15 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//是1970年1月1日0时0分0秒到此刻的毫秒数 long类型
System.out.println(System.currentTimeMillis());
//用于记录程序执行所用时间
long beginTime=System.currentTimeMillis();
int sum=0;
for(int i=1; i<=10000000; i++){
sum+=i;
}
long endTime=System.currentTimeMillis();
//计算所用时间
long useTime=endTime-beginTime;
System.out.println("循环10000000次用时:"+useTime);
}
}
0分0秒到此刻的毫秒数 long类型
System.out.println(System.currentTimeMillis());
//用于记录程序执行所用时间
long beginTime=System.currentTimeMillis();
int sum=0;
for(int i=1; i<=10000000; i++){
sum+=i;
}
long endTime=System.currentTimeMillis();
//计算所用时间
long useTime=endTime-beginTime;
System.out.println(“循环10000000次用时:”+useTime);
}
}