首页 > 其他分享 >包装类

包装类

时间:2024-11-17 14:57:37浏览次数:1  
标签:String 包装 System println Integer public out

包装类就是基本数据类型所对应的引用数据类型. 就是把基本数据类型变成了一个对象.

包装类可以理解为: 用一个对象, 将基本数据类型包起来.

集合不能存储基本数据类型, 只能存储对象.

图片名称

JDK5 对获取对象的方式进行了优化.

JDK5 之前, 如果要获取包装类的对象, 需要根据构造方法自己 new. 或者根据静态方法 valueOf() 来获取, 这是一个被重载的方法.

图片名称

valueOf() 源码:

图片名称

传进来的参数, 如果在 [-128, 127] 范围内, 就直接从一个数组中去获取, 否则 new 一个出来.

进入 1080 行的 cache 的源码:

图片名称

可以看见, cache 是一个 Integer 类型的数组.

low 和 high 的值:

图片名称

程序示例:

public class IntegerDemo1 {
    public static void main(String[] args) {
        /*
         * public Integer(int value) 根据传递的整数创建一个Integer对象
         * public Integer(String s) 根据传递的字符串创建一个Integer对象
         * public static Integer valueOf(int i) 根据传递的整数创建一个Integer对象
         * public static Integer valueof(String s) 根据传递的字符串创建一个Integer对象
         * public static Integer valueof(String s, int radix) 根据传递的字符串和进制创建一个Integer对象
         */

        // 1.利用构造方法获取Integer的对象(JDK5以前的方式)
        Integer i1 = new Integer(1);
        Integer i2 = new Integer("1");
        System.out.println(i1);  // 1
        System.out.println(i2);  // 1

        // 2.利用静态方法获取Integer的对象(JDK5以前的方式)
        Integer i3 = Integer.valueOf(123); // 123
        Integer i4 = Integer.valueOf("123"); // 123
        Integer i5 = Integer.valueOf("123", 8); // 83

        System.out.println(i3);  // 123
        System.out.println(i4);  // 123
        System.out.println(i5);  // 83

        // 3.这两种方式获取对象的区别(掌握)
        // 底层原理: 
        // 因为在实际开发中, -128~127之间的数据, 用的比较多. 
        // 如果每次使用都是new对象, 那么太浪费内存了
        // 所以, 提前把这个范围之内的每一个数据都创建好对象
        // 如果要用到了不会创建新的, 而是返回已经创建好的对象. 
        Integer i6 = Integer.valueOf(127);
        Integer i7 = Integer.valueOf(127);
        System.out.println(i6 == i7);  // true

        Integer i8 = Integer.valueOf(128);
        Integer i9 = Integer.valueOf(128);
        System.out.println(i8 == i9);  // false

        // 因为看到了new关键字, 在Java中, 每一次new都是创建了一个新的对象
        // 所以下面的两个对象都是new出来, 地址值不一样. 

        Integer i10 = new Integer(127);
        Integer i11 = new Integer(127);
        System.out.println(i10 == i11);  // false

        Integer i12 = new Integer(128);
        Integer i13 = new Integer(128);
        System.out.println(i12 == i13);  // false
    }
}

程序示例:

public class IntegerDemo2 {
    public static void main(String[] args) {
        // 在以前包装类如何进行计算

        Integer i1 = new Integer(1);
        Integer i2 = new Integer(2);


        // 需求:要把两个数据进行相加得到结果3
        // 对象之间是不能直接进行计算的. 
        // 步骤:
        // 1.把对象进行拆箱, 变成基本数据类型
        // 2.相加
        // 3.把得到的结果再次进行装箱(再变回包装类)


        int result = i1.intValue() + i2.intValue();
        Integer i3 = new Integer(result);
        System.out.println(i3);
    }
}

程序示例:

