爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Java常用类

      首页 知识中心 软件开发 文章详情页

      Java常用类

      2023-07-26 08:03:07 阅读次数:423

      java,String,字符串

      1、字符串相关的类

      1.1、String的特性

      • String类:代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作
        为此类的实例实现。
      • String是一个final类,代表不可变的字符序列。
      • 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
      • String对象的字符内容是存储在一个字符数组value[]中的。
      public final class String
      	implements java.io.Serializable, Comparable<String>, CharSequence {
      	/** The value is used for character storage. */
      	private final char value[];
      	/** Cache the hash code for the string */
      	private int hash; // Default to 0
      

      String s1 = “abc”;//字面量的定义方式
      String s2 = “abc”;
      s1 = “hello”;

      Java常用类

      1.2、String对象的创建

      String str = "hello";
      //本质上this.value = new char[0];
      String s1 = new String(); 
      //this.value = original.value;
      String s2 = new String(String original); 
      //this.value = Arrays.copyOf(value, value.length);
      String s3 = new String(char[] a); 
      String s4 = new String(char[] a,int startIndex,int count);
      

      内存模型解析:
      Java常用类
      Java常用类
      String str1 = “abc”;与String str2 = new String(“abc”);的区别?

      • 字符串常量存储在字符串常量池,目的是共享
      • 字符串非常量对象存储在堆中。
        Java常用类

      1.3、字符串对象是如何存储的

      String s1 = "javaEE";
      String s2 = "javaEE";
      String s3 = new String("javaEE");
      String s4 = new String("javaEE");
      System.out.println(s1 == s2);//true
      System.out.println(s1 == s3);//false
      System.out.println(s1 == s4);//false
      System.out.println(s3 == s4);//false
      

      内存解析:
      Java常用类
      测试:

      public class Person {
          public String name;
      
          public static void main(String[] args) {
              Person p1 = new Person();
              p1.name = "atguigu";
              Person p2 = new Person();
              p2.name = "atguigu";
              System.out.println(p1.name .equals( p2.name)); //true
              System.out.println(p1.name == p2.name); //true
              System.out.println(p1.name == "atguigu"); //true
              String s1 = new String("bcde");
              String s2 = new String("bcde");
              System.out.println(s1==s2); //false
          }
      }
      

      内存解析:
      Java常用类
      测试:

      		String s1="hello";
              String s2="world";
              String s3="hello"+"world";
              String s4=s1+"world";
              String s5=s1+s2;
              String s6=(s1+s2).intern();
              System.out.println(s3==s4);//false
              System.out.println(s3==s5);//false
              System.out.println(s4==s5);//false
              System.out.println(s3==s6);//true
      

      内存解析:

      Java常用类

      结论:

      • 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
      • 只要其中有一个是变量,结果就在堆中
      • 如果拼接的结果调用intern()方法,返回值就在常量池中

      1.4、String使用陷阱

      String s1 = "a";
      说明:在字符串常量池中创建了一个字面量为"a"的字符串。
      s1 = s1 + "b";
      说明:实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符串s1+“b”(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。
      String s2 = "ab";
      说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。
      String s3 = "a" + "b";
      说明:s3指向字符串常量池中已经创建的"ab"的字符串。
      String s4 = s1.intern();
      说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串赋值给s4。

      Java常用类

      1.5、String常用方法

      int length():返回字符串的长度: return value.length
      char charAt(int index): 返回某索引处的字符return value[index]
      boolean isEmpty():判断是否是空字符串:return value.length == 0 String toLowerCase():使用默认语言环境,将 String 中的所有字符转换为小写
      String toUpperCase():使用默认语言环境,将 String 中的所有字符转换为大写
      String trim():返回字符串的副本,忽略前导空白和尾部空白
      boolean equals(Object obj):比较字符串的内容是否相同
      boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写
      String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+”
      int compareTo(String anotherString):比较两个字符串的大小
      String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
      String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
      boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
      boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始
      boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
      boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true
      int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引
      int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
      int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引
      int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
      注:indexOf和lastIndexOf方法如果未找到都是返回-1
      String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
      String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
      String replaceAll(String regex, String replacement) : 使 用 给 定 的
      replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
      String replaceFirst(String regex, String replacement) : 使 用 给 定 的replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
      boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
      String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
      String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。

      1.6、复 习

      字符串 => 基本数据类型、包装类

      • Integer包装类的public static int parseInt(String s):可以将由“数字”字符组成的字符串转换为整型。
      • 类似地,使用java.lang包中的Byte、Short、Long、Float、Double类调相应的类方法可以将由“数字”字符组成的字符串,转化为相应的基本数据类型。

      基本数据类型、包装类 => 字符串

      • 调用String类的public String valueOf(int n)可将int型转换为字符串
      • 相应的valueOf(byte b)、valueOf(long l)、valueOf(float f)、valueOf(double
        d)、valueOf(boolean b)可由参数的相应类型到字符串的转换

      字符数组 => 字符串

      • String 类的构造器:String(char[]) 和 String(char[],int offset,intlength) 分别用字符数组中的全部字符和部分字符创建字符串对象。

      字符串 => 字符数组

      • public char[] toCharArray():将字符串中的全部字符存放在一个字符数组
        中的方法。
      • public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):提供了将指定索引范围内的字符串存放到数组中的方法。

      字符数组 => 字符串

      • String 类的构造器:String(char[]) 和 String(char[],int offset,intlength) 分别用字符数组中的全部字符和部分字符创建字符串对象。

      字符串 => 字符数组

      • public char[] toCharArray():将字符串中的全部字符存放在一个字符数组中的方法。
      • public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):提供了将指定索引范围内的字符串存放到数组中的方法。

      1.7、StringBuffer类

      java.lang.StringBuffer代表**可变的字符序列**,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。

      • 很多方法与String相同。
      • 作为参数传递时,方法内部可以改变值。
        Java常用类

      StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:

      • StringBuffer():初始容量为16的字符串缓冲区
      • StringBuffer(int size):构造指定容量的字符串缓冲区
      • StringBuffer(String str):将内容初始化为指定字符串内容

      StringBuffer类的常用方法

      StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
      StringBuffer delete(int start,int end):删除指定位置的内容
      StringBuffer replace(int start, int end, String str):把[start,end)位置替换为str
      StringBuffer insert(int offset, xxx):在指定位置插入xxx
      StringBuffer reverse() :把当前字符序列逆转

      当append和insert时,如果原来value数组长度不够,可扩容。

      • 如上这些方法支持方法链操作。
        方法链的原理:
        Java常用类

      此外,还定义了如下的方法:

      public int indexOf(String str)
      public String substring(int start,int end)
      public int length()
      public char charAt(int n )
      public void setCharAt(int n ,char ch)

      StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样
      面试题:对比String、StringBuffer、StringBuilder

      • String(JDK1.0):不可变字符序列
      • StringBuffer(JDK1.0):可变字符序列、效率低、线程安全
      • StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全
        注意:作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder会改变其值。

      2、JDK8之前日期时间API

      Java常用类

      2.1、java.lang.System类

      System类提供的public static long currentTimeMillis()用来返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。

      • 此方法适于计算时间差。

      计算世界时间的主要标准有:

      • UTC(Coordinated Universal Time)
      • GMT(Greenwich Mean Time)
      • CST(Central Standard Time)

      2.1、java.util.Date类

      表示特定的瞬间,精确到毫秒
      构造器:

      • Date():使用无参构造器创建的对象可以获取本地当前时间。
      • Date(long date)

      常用方法

      • getTime():返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象
        表示的毫秒数。
      • toString():把此 Date 对象转换为以下形式的 String: dow mon dd
        hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue,
        Wed, Thu, Fri, Sat),zzz是时间标准。
      • 其它很多方法都过时了。

      2.3、 java.text.SimpleDateFormat类

      Date类的API不易于国际化,大部分被废弃了,java.text.SimpleDateFormat类是一个不与语言环境有关的方式来格式化和解析日期的具体类。
      它允许进行格式化:日期=>文本、解析:文本>日期
      格式化:

      • SimpleDateFormat() :默认的模式和语言环境创建对象
      • public SimpleDateFormat(String pattern):该构造方法可以用参数pattern
        指定的格式创建一个对象,该对象调用:
      • public String format(Date date):方法格式化时间对象date

      解析:

      • public Date parse(String source):从给定字符串的开始解析文本,以生成
        一个日期。

      Java常用类

      2.4、 java.util.Calendar(日历)类

      • Calendar是一个抽象基类,主用用于完成日期字段之间相互操作的功能。
      • 获取Calendar实例的方法
        • 使用Calendar.getInstance()方法
        • 调用它的子类GregorianCalendar的构造器。

      一个Calendar的实例是系统时间的抽象表示,通过get(int field)方法来取得想要的时间信息。比如YEAR、MONTH、DAY_OF_WEEK、HOUR_OF_DAY 、MINUTE、SECOND

       public void set(int field,int value)
       public void add(int field,int amount)
       public final Date getTime()
       public final void setTime(Date date)
      

      注意:
      获取月份时:一月是0,二月是1,以此类推,12月是11
      获取星期时:周日是1,周二是2 , 。。。。周六是7

      Calendar calendar = Calendar.getInstance();
      // 从一个 Calendar 对象中获取 Date 对象
      Date date = calendar.getTime();
      // 使用给定的 Date 设置此 Calendar 的时间
      date = new Date(234234235235L);
      calendar.setTime(date);
      calendar.set(Calendar.DAY_OF_MONTH, 8);
      System.out.println("当前时间日设置为8后,时间是:" + calendar.getTime());
      calendar.add(Calendar.HOUR, 2);
      System.out.println("当前时间加2小时后,时间是:" + calendar.getTime());
      calendar.add(Calendar.MONTH, -2);
      System.out.println("当前日期减2个月后,时间是:" + calendar.getTime());
      
      

      3、JDK8中新日期时间API

      3.1、新日期时间API出现的背景**

      如果我们可以跟别人说:“我们在1502643933071见面,别晚了!”那么就再简单不过了。但是我们希望时间与昼夜和四季有关,于是事情就变复杂了。JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了。而Calendar并不比Date好多少。它们面临的问题是:

      • 可变性:像日期和时间这样的类应该是不可变的。
      • 偏移性:Date中的年份是从1900开始的,而月份都从0开始。
      • 格式化:格式化只对Date有用,Calendar则不行。
      • 此外,它们也不是线程安全的;不能处理闰秒等。
        总结:对日期和时间的操作一直是Java程序员最痛苦的地方之一。

      3.2、新时间日期API

      第三次引入的API是成功的,并且Java 8中引入的java.time API 已经纠正了过去的缺陷,将来很长一段时间内它都会为我们服务。

      Java 8 吸收了 Joda-Time 的精华,以一个新的开始为 Java 创建优秀的 API。新的 java.time 中包含了所有关于本地日期(LocalDate)、本地时间(LocalTime)、本地日期时间(LocalDateTime)、时区(ZonedDateTime)和持续时间(Duration)的类。历史悠久的 Date 类新增了toInstant() 方法,用于把 Date 转换成新的表示形式。这些新增的本地化时间日期 API 大大简化了日期时间和本地化的管理。

      java.time – 包含值对象的基础包
      java.time.chrono – 提供对不同的日历系统的访问
      java.time.format – 格式化和解析时间和日期
      java.time.temporal – 包括底层框架和扩展特性
      java.time.zone – 包含时区支持的类

      说明:大多数开发者只会用到基础包和format包,也可能会用到temporal包。因此,尽
      管有68个新的公开类型,大多数开发者,大概将只会用到其中的三分之一。

      LocalDate、LocalTime、LocalDateTime类是其中较重要的几个类,它们的实例是不可变的对象,分别表示使用 ISO-8601日历系统的日期、时间、日期和时间。它们提供了简的本地日期或时间,并不包含当前的时间信息,也不包含与时区相关的信息。

      • LocalDate代表IOS格式(yyyy-MM-dd)的日期,可以存储 生日、纪念日等日期。
      • LocalTime表示一个时间,而不是日期。
      • LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。

      注:ISO-8601日历系统是国际标准化组织制定的现代公民的日期和时间的表示法,也就是公历。

      方法 描述
      now() / * now(ZoneId zone) 静态方法,根据当前时间创建对象/指定时区的对象
      of() 静态方法,根据指定日期/时间创建对象
      getDayOfMonth()/getDayOfYear() 获得月份天数(1-31) /获得年份天数(1-366)
      getDayOfWeek() 获得星期几(返回一个 DayOfWeek 枚举值)
      getMonth() 获得月份, 返回一个 Month 枚举值
      getMonthValue() / getYear() 获得月份(1-12) /获得年份
      getHour()/getMinute()/getSecond() 获得当前对象对应的小时、分钟、秒
      withDayOfMonth()/withDayOfYear()/withMonth()/withYear() 将月份天数、年份天数、月份、年份修改为指定的值并返回新的对象
      plusDays(), plusWeeks(), plusMonths(), plusYears(),plusHours() 向当前对象添加几天、几周、几个月、几年、几小时
      minusMonths() / minusWeeks()/minusDays()/minusYears()/minusHours() 从当前对象减去几月、几周、几天、几年、几小时

      3.3、瞬时:Instant

      Instant:时间线上的一个瞬时点。 这可能被用来记录应用程序中的事件时间戳。

      在处理时间和日期的时候,我们通常会想到年,月,日,时,分,秒。然而,这只是
      时间的一个模型,是面向人类的。第二种通用模型是面向机器的,或者说是连
      续的。在此模型中,时间线中的一个点表示为一个很大的数,这有利于计算机
      处理。在UNIX中,这个数从1970年开始,以秒为的单位;同样的,在Java中, 也是从1970年开始,但以毫秒为单位。

      java.time包通过值类型Instant提供机器视图,不提供处理人类意义上的时间 单位。Instant表示时间线上的一点,而不需要任何上下文信息,例如,时区。
      概念上讲,它只是简单的表示自1970年1月1日0时0分0秒(UTC)开始的秒 数。因为java.time包是基于纳秒计算的,所以Instant的精度可以达到纳秒级。

      (1 ns = 10-9 s) 1秒 = 1000毫秒 =106微秒=109纳

      方法 描述
      now() 静态方法,返回默认UTC时区的Instant类的对象
      ofEpochMilli(long epochMilli) 静态方法,返回在1970-01-01 00:00:00基础上加上指定毫秒数之后的Instant类的对象
      atOffset(ZoneOffset offset) 结合即时的偏移来创建一个 OffsetDateTime
      toEpochMilli() 返回1970-01-01 00:00:00到当前时间的毫秒数,即为时间戳

      时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

      3.4、格式化与解析日期或时间

      java.time.format.DateTimeFormatter 类:该类提供了三种格式化方法:
      预定义的标准格式。如:
      SO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME
      本地化相关的格式。如:ofLocalizedDateTime(FormatStyle.LONG)
      自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”

      方 法 描 述
      ofPattern(String pattern) 静态方法 , 返 回 一 个 指 定 字 符 串 格 式 DateTimeFormatter
      format(TemporalAccessor t) 格式化一个日期、时间,返回字符串
      parse(CharSequence text) 将指定格式的字符序列解析为一个日期、时间

      3.5、其它API

      ZoneId:该类中包含了所有的时区信息,一个时区的ID,如 Europe/Paris
      ZonedDateTime:一个在ISO-8601日历系统时区的日期时间,如 2007-12-
      03T10:15:30+01:00 Europe/Paris。

      • 其中每个时区都对应着ID,地区ID都为“{区域}/{城市}”的格式,例如:
        Asia/Shanghai等

      Clock:使用时区提供对当前即时、日期和时间的访问的时钟。
      持续时间:Duration,用于计算两个“时间”间隔
      日期间隔:Period,用于计算两个“日期”间隔
      TemporalAdjuster : 时间校正器。有时我们可能需要获取例如:将日期调整到“下一个工作日”等操作。
      TemporalAdjusters : 该类通过静态方法
      (firstDayOfXxx()/lastDayOfXxx()/nextXxx())提供了大量的常用
      TemporalAdjuster 的实现。

      		 //ZoneId:类中包含了所有的时区信息
              // ZoneId的getAvailableZoneIds():获取所有的ZoneId
              Set<String> zoneIds = ZoneId.getAvailableZoneIds();
              for (String s : zoneIds) {
                  System.out.println(s);
              }
              // ZoneId的of():获取指定时区的时间
              LocalDateTime localDateTime = LocalDateTime.now(ZoneId.of("Asia/Tokyo"));
              System.out.println(localDateTime);
              //ZonedDateTime:带时区的日期时间
              // ZonedDateTime的now():获取本时区的ZonedDateTime对象
              ZonedDateTime zonedDateTime = ZonedDateTime.now();
              System.out.println(zonedDateTime);
              // ZonedDateTime的now(ZoneId id):获取指定时区的ZonedDateTime对象
              ZonedDateTime zonedDateTime1 = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
              System.out.println(zonedDateTime1);
      		
      		//Duration:用于计算两个“时间”间隔,以秒和纳秒为基准
      		LocalTime localTime = LocalTime.now();
      		LocalTime localTime1 = LocalTime.of(15, 23, 32);
      		//between():静态方法,返回Duration对象,表示两个时间的间隔
      		Duration duration = Duration.between(localTime1, localTime);
      		System.out.println(duration);
      		System.out.println(duration.getSeconds());
      		System.out.println(duration.getNano());
      		LocalDateTime localDateTime = LocalDateTime.of(2016, 6, 12, 15, 23, 32);
      		LocalDateTime localDateTime1 = LocalDateTime.of(2017, 6, 12, 15, 23, 32);
      		Duration duration1 = Duration.between(localDateTime1, localDateTime);
      		System.out.println(duration1.toDays());
      
      		//Period:用于计算两个“日期”间隔,以年、月、日衡量
      		LocalDate localDate = LocalDate.now();
      		LocalDate localDate1 = LocalDate.of(2028, 3, 18);
      		Period period = Period.between(localDate, localDate1);
      		System.out.println(period);
      		System.out.println(period.getYears());
      		System.out.println(period.getMonths());
      		System.out.println(period.getDays());
      		Period period1 = period.withYears(2);
      		System.out.println(period1);
      
      
      		// TemporalAdjuster:时间校正器
      		// 获取当前日期的下一个周日是哪天?
      		TemporalAdjuster temporalAdjuster = TemporalAdjusters.next(DayOfWeek.SUNDAY);
      		LocalDateTime localDateTime = LocalDateTime.now().with(temporalAdjuster);
      		System.out.println(localDateTime);
      		// 获取下一个工作日是哪天?
      		LocalDate localDate = LocalDate.now().with(new TemporalAdjuster() {
      		@Override
      		public Temporal adjustInto(Temporal temporal) {
      		LocalDate date = (LocalDate) temporal;
      		if (date.getDayOfWeek().equals(DayOfWeek.FRIDAY)) {
      		return date.plusDays(3);
      		} else if (date.getDayOfWeek().equals(DayOfWeek.SATURDAY)) {
      		return date.plusDays(2);
      		} else {
      		return date.plusDays(1);
      		}
      		}
      		});
      System.out.println("下一个工作日是:" + localDate);
      
      
      

      3.6、参考:与传统日期处理的转换

      类 To 遗留类 From 遗留类
      java.time.Instant与java.util.Date Date.from(instant) date.toInstant()
      java.time.Instant与java.sql.Timestamp Timestamp.from(instant) timestamp.toInstant()
      java.time.ZonedDateTime与java.util.GregorianCalendar GregorianCalendar.from(zonedDateTime) cal.toZonedDateTime()
      java.time.LocalDate与java.sql.Time Date.valueOf(localDate) date.toLocalDate()
      java.time.LocalTime与java.sql.Time Date.valueOf(localDate) date.toLocalTime()
      java.time.LocalDateTime与java.sql.Timestamp Timestamp.valueOf(localDateTime) timestamp.toLocalDateTime()
      java.time.ZoneId与java.util.TimeZone Timezone.getTimeZone(id) timeZone.toZoneId()
      java.time.format.DateTimeFormatter与java.text.DateFormat formatter.toFormat() 无

      4、Java比较器

      在Java中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题。
      Java实现对象排序的方式有两种:

      • 自然排序:java.lang.Comparable
      • 定制排序:java.util.Comparator

      4.1、方式一:自然排序:java.lang.Comparable

      Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。

      实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。如果当前对象this大于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回负整数,如果当前对象this等于形参对象obj,则返回零。

      实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或
      Arrays.sort进行自动排序。实现此接口的对象可以用作有序映射中的键或有
      序集合中的元素,无需指定比较器。

      对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与
      e1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals
      一致。建议(虽然不是必需的) 最好使自然排序与 equals 一致

      Comparable 的典型实现:(默认都是从小到大排列的)

      • String:按照字符串中字符的Unicode值进行比较
      • Character:按照字符的Unicode值来进行比较
      • 数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值
        大小进行比较
      • Boolean:true 对应的包装类实例大于 false 对应的包装类实例
      • Date、Time等:后面的日期时间比前面的日期时间大
      public class Goods implements Comparable{
          private String name;
          private double price;
          //按照价格,比较商品的大小
          @Override
          public int compareTo(Object o) {
              if(o instanceof Goods) {
                  Goods other = (Goods) o;
                  if (this.price > other.price) {
                      return 1;
                  } else if (this.price < other.price) {
                      return -1;
                  }
                  return 0;
              }
              throw new RuntimeException("输入的数据类型不一致");
          }
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public double getPrice() {
              return price;
          }
      
          public void setPrice(double price) {
              this.price = price;
          }
      
          public Goods(String name, double price) {
              this.name = name;
              this.price = price;
          }
      
          @Override
          public String toString() {
              return "Goods{" +
                      "name='" + name + '\'' +
                      ", price=" + price +
                      '}';
          }
      }
      
      public class ComparableTest{
      	public static void main(String[] args) {
      		Goods[] all = new Goods[4];
      		all[0] = new Goods("《红楼梦》", 100);
      		all[1] = new Goods("《西游记》", 80);
      		all[2] = new Goods("《三国演义》", 140);
      		all[3] = new Goods("《水浒传》", 120);
      		Arrays.sort(all);
      		System.out.println(Arrays.toString(all));
      	}
      }
      

      4.2、方式二:定制排序:java.util.Comparator

      当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排序的比较。

      重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。

      可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。

      还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。

          Goods[] all = new Goods[4];
          all[0] = new Goods("War and Peace", 100);
          all[1] = new Goods("Childhood", 80);
          all[2] = new Goods("Scarlet and Black", 140);
          all[3] = new Goods("Notre Dame de Paris", 120);
      	Arrays.sort(all, new Comparator() {
              @Override
              public int compare(Object o1, Object o2) {
                  Goods g1 = (Goods) o1;
                  Goods g2 = (Goods) o2;
                  return g1.getName().compareTo(g2.getName());
              }
          });
      	System.out.println(Arrays.toString(all));
      

      5、System类

      System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。该类位于java.lang包。
      由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。
      成员变量

      • System类内部包含in、out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。

      成员方法
      native long currentTimeMillis():
      该方法的作用是返回当前的计算机时间,时间的表达格式为当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
      void exit(int status):
      该方法的作用是退出程序。其中status的值为0代表正常退出,非零代表异常退出。使用该方法可以在图形界面编程中实现程序的退出功能等。
      void gc():
      该方法的作用是请求系统进行垃圾回收。至于系统是否立刻回收,则取决于系统中垃圾回收算法的实现以及系统执行时的情况。
      String getProperty(String key):
      该方法的作用是获得系统中属性名为key的属性对应的值。系统中常见的属性名以及属性的作用如下表所示:
      Java常用类

      String javaVersion = System.getProperty("java.version");
      System.out.println("java的version:" + javaVersion);
      String javaHome = System.getProperty("java.home");
      System.out.println("java的home:" + javaHome);
      String osName = System.getProperty("os.name");
      System.out.println("os的name:" + osName);
      String osVersion = System.getProperty("os.version");
      System.out.println("os的version:" + osVersion);
      String userName = System.getProperty("user.name");
      System.out.println("user的name:" + userName);
      String userHome = System.getProperty("user.home");
      System.out.println("user的home:" + userHome);
      String userDir = System.getProperty("user.dir");
      System.out.println("user的dir:" + userDir);
      
      

      6、 Math类

      java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为double型。

      abs 绝对值
      acos,asin,atan,cos,sin,tan 三角函数
      sqrt 平方根
      pow(double a,doble b) a的b次幂
      log 自然对数
      exp e为底指数
      max(double a,double b)
      min(double a,double b)
      random() 返回0.0到1.0的随机数
      long round(double a) double型数据a转换为long型(四舍五入)
      toDegrees(double angrad) 弧度—>角度
      toRadians(double angdeg) 角度—>弧度

      7、 BigInteger与BigDecimal

      Integer类作为int的包装类,能存储的最大整型值为2^31-1,Long类也是有限的,
      最大为2^63-1。如果要表示再大的整数,不管是基本数据类型还是他们的包装类
      都无能为力,更不用说进行运算了。

      java.math包的BigInteger可以表示不可变的任意精度的整数。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、位操作以及一些其他操作。

      构造器

      • BigInteger(String val):根据字符串构建BigInteger对象

      常用方法

      public BigInteger abs():返回此 BigInteger 的绝对值的 BigInteger。
       BigInteger add(BigInteger val) :返回其值为 (this + val) 的 BigInteger
       BigInteger subtract(BigInteger val) :返回其值为 (this - val) 的 BigInteger
       BigInteger multiply(BigInteger val) :返回其值为 (this * val) 的 BigInteger
       BigInteger divide(BigInteger val) :返回其值为 (this / val) 的 BigInteger。整数相除只保留整数部分。
      BigInteger remainder(BigInteger val) :返回其值为 (this % val) 的 BigInteger。
       BigInteger[] divideAndRemainder(BigInteger val):返回包含 (this / val) 后跟(this % val) 的两个 BigInteger 的数组。
      **BigInteger pow(int exponent) :返回其值为 (thisexponent) 的 BigInteger。
      

      一般的Float类和Double类可以用来做科学计算或工程计算,但在商业计算中,要求数字精度比较高,故用到java.math.BigDecimal类。
      BigDecimal类支持不可变的、任意精度的有符号十进制定点数。

      构造器

      public BigDecimal(double val)
      public BigDecimal(String val)
      

      常用方法

       public BigDecimal add(BigDecimal augend)
      public BigDecimal subtract(BigDecimal subtrahend)
       public BigDecimal multiply(BigDecimal multiplicand)
       public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
      
      public void testBigInteger() {
      	BigInteger bi = new BigInteger("12433241123");
      	BigDecimal bd = new BigDecimal("12435.351");
      	BigDecimal bd2 = new BigDecimal("11");
      	System.out.println(bi);
      	// System.out.println(bd.divide(bd2));
      	System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP));
      	System.out.println(bd.divide(bd2, 15, BigDecimal.ROUND_HALF_UP));
      }
      
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/qq_44732146/article/details/120324512,作者:胡八一,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:面向对象编程(下)

      下一篇:JavaScript基础(上)

      相关文章

      2025-05-19 09:04:14

      C语言字符函数和字符串函数--(超全超详细)

      C语言字符函数和字符串函数--(超全超详细)

      2025-05-19 09:04:14
      函数 , 字符 , 字符串
      2025-05-14 10:33:31

      计算机小白的成长历程——习题演练(函数篇)

      计算机小白的成长历程——习题演练(函数篇)

      2025-05-14 10:33:31
      函数 , 字符串 , 数组 , 知识点 , 编写 , 迭代 , 递归
      2025-05-14 10:33:16

      30天拿下Rust之切片

      在Rust中,切片是一种非常重要的引用类型。它允许你安全地引用一段连续内存中的数据,而不需要拥有这些数据的所有权。切片不包含分配的内存空间,它仅仅是一个指向数据开始位置和长度的数据结构。

      2025-05-14 10:33:16
      amp , end , 切片 , 字符串 , 引用 , 索引 , 迭代
      2025-05-14 10:33:16

      30天拿下Python之使用Json

      Json的英文全称为JavaScript Object Notation,中文为JavaScript对象表示法,是一种存储和交换文本信息的语法,类似XML。Json作为轻量级的文本数据交换格式,比XML更小、更快,更易解析,也更易于阅读和编写。

      2025-05-14 10:33:16
      json , Json , Python , 字符串 , 对象 , 序列化 , 转换
      2025-05-14 10:33:16

      30天拿下Rust之字符串

      在Rust中,字符串是一种非常重要的数据类型,用于处理文本数据。Rust的字符串是以UTF-8编码的字节序列,主要有两种类型:&str和String。其中,&str是一个对字符数据的不可变引用,更像是对现有字符串数据的“视图”,而String则是一个独立、可变更的字符串实体。

      2025-05-14 10:33:16
      amp , Rust , str , String , 使用 , 字符串 , 方法
      2025-05-14 10:03:13

      超级好用的C++实用库之Base64编解码

      Base64是一种编码方式,用于将二进制数据转换为可打印的ASCII字符。这种编码方式常用于在HTTP协议等应用中传输二进制数据,比如:图片、音频、视频等。

      2025-05-14 10:03:13
      Base64 , 字符串 , 数据 , 编码 , 长度
      2025-05-14 10:02:58

      java项目多端数据同步解决方案

      多端数据同步是指在多个设备(例如桌面应用、移动应用、Web应用)之间保持数据的一致性。

      2025-05-14 10:02:58
      java , Spring , WebSocket , 同步 , 数据 , 版本号
      2025-05-14 10:02:58

      java休眠到指定时间怎么写

      java休眠到指定时间怎么写

      2025-05-14 10:02:58
      java , sleep , Thread , util , 方法
      2025-05-14 09:51:15

      java String 去掉特殊字符之前的内容

      为了去除字符串中某个特殊字符之前(包括该特殊字符本身)的所有内容,我们可以使用Java中的String类的substring和indexOf方法。

      2025-05-14 09:51:15
      字符 , 字符串 , 正则表达式 , 示例
      2025-05-13 09:53:23

      java中判断String类型为空和null的方法

      在Java中,判断一个String类型的变量是否为空(即长度为0)或者为null,通常需要使用两个条件语句来进行检查。这是因为null表示变量没有引用任何对象,而空字符串("")表示变量引用了一个没有内容的字符串对象。

      2025-05-13 09:53:23
      null , String , 为空 , 字符串 , 方法 , 示例 , 默认值
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5224089

      查看更多

      最新文章

      C语言字符函数和字符串函数--(超全超详细)

      2025-05-19 09:04:14

      30天拿下Python之使用Json

      2025-05-14 10:33:16

      超级好用的C++实用库之Base64编解码

      2025-05-14 10:03:13

      java项目多端数据同步解决方案

      2025-05-14 10:02:58

      统计特殊字母的数量Ⅱ。用go语言,给定一个字符串 word,统计其中存在特殊字母的数量。特殊字母指的是同时出现某个字母 c 的小写形式和大写形式,且每个小写形式的 c 都出现在第

      2025-05-13 09:50:17

      Java学习(动态代理的思想详细分析与案例准备)(1)

      2025-05-13 09:49:12

      查看更多

      热门文章

      JAVA__接口的作用

      2023-04-18 14:14:13

      Java学习之算术运算符两只老虎

      2023-04-19 09:23:13

      排序算法Java版-归并排序算法

      2023-04-24 11:25:19

      Python高级变量类型

      2024-09-24 06:30:08

      mysql列存储引擎-字符串属性列-列压缩测试

      2023-04-23 09:34:23

      JAVA多线程学习笔记

      2023-05-11 06:05:48

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      免费的图片识别接口,百度ocr的SDK使用java版

      开始使用流

      一天十道Java面试题----第五天(spring的事务传播机制------>mybatis的优缺点)

      Java、SpringBoot中配置接口文档,knife4j、swagger

      C# split字符串 根据1个或多个空格

      Java Volatile Keyword

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号