包装类
包装类:基本数据类型对应的引用类型
JDK5之前的Integer包装类 如下 了解即可
i5传入的值 第一个是字符串,第二个是进制数.为83是因为再打印的时将123看成8进制了 然后打印转化为10进制
区别对比
public static void main(String[] args) {
Integer i1 = Integer.valueOf(127);
Integer i2 = Integer.valueOf(127);
System.out.println(i1==i2);
//true
//为什么单单这个是对 下面的不对
//因为integer源码 他原理是传入数值 数值在一个范围内(-128到127)就从一个数组中返回integer对象(因为数组中是创建好的直接用就可以了)
//如果不在同一个范围内就new一个新的
//为什么这样设计
//因为在底层开发的时候-128到127的数据用的比较多
//如果每次使用都是new新对象太浪费内存
//所以提前把这个范围值你的每一个数据都创建好对象
//如果用到不会创建新的 而是创建好的对象
Integer i3 = Integer.valueOf(128);
Integer i4 = Integer.valueOf(128);
System.out.println(i3==i4);
//false
Integer i5= new Integer(127);
Integer i6 = new Integer(127);
System.out.println(i5==i6);
//false
Integer i7= new Integer(127);
Integer i8 = new Integer(127);
System.out.println(i7==i8);
//false
包装类以前如何计算
把对象进行拆箱 变成基本数据类型
相加
把得到的结果再次进行装箱(变回包装类)
Integer i9 = Integer.valueOf(1);
Integer i99 = Integer.valueOf(10);
//把两个相加
int i = i9.intValue();
int ii = i99.intValue();
int result=i+ii;
Integer integer=new Integer(result);
System.out.println(integer);
非常之麻烦
但在JDK5时提出一个机制
自动装箱和自动拆箱
把基本数据类型会自动其对应的包装类
自动拆箱:把包装类自动变成其对象的基本类型
Integer i1=10;
以上代码就是用了自动装箱.在底层自动调用静态方法valueof得到一个Integer对象 只不过这个动作不需要我们自己操作了
Integer i2=new Integer (10);
int i=i2
自动拆箱 在JDK5以后 int和Integer可以看做时同一个东西 因为在内部可以自动转化
总结
Integer成员方法
public static void main(String[] args) {
//把整数转化为二进制二进制
String str1 = Integer.toBinaryString(100);
System.out.println(str1);//把100转化为二进制 打印结果1100100
//八进制
String str2 = Integer.toOctalString(100);
System.out.println(str2);//144
//十六进制
String str3 = Integer.toHexString(100);
System.out.println(str3);//64
//将字符串类型的整数转为int类型的整数
String s="123";
int i = Integer.parseInt(s);
System.out.println(i+1);//124
//细节:在类型转换的时候参数只能是数字不能是其他
//细节2:每个包装类(除了character)型都有对应的parseXX方法
String s1="true";
boolean b = Boolean.parseBoolean(s1);
System.out.println(b);
parse:字符串转XX类型
在以前我们用Scanner键盘录入的时候 录入带空格的数据很麻烦 录入123 123 输出只有123 因为遇到空格就停止了
解决:
Scanner sc=new Scanner(System.in);
String line=sc.nextLine//zhe这样可以接收一整行数据
int i=Integer.parseInt(int);//然后我们想要什么直接转换即可
时间类包装类综合练习
键盘录入一些1到100之间的整数,并添加到集合 知道集合中所有数据和超过200为止
public static void main(String[] args) {
//首相要有一个集合存储数据
ArrayList<Integer>list=new ArrayList<>();
//循环录入1 到100的数据
System.out.println("请输入数据");
Scanner sc=new Scanner(System.in);
while(true){
String s = sc.nextLine();
//把录入的数据转化为整数
int i = Integer.parseInt(s);
//判断如果是1到100以外的不录入集合
if(i>100||i<1){
System.out.println("输入错误,请输入1到100之间数据");
continue;
}
//把录入的数据添加到集合
list.add(i);
//写一个方法累加添加到集合的数据
int sum =getSum(list);
if (sum>200){
System.out.println("超过200已满足要求");
break;
}
}
}
private static int getSum(ArrayList<Integer> list) {
int sum=0;
for (int i = 0; i < list.size(); i++) {
//循环获取索引
Integer integer = list.get(i);//得到每一个元素
sum=sum+integer;
}
return sum;
}
练习二
自己实现parseint方法的效果,将字符串形式的数据转成整数
要求:字符串中只能是数字不能有其他字符.
最少一位 最多10位
0不能开头
//思路: 现有一个字符串 判断下符合规则
然后遍历得到每一个字符 比如 123456789 -> ‘1’ ‘2’…
然后通过ascii表’1’-'0’的方法得到数字1.因为 在ascii中 '1’对应49 '0’对应48. '2’对应50…
然后得到了每个数据 然后拼接起来
具体操作如下
public static void main(String[] args) {
//思路: 现有一个字符串 判断下符合规则
//然后遍历得到每一个字符 比如 123456789 -> '1' '2'...
//然后通过ascii表'1'-'0'的方法得到数字1.因为 在ascii中 '1'对应49 '0'对应48. '2'对应50...
//然后得到了每个数据 然后拼接起来
String s="123456789";
boolean matches = s.matches("[1-9]\\d{0,9}");
//
if(!matches){
System.out.println("输入数据非法");
}else{
System.out.println("合理继续录入");
}
//用于存储最终数字
int num=0;
//遍历得到每一个字符
for (int i = 0; i < s.length(); i++) {
//得到索引
int result = s.charAt(i)-'0';
//得到了每个元素 然后减去'0'
num=num*10+result;
//解读 num第一次为0. ×10+result等于1
//num为1 ×10+result等于 12
//.....
}
System.out.println(num);
System.out.println(num+1);//123456790
}
练习3 实现toBinaryString
public static void main(String[] args) {
//将10进制转化为i二进制
//思路 定义一个方法
//不断除以2 得到余数 一直到商为零就结束
//然后把余数倒着拼接起来
System.out.println(toBinaryString(6));
}
private static String toBinaryString(int number) {
StringBuilder stringBuilder=new StringBuilder();//字符串拼接用的
while(true){
if(number==0){
break;
}
//先得到余数在除
int yushu=number%2;
//stringBuilder.append(yushu);//拼接起来但是得到的是011 是反着的
stringBuilder.insert(0,yushu);
//得到110 符合规则 第一个传入从几索引开始拼接 第二个传入要拼接的元素
//再除二
number=number/2;
}
return stringBuilder.toString();//转化为字符串形式
}
}
练习4
用代码实现计算你活了多少天了,用JKD7和JDK8两种方式完成
public static void main(String[] args) throws ParseException {
//JDK7
//规则只要对事件进行计算或者判断先获取毫秒值
String birthday="2002年6月6日";
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日");
Date parse = sdf.parse(birthday);
//解析得到对象然后再调用毫秒值
long birthdayTime = parse.getTime();
long now = System.currentTimeMillis();
//获取现在的时间
long time = now - birthdayTime;
System.out.println(time/1000/60/60/24);//7809
//JDK8
//获取年月日用
LocalDate l1=LocalDate.of(2002,6,6);
LocalDate l2 = LocalDate.now();//获取现在的时间
long time2 = ChronoUnit.DAYS.between(l1, l2);
System.out.println(time2);//7809
}
练习5
判断任意年份是闰年还是平年
闰年就是 二月有29天 或者一年有366天满足一个都是闰年
思路把时间设置为2000年3月1号往前减去一天 如果是29就是闰年
{
//JDK7有一个日历类可以直接操作年月日
Calendar nowTime = Calendar.getInstance();//相当于获取了当前系统时间
nowTime.set(2000,2,1);//月份范围为0到11 想获取3月就的写2
nowTime.add(Calendar.DAY_OF_MONTH,-1);//用加的方法 加-1
int day1 = nowTime.get(Calendar.DAY_OF_MONTH);
System.out.println(day1);//29
//JDK8
LocalDate ld1 = LocalDate.of(2000, 3, 1);
LocalDate ld2 = ld1.minusDays(1);//月份减去1 生成新的日期对象
int day2 = ld2.getDayOfMonth();
System.out.println(day2);//29
}