public class demo3 {
    public static void main(String[] args) {
        // 在JDK5的时候提出了一个机制:自动装箱和自动拆箱
        // 自动装箱:把基本数据类型会自动的变成其对应的包装类
        // 自动拆箱:把包装类自动的变成其对象的基本数据类型

        // 在底层, 此时还会去自动调用静态方法valueof得到一个Integer对象, 只不过这个动作不需要我们自己去操作了
        // 自动装箱的动作
        Integer i1 = 10;

        Integer i2 = new Integer(10);
        // 自动拆箱的动作
        int i = i2;

        // 结论: 在JDK5以后, int和Integer可以看做是同一个东西, 因为在内部可以自动转化. 
    }
}

包装类 Integer 的成员方法:

图片名称

程序示例:

public class demo4 {
    public static void main(String[] args) {
        /*
         * public static string tobinarystring(int i) 得到二进制
         * public static string tooctalstring(int i) 得到八进制
         * public static string toHexstring(int i) 得到十六进制
         * public static int parseInt(string s) 将字符串类型的整数转成int类型的整数
         */

        // 1.把整数转成二进制, 十六进制
        String str1 = Integer.toBinaryString(100);
        System.out.println(str1);  // 1100100

        // 2.把整数转成八进制
        String str2 = Integer.toOctalString(100);
        System.out.println(str2);  // 144

        // 3.把整数转成十六进制
        String str3 = Integer.toHexString(100);
        System.out.println(str3);  // 64

        // 4.将字符串类型的整数转成int类型的整数
        // 强类型语言:每种数据在java中都有各自的数据类型
        // 在计算的时候, 如果不是同一种数据类型, 是无法直接计算的. 
        int i = Integer.parseInt("123");
        System.out.println(i);
        System.out.println(i + 1);  // 124
        // 细节1:
        // 在类型转换的时候, 括号中的参数只能是数字不能是其他, 否则代码会报错
        // 细节2:
        // 8种包装类当中, 除了Character都有对应的parseXxx的方法, 进行类型转换
        String str = "true";
        boolean b = Boolean.parseBoolean(str);
        System.out.println(b);
    }
}

程序示例:

import java.util.Scanner;

public class demo5 {
    public static void main(String[] args) {
        // 键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();
        System.out.println(str);
        // 弊端:
        // 当我们在使用next, nextInt, nextDouble在接收数据的时候, 遇到空格, 回车, 制表符的时候就停止了
        // 键盘录入的是123 123 那么此时只能接收到空格前面的数据
        // 我想要的是接收一整行数据
        // 约定:
        // 以后我们如果想要键盘录入, 不管什么类型, 统一使用nextLine
        // 特点:遇到回车才停止
        String line = sc.nextLine();
        System.out.println(line);
        double v = Double.parseDouble(line);
        System.out.println(v);
    }
}

练习题:

第一题:

import java.util.Scanner;

public class A05_IntegerDemo5 {
    public static void main(String[] args) {
        // 键盘录入
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        /*
         * String str = sc.next();
         * System.out.println(str);
         */
        // 弊端:
        // 当我们在使用next, nextInt, nextDouble在接收数据的时候, 遇到空格, 回车, 制表符的时候就停止了
        // 键盘录入的是123 123 那么此时只能接收到空格前面的数据
        // 我想要的是接收一整行数据
        // 约定:
        // 以后我们如果想要键盘录入, 不管什么类型, 统一使用nextLine
        // 特点:遇到回车才停止
        String line = sc.nextLine();
        System.out.println(line);
        double v = Double.parseDouble(line);
        System.out.println(v);
    }
}

第二题:

