12-常用类

1. 包装类

针对八种基本数据类型封装的相应的引用类型。

有了类的特点,就可以调用类中的方法。(为什么要封装)

基本数据类型包装类
booleanBoolean
char        Character
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble

1.1 装箱与拆箱

装箱:基本类型 ——> 包装类型

拆箱:包装类型 ——> 基本类型

JDK5之后,都是自动拆箱与自动装箱,不用手动控制。

自动装箱底层调用的是valueOf方法,如 Integer.valueOf()。

代码示例:

public static void main(String[] args) {
    // 手动装箱 int->Integer
    int n1 = 100;
    Integer integer = new Integer(n1);
    Integer integer1 = Integer.valueOf(n1);
    // 手动拆箱 Integer -> int
    int i = integer.intValue();

    int n2 = 200;
    // 自动装箱 int->Integer
    Integer integer2 = n2; //底层使用的是 Integer.valueOf(n2)
    // 自动拆箱 Integer->int
    int n3 = integer2; //底层仍然使用的是 intValue()方法
}

2. String类

保存的是一组字符序列。字符串的字符使用的是 Unicode 字符编码,一个字符(不区分字母还是汉字)占两个字节。

创建 String 对象的两种方式

// 直接赋值
String s = "路明非";

// 调用构造器
String s1 = new String("路明非");

两者有什么不同

  • 直接赋值

先从常量池查看是否有 "路明非" 数据空间,如果有,直接指向;

如果没有这重新创建,然后指向,s最终指向的是常量池的空间地址。

  • 构造器赋值

先在堆中创建空间,里面维护了value属性,指向常量池的 "路明非" 数据空间。

如果常量池没有 "路明非",创新创建,如果有,直接通过value指向。最终指向的是堆中的空间地址。

内存分布图

注意:

String 是一个 final 类,代表不可变的字符序列。改变赋值,相当于就是再创建了一个对象。

jdk 源码

String类的常见方法

  • equals        // 区分大小写,判断内容是否相等
  • equalsIgnoreCase      // 忽略大小写的判断内容是否相等
  • length      // 获取字符的个数,字符串的长度
  • indexOf    // 获取字符在字符串中第一次出现的索引,索引从0开始,如果找不到,返回-1
  • lastIndexOf      // 获取字符在字符串中最后一次出现的索引,索引从0开始,如果找不到,返回-1
  • substring      // 截取指定范围的子串
  • trim      // 去除空格
  • charAt      // 获取某索引处的字符

3. StringBuffer 类

String 保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低。

StringBuffer 保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率较高。(char[] value 这个放在堆中)

代码示例

public static void main(String[] args) {
    // 1. StringBuffer 的直接父类 是 AbstractStringBuilder
    // 2. StringBuffer 实现了 Serializable, 即 StringBuffer 的对象可以串行化
    // 3. 在父类中 AbstractStringBuilder 有属性 char[] value,不是 final
    // 该 value 数组存放 字符串内容,引出存放在堆中的
    // 4. StringBuffer 是一个 final 类,不能被继承
    // 5. 因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除)
    // 不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String
    StringBuffer stringBuffer = new StringBuffer("hello");
}

String 和 StringBuffer 相互转换

public static void main(String[] args) {
    // String —> StringBuffer
    String str = "hello tom";
    // 方式 1 使用构造器
    StringBuffer stringBuffer = new StringBuffer(str);
    // 方式 2 使用的是 append 方法
    StringBuffer stringBuffer1 = new StringBuffer();
    stringBuffer1 = stringBuffer1.append(str);

    // StringBuffer -> String
    StringBuffer stringBuffer3 = new StringBuffer("路明非");
    // 方式 1 使用 StringBuffer 提供的 toString 方法
    String s = stringBuffer3.toString();
    // 方式 2: 使用构造器来搞定
    String s1 = new String(stringBuffer3);
}

4. StringBuilder类

一个可变的字符序列。相比于StringBuffer,StringBuilder不是线程安全的,但是速度要比StringBuffer要快。

代码示例

public static void main(String[] args) {
    // 1. StringBuilder 继承 AbstractStringBuilder 类
    // 2. 实现了 Serializable ,说明 StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件)
    // 3. StringBuilder 是 final 类, 不能被继承
    // 4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的 char[] value;
    // 因此,字符序列是堆中
    // 5. StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,因此在单线程的情况下使用
    StringBuilder stringBuilder = new StringBuilder();
}

String、StringBuffer、StringBuilder的比较

  • String:不可变字符序列,效率低,但是复用率高。
  • StringBuffer:可变字符序列,效率较高,线程安全。
  • StringBuilder:可变字符序列,效率最高,线程不安全。

