12-常用类

news2024/11/25 18:26:06

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));
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode 518.零钱兑换Ⅱ

思路&#xff1a; 这题和之前做的不大一样&#xff0c;之前的动态规划转化成背包问题一般都是求能放入的最大重量&#xff0c;这个是求组合数。 求组合数的状态转移方程之前在1和0提到过&#xff1a; dp[j]dp[j-nums[]i]; 这里重点分析一下遍历顺序&#xff1a; 这段代码里面是…

算法学习笔记(7)-贪心算法

##什么是贪心算法 一种常见的解决优化类型的问题&#xff0c;基本的思想是在问题的每个决策阶段&#xff0c;都选择当前看起来最优的选择&#xff0c;即贪心地做出局部最优解的决策&#xff0c;以期待获得全局最优解。 ##贪心算法与动态规划的区别&#xff08;二者都为解决优化…

苏洵,大器晚成的家风塑造者

&#x1f4a1; 如果想阅读最新的文章&#xff0c;或者有技术问题需要交流和沟通&#xff0c;可搜索并关注微信公众号“希望睿智”。 苏洵&#xff0c;字明允&#xff0c;号老泉&#xff0c;生于宋真宗大中祥符二年&#xff08;公元1009年&#xff09;&#xff0c;卒于宋英宗治平…

linux解压.zip文件命令详解

在Linux中解压.zip文件&#xff0c;你可以使用unzip命令。如果你的系统中没有安装unzip&#xff0c;你可以使用包管理器来安装它。 Debian的系统&#xff08;Ubuntu&#xff09;&#xff0c;安装命令&#xff1a; sudo apt-get install unzip基于Red Hat的系统&#xff08;如…

想让企业“火力全开”?找六西格玛培训公司就对了!

在如今的市场环境中&#xff0c;企业面临着不断变化的挑战和无限的可能。要在这场竞争中独领风骚&#xff0c;实现稳健的增长&#xff0c;六西格玛作为一种以数据驱动的管理理论&#xff0c;提供了实际可行的解决方案。六西格玛培训公司&#xff0c;作为这一领域的专家&#xf…

广东海上丝绸之路文化促进会正式批复荐世界酒中国菜的指导单位

广东海上丝绸之路文化促进会正式批复成为“世界酒中国菜”系列活动指导单位 近日&#xff0c;广东海上丝绸之路文化促进会近日正式批复荐酒师国际认证&#xff08;广州&#xff09;有限公司&#xff0c;成为备受瞩目的“世界酒中国菜”系列活动的指导单位。此举旨在通过双方的…

香橙派OrangePI AiPro测评

实物 为AI而生 打开盒子 截图电源开机进入 作为一个AI产品,必须有一个人机交互的界面才行。大家都在跑算法,于是我就开始进行整理着手整理搭建Qt的环境。 1、下载源码 wget https://download.qt.io/archive/qt/5.12/5.12.12/single/qt-everywhere-src-5.12.12.tar.xz待…

网吧|基于SprinBoot+vue的网吧管理系统(源码+数据库+文档)

网吧管理系统 目录 基于SprinBootvue的网吧管理系统 一、前言 二、系统设计 三、系统功能设计 1 管理员功能模块 2 网管功能模块 3 会员功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#…

C++之类(class)的三种访问修饰符(public、private、protected)----成员变量与函数权限

1、背景介绍 在C中&#xff0c;类&#xff08;class&#xff09;的三种访问修饰符&#xff08;access specifiers&#xff09;用于控制类的成员&#xff08;属性和方法&#xff09;的访问权限。这些修饰符决定了类成员在类的外部是否可以被访问。以下是这三种访问修饰符的详细…

软件架构设计之质量属性浅析

引言 在数字化浪潮席卷而来的今天&#xff0c;软件已经渗透到我们生活的方方面面&#xff0c;从手机APP到大型企业级系统&#xff0c;无一不彰显着软件技术的魅力。然而&#xff0c;在这背后&#xff0c;软件架构设计作为软件开发的基石&#xff0c;其质量属性的重要性不言而喻…

前端开发工程师——AngularJS

一.表达式和语句 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-w…

win10修改conda环境和缓存默认路径

win10修改conda环境和缓存默认路径 conda环境和缓存的默认路径&#xff08;envs directories 和 package cache&#xff09;不一定要默认存储在用户目录&#xff0c;我们可以将他们设置到盈余空间稍大的其他目录来缓解这种空间压力&#xff0c;只要保证不同用户之间的设置不同…

【2】:向量与矩阵

向量 既有大小又有方向的量叫做向量 向量的模 向量的长度 单位向量 (只表示方向不表示长度) 向量的加减运算 向量求和 行向量与列向量的置换 图形学中竖着写 向量的长度计算 点乘&#xff08;计算向量间夹角&#xff09; 点乘满足的运算规律 交换律、结合律、分配…

C语言⾼位优先与低位优先的不同之处是什么?

一、问题 C语⾔的最⼤特⾊就是可移植性好。根据机器类型的不同&#xff0c;⾼位优先与低位优先也不同。那么&#xff0c;最好的可移植的 C 程序应该同时适⽤这两种类型的计算机。下⾯了解⼀下⾼位优先与低位优先的不同之处。 二、解答 所谓的⾼位优先&#xff0c;就是最低的地…

【哈希】闭散列的线性探测和开散列的哈希桶解决哈希冲突(C++两种方法模拟实现哈希表)(2)

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; C进阶 &#x1f389;其它专栏&#xff1a; C初阶 | Linux | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解 哈希函数与哈希 之 哈希桶解决哈希冲突 的相关内容。 如果看到最后…

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

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

20240529代码沉思--------聊聊清单革命

以下内容取自百度&#xff1a; 清单革命 清单革命是一场观念革命&#xff0c;旨在通过列出清晰、明确的清单来避免犯错和提高效率。以下是关于清单革命的一些核心观点和原则&#xff1a; 核心观点&#xff1a; 人类的错误主要分为两类&#xff1a;“无知之错”和“无能之错…

[ C++ ] 类和对象( 下 )

初始化列表 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟 一个放在括号中的初始值或表达式。 class Date { public: Date(int year, int month, int day): _year(year), _month(month), _d…

网络编程基础(四)

目录 前言 二、多点通信 2.1 单播 2.2 广播 2.2.1 广播得发送端实现--》类似与UDP的客户端 2.3 组播 2.3.1 组播发送端流程--》类似于UDP的客户端流程 2.3.2 组播的接收端流程---》类似于UDP的服务器端流程 前言 多点通信 一、套接字选项得获取和设置 int getsockopt(int…

感知觉训练:解锁独立生活的钥匙

在日新月异的科技时代&#xff0c;一款名为“蝙蝠避障”的辅助软件以其独到之处&#xff0c;为盲人朋友的日常生活平添了诸多便利&#xff0c;不仅实现了实时避障&#xff0c;还通过拍照识别功能扩展了信息获取的边界。然而&#xff0c;科技辅助之外&#xff0c;提升盲人朋友的…