public class Test2 {
    public static void main(String[] args) {
        /*
         * 自己实现parseInt方法的效果, 将字符串形式的数据转成整数. 要求:
         * 字符串中只能是数字不能有其他字符最少一位, 最多10位日不能开头
         */

        // 1.定义一个字符串
        String str = "123";
        // 2.校验字符串
        // 习惯:会先把异常数据进行过滤, 剩下来就是正常的数据. 
        if (!str.matches("[1-9]\\d{0,9}")) {
            // 错误的数据
            System.out.println("数据格式有误");
        } else {
            // 正确的数据
            System.out.println("数据格式正确");
            // 3.定义一个变量表示最终的结果
            int number = 0;
            // 4.遍历字符串得到里面的每一个字符
            for (int i = 0; i < str.length(); i++) {
                int c = str.charAt(i) - '0';// 把每一位数字放到number当中
                number = number * 10 + c;
            }
            System.out.println(number);
            System.out.println(number + 1);
        }
    }
}

第三题:

public class Test3 {
    public static void main(String[] args) {
        /*
         * 
         * 定义一个方法自己实现toBinaryString方法的效果, 将一个十进制整数转成字符串表示的二进制
         * 
         */
    }

    public static String tobinarystring(int number) {// 6
        // 核心逻辑:
        // 不断的去除以2, 得到余数, 一直到商为日就结束. 
        // 还需要把余数倒着拼接起来

        // 定义一个StringBuilder用来拼接余数
        StringBuilder sb = new StringBuilder();
        // 利用循环不断的除以2获取余数
        while (true) {
            if (number == 0) {
                break;
            }
            // 获取余数 %
            int remaindar = number % 2;// 倒着拼接
            sb.insert(0, remaindar);
            // 除以2 /
            number = number / 2;
        }
        return sb.toString();
    }
}

第四题:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Date;

public class Test4 {
    public static void main(String[] args) throws ParseException {
        // 请使用代码实现计算你活了多少天, 用JDK7和JDK8两种方式完成
        // JDK7
        // 规则:只要对时间进行计算或者判断, 都需要先获取当前时间的毫秒值
        // 1.计算出生年月日的毫秒值
        String birthday = "2000年1月1日";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        Date date = sdf.parse(birthday);
        long birthdayTime = date.getTime();
        // 2.获取当前时间的毫秒值
        long todayTime = System.currentTimeMillis();
        // 3.计算间隔多少天
        long time = todayTime - birthdayTime;
        System.out.println(time / 1000 / 60 / 60 / 24);

        // JDK8
        LocalDate ld1 = LocalDate.of(2000, 1, 1);
        LocalDate ld2 = LocalDate.now();
        long days = ChronoUnit.DAYS.between(ld1, ld2);
        System.out.println(days);
    }
}

第五题:

import java.time.LocalDate;
import java.util.Calendar;

public class Test5 {
    public static void main(String[] args) {
        /*
         * 判断任意的一个年份是闰年还是平年要求:用JDK7和JDK8两种方式判断提示:
         * 二月有29天是闰年一年有366天是闰年
         */

        // jdk7
        // 我们可以把时间设置为2000年3月1日
        Calendar c = Calendar.getInstance();
        c.set(2000, 2, 1);
        // 月份的范围:0~11
        // 再把日历往前减一天
        c.add(Calendar.DAY_OF_MONTH, -1);
        // 看当前的时间是28号还是29号?
        int day = c.get(Calendar.DAY_OF_MONTH);
        System.out.println(day);

        // jdk8
        // 月份的范围:1~12
        // 设定时间为2000年的3月1日
        LocalDate ld = LocalDate.of(2001, 3, 1);
        // 把时间往前减一天
        LocalDate ld2 = ld.minusDays(1);
        // 获取这一天是一个月中的几号
        int day2 = ld2.getDayOfMonth();
        System.out.println(day2);

        // true:闰年
        // false:平年
        System.out.println(ld.isLeapYear());
    }
}

标签:String,包装,System,println,Integer,public,out
From: https://www.cnblogs.com/Chengkai730/p/18550564