效率测试代码示例

public static void main(String[] args) {
    long startTime = 0L;
    long endTime = 0L;
    StringBuffer buffer = new StringBuffer("");
    startTime = System.currentTimeMillis();
    for (int i = 0; i < 80000; i++) {//StringBuffer 拼接 20000 次
        buffer.append(String.valueOf(i));
    }
    endTime = System.currentTimeMillis();
    System.out.println("StringBuffer 的执行时间:" + (endTime - startTime));

    StringBuilder builder = new StringBuilder("");
    startTime = System.currentTimeMillis();
    for (int i = 0; i < 80000; i++) {//StringBuilder 拼接 20000 次
        builder.append(String.valueOf(i));
    }
    endTime = System.currentTimeMillis();
    System.out.println("StringBuilder 的执行时间:" + (endTime - startTime));

    String text = "";
    startTime = System.currentTimeMillis();
    for (int i = 0; i < 80000; i++) {//String 拼接 20000
        text = text + i;
    }
    endTime = System.currentTimeMillis();
    System.out.println("String 的执行时间:" + (endTime - startTime));
}

如何选择

  • 如果字符串存在大量修改操作,一般使用 Stringbuilder 或 StringBuffer
  • 如果字符串存在大量修改操作,并在单线程的情况,使用 StringBuilder
  • 如果字符串存在大量修改操作,并在多线程的情况,使用 StringBuffer
  • 如果字符串很少修改,被多个对象引用,使用 String ,比如配置信息等

5. Math类

Math类包含用于执行基本数学运算的方法。

代码示例

public static void main(String[] args) {
    // 1.abs 绝对值
    int abs = Math.abs(-9);
    System.out.println(abs);//9

    // 2.pow 求幂
    double pow = Math.pow(2, 4);//2 的 4 次方
    System.out.println(pow);//16

    // 3.ceil 向上取整,返回>=该参数的最小整数(转成 double);
    double ceil = Math.ceil(3.9);
    System.out.println(ceil);//4.0

    // 4.floor 向下取整,返回<=该参数的最大整数(转成 double)
    double floor = Math.floor(4.001);
    System.out.println(floor);//4.0

    // 5.round 四舍五入 Math.floor(该参数+0.5)
    long round = Math.round(5.51);
    System.out.println(round);//6

    // 6.sqrt 求开方
    double sqrt = Math.sqrt(9.0);
    System.out.println(sqrt);//3.0

    // 7.random 求随机数 random 返回的是 0 <= x < 1 之间的一个随机小数
    // Math.random()*6 返回的是 0 <= x < 6 小数
    // 思考:请写出获取 a-b 之间的一个随机整数,a,b 均为整数 ,比如 a = 2, b=7
    // 公式就是 (int)(a + Math.random() * (b-a +1) )
    for(int i = 0; i < 100; i++) {
        System.out.println((int)(2 + Math.random() * (7 - 2 + 1)));
    }

    // max , min 返回最大值和最小值
    int min = Math.min(1, 9);
    int max = Math.max(45, 90);
    System.out.println("min=" + min);
    System.out.println("max=" + max);
}

6. Arrays类

Arrays里面包含了一系列静态方法,用于管理和操作数组

常用方法

  • toString:返回数组的字符串形式
  • sort:排序
  • binarySearch:二分查找、要求是有序列表
  • copyOf:数组元素的复制
  • fill:数组元素的填充
  • equals:比较两个数组元素内容是否完全一致
  • asList:将一组值,转换成list 

7. System类 

常用方法

  • exit:退出当前程序
  • currentTimeMillens:返回当前时间距离1970-1-1的毫秒数
  • gc:运行垃圾回收机制

8. BigInteger类 和 BigDecimal类

应用场景

  • BigInteger:保存比较大的整形。
  • BigDecimal:保存精度更高的浮点数。

常用方法

  • add:加
  • subtract:减
  • multiply:乘
  • divide:除

代码示例

public static void main(String[] args) {
    // 需要处理很大的整数,long 不够用,可以使用 BigInteger 的类
    BigInteger bigInteger = new BigInteger("23788888899999999999999999999");
    BigInteger bigInteger2 = new BigInteger("10099999999999999999999999999999999999999999999999999999999999999999999999999999999");
    System.out.println(bigInteger);

    // 在对 BigInteger 进行加减乘除的时候,需要使用对应的方法,不能直接进行+ - * /
    BigInteger add = bigInteger.add(bigInteger2);
    System.out.println(add); //加
    BigInteger subtract = bigInteger.subtract(bigInteger2);
    System.out.println(subtract); //减
    BigInteger multiply = bigInteger.multiply(bigInteger2);
    System.out.println(multiply); //乘
    BigInteger divide = bigInteger.divide(bigInteger2);
    System.out.println(divide); //除
}

public static void main(String[] args) {
    // 需要保存一个精度很高的数时,double 不够用,用BigDecimal
    BigDecimal bigDecimal = new BigDecimal("1999.11");
    BigDecimal bigDecimal2 = new BigDecimal("3");
    System.out.println(bigDecimal);

    // 如果对 BigDecimal 进行运算,比如加减乘除,需要使用对应的方法
    System.out.println(bigDecimal.add(bigDecimal2));
    System.out.println(bigDecimal.subtract(bigDecimal2));
    System.out.println(bigDecimal.multiply(bigDecimal2));
    //System.out.println(bigDecimal.divide(bigDecimal2));//可能抛出异常 ArithmeticException
    // 在调用 divide 方法时,指定精度即可. BigDecimal.ROUND_CEILING
    // 如果有无限循环小数,就会保留 分子 的精度
    System.out.println(bigDecimal.divide(bigDecimal2, BigDecimal.ROUND_CEILING));
}

9. 日期类

9.1 第一代日期类Date

  • Date:精确到毫秒,代表特定的瞬间
  • SimpleDateFormat:格式化日期。(日期 -> 文本、文本 -> 日期)

代码示例

public static void main(String[] args) throws ParseException {
    // Date 类是在 java.util 包
    // 默认输出的日期格式是国外的方式, 因此通常需要对格式进行转换
    Date d1 = new Date(); //获取当前系统时间
    System.out.println("当前日期=" + d1);

    // 创建 SimpleDateFormat 对象,可以指定相应的格式
    // 这里的格式使用的字母是规定好,不能乱写
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy 年 MM 月 dd 日 hh:mm:ss E");
    String format = sdf.format(d1); // format:将日期转换成指定格式的字符串
    System.out.println("当前日期=" + format);

    // 把 String -> Date , 使用的 sdf 格式需要和你给的 String 的格式一样,否则会抛出转换异常            
    String s = "1996 年 01 月 01 日 10:20:30 星期一";
    Date parse = sdf.parse(s);
    System.out.println("parse=" + sdf.format(parse));
}

9.2 第二代日期类Calendar

Calendar类是一个抽象类,它为特定瞬间与一组诸如YERA、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法。

 代码示例

public static void main(String[] args) {
    // Calendar 是一个抽象类, 并且构造器是 private,通过 getInstance() 来获取实例
    // Calendar 没有提供对应的格式化的类,因此需要程序员自己组合来输出(灵活)
    // 如果需要按照 24 小时进制来获取时间, Calendar.HOUR ==改成=> Calendar.HOUR_OF_DAY
    Calendar c = Calendar.getInstance(); 
    System.out.println("c=" + c);

    // 获取日历对象的某个日历字段
    System.out.println("年:" + c.get(Calendar.YEAR));
    // 这里为什么要 + 1, 因为 Calendar 返回月时候,是按照 0 开始编号
    System.out.println("月:" + (c.get(Calendar.MONTH) + 1));
    System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH));
    System.out.println("小时:" + c.get(Calendar.HOUR));
    System.out.println("分钟:" + c.get(Calendar.MINUTE));
    System.out.println("秒:" + c.get(Calendar.SECOND));
    // Calender 没有专门的格式化方法,所以需要程序员自己来组合显示
    System.out.println(c.get(Calendar.YEAR) + "-" + (c.get(Calendar.MONTH) + 1) + "-" +c.get(Calendar.DAY_OF_MONTH) +
" " + c.get(Calendar.HOUR_OF_DAY) + ":" + c.get(Calendar.MINUTE) + ":" + c.get(Calendar.SECOND) );
}

9.3 第三代日期类

JDK8新加入的

  • LocalDate:获取日期(年月日)
  • LocalTime:获取时间(时分秒)
  • LocalDateTime:获取日期 + 时间

代码示例