相关文章

  • 构造方法,static,final关键字,字符串拼接,基本数据类型、包装类转String,String转基本
    1.构造方法的特点1.每一个类都至少有一个构造方法,默认是无参的构造方法。一旦写了有参的构造方法,那么无参的构造方法就丢失了,需要自己显式的写出无参构造方法。一般只要是显式写出构造方法,无参的构造方法是必须要构造的。2、构造方法,方法名必须和类名保持一致,并且没有返回值,......
  • Java中包装类型和基本类型的区别:深入理解与应用
    Java中包装类型和基本类型的区别:深入理解与应用引言在Java编程中,基本类型(PrimitiveTypes)和包装类型(WrapperTypes)是两种不同的数据类型。基本类型是Java语言的核心部分,而包装类型则是为了提供更多的功能和灵活性。本文将深入探讨Java中包装类型和基本类型的区别,帮助你更......
  • 包装设计的魔法——以色彩与创意触动目标群体的心弦
    在当今这个视觉为王的时代,包装设计早已超越了保护商品的基本功能,它成为了品牌与消费者之间沟通的第一语言。一个精心设计的包装,不仅能够吸引目标群体的注意,还能激发他们的购买欲望,甚至建立起品牌忠诚度。本文就以全速为小象超市设计的一系列食品包装为例,探讨包装设计如何体现......
  • 深圳保税区仓储包装和分拣集拼的功能介绍
    保税仓库的定义很多人将保税仓、保税区、保税仓库等混淆,其实三者在海关监管中属于不同规章制度调整范畴,运作模式及要求存在很大差异。如频繁出现于跨境电商报道中的“保税仓”,通常是指海关特殊监管区域及保税物流中心(B型)内的仓储场所,并非指保税仓库,“保税仓”虽然颇为准确地......
  • 在包装网站pacdora充值的时候用了这个折扣码,会员价直接打折!比平时便宜多了
    只需要按照图片示意的步骤操作就行了!需要手动充值,自动续费是不享受折扣的,用折扣码充值完后记得关掉自动续费包月功能~pacdora会员折扣码:JYC20字母用大写!不要有空格键!每次充值时输入折扣码,充值好后记得关掉自动续费功能,折扣码只有手动有效! ......
  • 璞华印前编辑软件、包装自动化流程、包装盒型库插件参加台北国际印刷机材展
    近期,我司包装软件等产品亮相台北国际印刷机材展(TIGAX24,2024TaipeiInternationalGraphicArtsExhibition)的台湾地区代理商协进国际有限公司展台。台北国际印刷机材展两年举办一次,展出内容涵盖平版、凸版、凹版、网版、柔版及数字喷墨、电子墨水、色粉打印等技术,展示台湾及......
  • 包装盒贴标机的设计(开题报告1)
    毕业论文(设计)开题报告题目包装盒贴标机的设计题目类别毕业设计姓名专业班级学号一、选题背景及依据(简述国内外研究状况和相关领域中已有的研究成果(文献综述),选题目的、意义,列出主要参考文献)一、选题背景及依据(一)选题背景与依据在当今快速发展的工业时代,自动化......
  • C++11中lambda表达式与包装器
    目录1.lambda表达式1.1引入lambda表达式1.2lambda表达式用法1.3函数对象与lambda表达式2.包装器2.1function包装器2.2bind1.lambda表达式在C++98中,如果想要对一个数据集合中的元素进行排序,可以使用std::sort方法。//lambda表达式#include<iostream>#inc......
  • 包装类型-数组Array方法
    数组Array使用详解认识数组(Array)◼什么是数组(Array)呢?对象允许存储键值集合,但是在某些情况下使用键值对来访问并不方便;比如说一系列的商品、用户、英雄,包括HTML元素,我们如何将它们存储在一起呢?这个时候我们需要一种有序的集合,里面的元素是按......
  • 包装类型-String方法
    字符串类型StringString类的补充(一)-基本使用◼在开发中,我们经常需要对字符串进行各种各样的操作,String类提供给了我们对应的属性和方法。◼String常见的属性:length:获取字符串的长度;◼String也有很多常见的方法和操作,我们来进行学习。◼操作一:访问字符串的......