public static void main(String[] args) {
    // 1. 使用 now() 返回表示当前日期时间的对象
    LocalDateTime ldt = LocalDateTime.now(); 
    System.out.println(ldt);

    // 2. 使用 DateTimeFormatter 对象来进行格式化
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String format = dateTimeFormatter.format(ldt);
    System.out.println("格式化的日期=" + format);
    System.out.println("年=" + ldt.getYear());
    System.out.println("月=" + ldt.getMonth());
    System.out.println("月=" + ldt.getMonthValue());
    System.out.println("日=" + ldt.getDayOfMonth());
    System.out.println("时=" + ldt.getHour());
    System.out.println("分=" + ldt.getMinute());
    System.out.println("秒=" + ldt.getSecond());

    LocalDate now = LocalDate.now(); //可以获取年月日
    LocalTime now2 = LocalTime.now();//获取到时分秒
    // 提供 plus 和 minus 方法可以对当前时间进行加或者减
    // 看看 890 天后,是什么时候 把 年月日-时分秒
    LocalDateTime localDateTime = ldt.plusDays(890);
    System.out.println("890 天后=" + dateTimeFormatter.format(localDateTime));
    // 看看在 3456 分钟前是什么时候,把 年月日-时分秒输出
    LocalDateTime localDateTime2 = ldt.minusMinutes(3456);
    System.out.println("3456 分钟前 日期=" + dateTimeFormatter.format(localDateTime2));
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/658133.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

seRsync + Rsync 实时同步

1&#xff0c;结构图 2&#xff0c;节点A 2.1 安装rsync yum install -y rsync2.2 安装seRsync 下载这个压缩包sersync2.5.4_64bit_binary_stable_final.tar.gz 解压后&#xff0c;将sersync2复制到系统可执行程序路径&#xff1a;/usr/local/bin/&#xff1b;创建sersync配…

Visual Studio 的使用

目录 1. 引言 2. 安装和配置 2.1 系统要求 2.2 安装步骤 2.3 初次配置 3. 界面介绍 3.1 菜单栏和工具栏 3.2 解决方案资源管理器 3.3 编辑器窗口 3.4 输出窗口 3.5 错误列表 3.6 属性窗口 4. 项目管理 4.1 创建新项目 4.2 导入现有项目 4.3 项目属性配置 5. 代…

SpringSecurity6从入门到实战之SpringSecurity快速入门

SpringSecurity6从入门到实战之SpringSecurity快速入门 环境准备 依赖版本号springsecurity6.0.8springboot3.0.12JDK17 这里尽量与我依赖一致,免得在学习过程中出现位置的bug等 创建工程 这里直接选择springboot初始化快速搭建工程,导入对应的jdk17进行创建 直接勾选一个web…

QtCreator调试运行工程报错,无法找到相关库的的解决方案

最新在使用国产化平台做qt应用开发时&#xff0c;总是遇到qtcreator内调试运行 找不到动态库的问题&#xff0c;为什么会出现这种问题呢&#xff1f;明明编译的时候能够正常通过&#xff0c;运行或者调试的时候找不到相关的库呢&#xff1f;先说结论&#xff0c;排除库本身的问…

计算机网络7——网络安全1 概述与加密

文章目录 一、网络安全问题概述1、计算机网络面临的安全性威胁2、安全的计算机网络3、数据加密模型 二、两类密码体制1、对称密钥密码体制2、公钥密码体制 随着计算机网络的发展&#xff0c;网络中的安全问题也日趋严重。当网络的用户来自社会各个阶层与部门时&#xff0c;大量…

Raven2掠夺者2渡鸦2账号怎么验证 注册怎么验证账号教程

《渡鸦2》作为韩国孕育的次世代MMORPG手游巨制&#xff0c;是《Raven》系列辉煌传奇的最新篇章&#xff0c;它在暗黑奇幻的广袤天地间再度挥洒创意&#xff0c;深度融合前所未有的游戏机制与海量新颖内容&#xff0c;为该类型游戏树立了崭新的里程碑。公测日期锁定在2024年5月2…

2024 在Pycharm管理数据库

2024 在Pycharm管理数据库 Pycharm 社区版DataBase Navigator 数据库管理插件(Plugins)安装使用(sqlite为例添加数据) 文章目录 2024 在Pycharm管理数据库一、Pycharm数据库配置1、Database Navigator插件安装2、连接数据库 二、数据库使用1、插件自带基本操作2、控制台操作 …

LAMP集群分布式实验报告

前景&#xff1a; 1.技术成熟度和稳定性&#xff1a; LAMP架构&#xff08;Linux、Apache、MySQL、PHP&#xff09;自1998年提出以来&#xff0c;经过长时间的发展和完善&#xff0c;已经成为非常成熟和稳定的Web开发平台。其中&#xff0c;Linux操作系统因其高度的灵活性和稳…

恢复视频3个攻略:从不同情况下的恢复方法到实践!

随着科技的进步&#xff0c;我们的生活被各种各样的数字内容所包围&#xff0c;其中&#xff0c;视频因其独特的记录性质&#xff0c;承载着许多重要的资料。但不管是自媒体人还是普通人日常生活随手一拍&#xff0c;都会遇到误删视频的情况。为了帮助您找回手机视频&#xff0…

2024全新升级版家政服务小程序源码 支持家政预约+上门服务+SAAS系统+可二开

随着科技的飞速发展&#xff0c;家政服务行业也迎来了数字化转型的浪潮。为了满足市场日益增长的需求&#xff0c;分享一款2024全新升级版的家政服务小程序源码。该源码不仅支持家政预约和上门服务&#xff0c;还集成了SAAS系统&#xff0c;并支持二次开发&#xff0c;为用户带…

【机器学习300问】103、简单的经典卷积神经网络结构设计成什么样?以LeNet-5为例说明。

一个简单的经典CNN网络结构由&#xff1a;输入层、卷积层、池化层、全连接层和输出层&#xff0c;这五种神经网络层结构组成。它最最经典的实例是LeNet-5&#xff0c;它最早被设计用于手写数字识别任务&#xff0c;包含两个卷积层、两个池化层、几个全连接层&#xff0c;以及最…

企业级OV SSL证书的应用场景和加密手段

为了保护数据传输的安全性与用户隐私&#xff0c;企业级OVSSL&#xff08;Organization Validation SSL&#xff09;证书成为众多企业的首选安全解决方案。本文将深入探讨OVSSL证书的应用场景及其实现数据加密的核心手段&#xff0c;为企业构建坚不可摧的在线信任桥梁提供指南。…

【面试干货】约瑟夫问题

【面试干货】约瑟夫问题 1、实现思想2、代码实现 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 约瑟夫问题 是一个经典的数学问题&#xff0c;描述如下&#xff1a;编号为1, 2, …, n的n个人按顺时针方向围坐一圈&#xff0c;从第1个人开始…

实战教程:使用Go的net/http/fcgi包打造高性能Web应用

实战教程&#xff1a;使用Go的net/http/fcgi包打造高性能Web应用 简介理解FCGI协议FastCGI工作原理CGI与FastCGI对比其他接口对比 初步使用net/http/fcgi包设置和配置基础环境一个简单的FastCGI应用示例本地测试与调试 深入net/http/fcgi包的高级用法探索net/http/fcgi的主要功…

《最新出炉》系列入门篇-Python+Playwright自动化测试-46-鼠标滚轮操作

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 1.简介 有些网站为了节省流量和资源&#xff0c;提高加载效率&#xff0c;采用的是动态加载&#xff08;懒加载&#xff09;的&#xff0c;也就是当拖动页面右侧滚动条后会自动加载网…

go语言方法之方法声明

从我们的理解来讲&#xff0c;一个对象其实也就是一个简单的赋值或者一个变量&#xff0c;在这个对象中会包含一些方法&#xff0c;而一个方法则是一个一个和特殊类型关联的函数。一个面向对象的程序会用方法来表达其属性和对应的操作&#xff0c;这样使用这个对象的用户就不需…

云计算-Lambda事件 (Lambda Events)

检索事件信息 (Retrieving Event Information) 在上一个主题中&#xff0c;我们已经看到了如何创建一个Lambda函数、添加handler、添加触发器和配置执行策略。在本主题中&#xff0c;我们将对其进行扩展。到目前为止&#xff0c;我们看到的handler应用非常简单&#xff0c;但我…

STM32_HAL_使用FPEC实现闪存的读写

STM32的FLASH结构 主存储器&#xff08;Main Memory&#xff09;&#xff1a;这是STM32中最大的存储区域&#xff0c;用于存储用户的程序代码、常量数据以及程序运行时不变的数据。STM32的主存储器通常被组织为多个扇区&#xff08;sector&#xff09;&#xff0c;每个扇区的大…

项目十三:搜狗——python爬虫实战案例

根据文章项目十二&#xff1a;简单的python基础爬虫训练-CSDN博客的简单应用&#xff0c;这一次来升级我们的技术&#xff0c;那么继续往下看&#xff0c;希望对技术有好运。 还是老样子&#xff0c;按流程走&#xff0c;一条龙服务&#xff0c;嘿嘿。 第一步&#xff1a;导入…

git 学习随笔

git 学习随笔 基本概念 git 对待数据类似快照流的形式而不是类似 cvs 那样的纪录文件随时间逐步积累的差异 git 中所有数据在存储钱都会计算校验和&#xff08;hash) 三种状态&#xff1a;已提交(committed)&#xff0c;已修改(modified)&#xff0c;已暂存(staged)。 add…