Java常用类及使用方法

news2024/11/17 7:48:39

目录

1.String

1.String的基本概念

2.String的不可变性

3.String的实例化方式及内存解析

1.两种方式

2.new+构造器的方式的内存解析

3.字符串对象的存储

4.字符串拼接后的内存解析

6.String中的常用方法

7.什么时候indexOf (str)和LastIndexOf (str)返回值相同

8.String和其他结构之间的转换

1.与包装类,基本数据类型转换

2.与char[ ]转换

3.与byte[ ]转换

9.String,StringBuffer,StringBuilder的异同

相同点

不同点

10.StringBuffer的常用方法

11.String,StringBuffer,StringBuilder的相互转换

1.String转换为StringBuffer,StringBuilder

2.StringBuffer,StringBuilder转换为String

2.日期类

1.jdk8之前的日期和时间API

1.system.currentTimeMills()

2.Date类的使用

3.SimpleDateFormat的使用

2.jdk8中日期时间API

3.Calender类的使用:抽象类

1.实例化

2.常用方法

4.instant

5.DateTimeFormatter的使用

6.编码、解码、格式化、解析

3.java比较器

1.对多个对象排序

2.Comparable接口的使用:自然排序(默认)

3.Comparator:定制排序

4.Comparable接口和Comparator对比


1.String类

1.String的基本概念

        1.String是声明为final的,不可被继承

        2.String实现了Serializable接口:表示字符串是支持序列化

        3.实现了Comparable接口:表示String可以比较大小

        4.String内部定义:final char[] value;用于存储字符串数据

        5.String:代表不可变的字符序列,简称:不可变性

        6.通过字面量(区别于new)的方式给一个字符串赋值,此时字符串值声明在字符串常量池中

        7.字符串常量池中不会存储相同内容的字符串的。

2.String的不可变性

1.当对字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value进行赋值

2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值

3.当调用String的replace方法修改字符或字符串时,也必须重新指定内存区域赋值

3.String的实例化方式及内存解析

1.两种方式

方式一:通过字面量定义的方式

方式二:通过new+构造器的方式

2.new+构造器的方式的内存解析

使用如下代码创建对象,在内存中创建了两个对象;在堆中的new结构,另一个是char[]对应的常量池中的数据abc

String s = new String(“abc”)

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

如上代码所示,String通过字面量定义的变量位于字符串常量池中,通过new+构造器会在内存中创建两个对象:堆中的new,char[]对应的常量池数据。用以下的宋老师的图例看会更加清楚:

 

4.字符串拼接后的内存解析

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(s3 == s6);//false
System.out.println(s4 == s5);//true

        1.常量与常量的拼接在常量池中;

        2.但只要其中一个为变量,结果就在堆中;

        3.若使用intern()方法,则返回值在常量池中;

6.String中的常用方法

1.length(),字符串长度

2.charAt(),返回某索引出的字符

3.isEmpty,是否是空的

4.toLowerCase(),转换为小写

5.toUpperCase(),转换为大写

6.trim(),忽略字符串头部或尾部的空格

7.equalIgnoreCase (),忽略大小写比较

8.concat (),相当于+

9.compareTo (),比较两个字符串大小,负数就是当前数小,涉及到字符串排序

10.substring (),返回一个新字符串,从输入索引开始截取,若输入两个索引,那就是左闭右开的区间

11.endWith (),是否以指定后缀结束

12.startWith (),是否以指定后缀开始,区分大小写,返回布尔类型

13.contains(),当前字符串是否包含形参字符串

14.indexOf(),找到形参出现的第一个索引

15.LastIndexOf (),从后往前找形参出现的第一个索引;找不到就返回默认初始化值减一:-1

16.replace (),将所有旧字符串转换为新字符串

17.match (),确定此字符串是否匹配给定的正则表达式

18.split (),根据正则表达式拆分字符串

7.什么时候indexOf (str)和LastIndexOf (str)返回值相同

答:存在唯一的str或者不存在该str

8.String和其他结构之间的转换

1.与包装类,基本数据类型转换

String转换为包装类:Integer.parseInt(str);

包装类转换为String:String.valueOf(i1)

Integer i1 = 123;
String s1 = "123";
Integer i2 = Integer.parseInt(s1);
String s2 = String.valueOf(i1);

2.与char[ ]转换

String转换为char[ ]:调用toCharArray()

char[ ]转换为String:用String构造器,把char[ ]放进去

char[] char1 = new char[]{'a','b','c'};
String s1 = "abc";
char[] char2 = s1.toCharArray();
String s2 = new String(char1);

3.与byte[ ]转换

String转换为byte[ ](编码):调用String的getBytes()方法

byte[ ]转换为String(解码):调用String构造器

byte[] byte1 = new byte[]{1,2,3};
String s1 = "123";
byte[] byte2 = s1.getBytes();
String s2 = new String(byte1);

若:byte转换为字符串会出现乱码,是因为编码集与解码集不一致

其中,编码就是将字符串转换为计算机底层的二进制字节;解码就是将字节转换为字符串

9.String,StringBuffer,StringBuilder的异同

相同点

        底层都使用char[ ]存储

不同点

        String:不可变的字符序列

        StringBuffer:可变的字符序列;线程安全的,效率低

        StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高

        效率对比:StringBuilder>StringBuffer>>String

10.StringBuffer的常用方法

1.增:append(),添加字符

2.删:delete (),删除指定位置内容

3.改:replace (),替换指定位置str

4.插:insert (),在指定位置插入xxx

5.反:reverse (),将字符序列反转

          setCharAt (),修改一个字符

6.查:charAt (),查询指定索引字符

7.遍历:toString ()

11.String,StringBuffer,StringBuilder的相互转换

1.String转换为StringBuffer,StringBuilder

        调用StringBuffer,StringBuilder构造器

2.StringBuffer,StringBuilder转换为String

        调用String构造器

2.日期类

1.jdk8之前的日期和时间API

1.system.currentTimeMills()

        返回一个毫秒的时间差,通常称为时间戳,同1970.1.1.0:0:0对比

long timeMillis = System.currentTimeMillis();

2.Date类的使用

1.两个包

        Java.until.Date

        Java.sql.Date:对应数据库中的日期类型

2.两个构造器

        无参构造器Date():创建一个当前时间Date

        Date(时间戳):创建指定毫秒数的Date

3.两个方法

        toString();返回当前年月日时分秒

        getTime():获取当前Date对象的毫秒数

4.util下的date和sql下date转换

        将util下date.getTime()放入sql下date构造器即可

代码示例:

//关于日期的API---> Date()方法;
//两种:java.util.Date/java.sql.Date
//每一种都有两个构造器
//两种方法:toString():返回当前日期的时分秒;getTime():获取当前对象的毫秒值 
@Test
    public void test(){
        //1.Java.util.Date方法
        Date date = new Date();
        //获取当前日期的时分秒
        System.out.println(date.toString());
        //获取当前日期的毫秒数
        System.out.println(date.getTime());

        System.out.println("------------------------------------");
        Date date1 = new Date(1234325214214l);
        java.sql.Date date7 = new java.sql.Date(date1.getTime());
        System.out.println(date7);
        System.out.println(date1.toString());
        System.out.println(date1.getTime());

        System.out.println("-------------------------------------");
        //2.java.sql.Date方法
        java.sql.Date date2 = new java.sql.Date(System.currentTimeMillis());
//        java.sql.Date date3 = new java.sql.Date();
        String s = date2.toString();
        System.out.println(s);
        long time = date2.getTime();
        System.out.println(time);

        System.out.println("---------------------------------------");
        //3.二者之间的转换:靠java.util.Date的有参构造器,形参为毫秒值
        Date date3 = new Date(date2.getTime());
        System.out.println(date3);
        java.sql.Date date4 = new java.sql.Date(date3.getTime());
        System.out.println(date4);

    }

 

3.SimpleDateFormat的使用

1.作用

        对日期Date类的格式化和解析

2.格式化与解析

格式化:format()方法:将Date对象格式化为字符串

解析:parse()方法:将字符串解析为Date对象

SimpleDateFormat s = new SimpleDateFormat();
Date date = new Date();
//格式化:转化为字符串
String s1 = s.format(date);
System.out.println(s1);
//解析:转化为Date
Date date1 = s.parse(s1);
System.out.println(date1);

3.SimpleDateFormat的实例化

1.使用无参构造器造对象,使用format()方法将Date对象转换为字符串;使用pasre方法将字符串转换为日期

2.使用固定格式的有参构造器(常用)


 public void test1() throws ParseException {
        //第一种方式实例化
        SimpleDateFormat s = new SimpleDateFormat();
        Date date = new Date();
        System.out.println(date);
        //格式化:转化为字符串
        String s1 = s.format(date);
        System.out.println(s1);
        //解析:转化为Date
        Date date1 = s.parse(s1);
        System.out.println(date1);
        
        System.out.println("-------------------------------------------------------");
        //2.第二种方式实例化(更常用)
        SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Date date2 = new Date();
        System.out.println(date2);
        String s2 = ss.format(date2);
        System.out.println(s2);
        Date date3 = ss.parse(s2);
        System.out.println(date3);
    }

3.解析时,字符串必须满足SimpleDateFormat格式,构造器形参格式,否则异常。

2.jdk8中日期时间API

1.获取当前日期

LocalDate、LocalTime、LocalDateTime

实例化:LocalTime.now()方法

2.设置指定的年月日时分秒

LocalTime.of()方法

3.获取年月日,getXxx()

4.不可变性:设置年月日,withDayofMonth

5.添加:plusMonths()

6.减:minusDay();

        //1.获取当前日期
        LocalDate l = LocalDate.now();
        System.out.println(l);
        LocalTime l1 = LocalTime.now();
        System.out.println(l1);
        LocalDateTime l2 = LocalDateTime.now();
        System.out.println(l2);

        //2.设置指定的日期
        LocalTime l3 = LocalTime.of(5, 8);
        System.out.println(l3);

        //3.获取年月日
        int dayOfMonth = l.getDayOfMonth();
        System.out.println(dayOfMonth);

        //4.不可变性
        LocalDate localDate = l.withDayOfMonth(2);
        System.out.println(dayOfMonth);
        System.out.println(localDate.getDayOfMonth());

        //5.添加
        LocalDate l5 = l.plusDays(5);
        System.out.println(l);//不可变性
        System.out.println(l5);//24

        //6.减
        LocalDate localDate1 = l.minusDays(5);
        System.out.println(l);
        System.out.println(localDate1);//14

3.Calender类的使用:抽象类

1.实例化

        Calender类是一个抽象类,无法实例化,通常使用Calendar.getInstance()方法来造对象。

2.常用方法

get():get(Calendar.DAY_OF_MONTH)

set():set(Calendar.DAY_OF_MONTH,22)

add():add(Calendar.DAY_OF_MONTH,3)

getTime():getTime();日历类转为Date对象

setTime():setTime();Date对象转为日历类

代码示例:

        //使用Calendar.getInstance方法创建Calendar对象
        Calendar c = Calendar.getInstance();
        Date date1 = c.getTime();
        System.out.println(date1);
        //Calendar的常用方法get():获取当前日期的信息
        int s1 = c.get(Calendar.DAY_OF_MONTH);
        System.out.println(s1);
        int s2 = c.get(Calendar.DAY_OF_WEEK);
        System.out.println(s2);
        int s3 = c.get(Calendar.DAY_OF_YEAR);
        System.out.println(s3);
        int s4 = c.get(Calendar.HOUR_OF_DAY);
        System.out.println(s4);


        //Calendar的常用方法set():设置当前日期信息
        //注意:此时set()方法为一个void方法,因此直接将Calendar对象本身改了
        c.set(Calendar.DAY_OF_MONTH,2);

        int i = c.get(Calendar.DAY_OF_MONTH);
        System.out.println(i);

        //add()
        c.add(Calendar.DAY_OF_MONTH,4);
        int i1 = c.get(Calendar.DAY_OF_MONTH);
        System.out.println(i1);

        //getTime():将Calendar对象-->Date对象
        Date time = c.getTime();
        System.out.println(time);

        //setTime():将Date对象-->日历类对象
        Date date = new Date();
        c.setTime(date);
        int i3 = c.get(Calendar.DAY_OF_MONTH);
        System.out.println(i3);

4.instant

1.instant.now()方法:按照格林威治时间算的,会少八小时

2.添加时间偏移量:atOffset();

3.获取相应的毫秒数:instant.toEpochMilli

4.有参构造器:Instant.ofEpochMilli()

    @Test
    public void test1(){
        Instant i1 = Instant.now();
        System.out.println(i1);

        OffsetDateTime i2 = i1.atOffset(ZoneOffset.ofHours(8));
        System.out.println(i2);

        //获取相应instant对象的毫秒数
        long l = i1.toEpochMilli();
        System.out.println(l);

        //有参构造器(同之前一样,都是将毫秒数放入,转换为日期)
        Instant i3 = Instant.ofEpochMilli(l);
        System.out.println(i3);
    }

5.DateTimeFormatter的使用

1.自定义格式:DateTimeFormatter.ofPattern()

    @Test
    public void test(){
        DateTimeFormatter d = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDateTime l = LocalDateTime.now();
        System.out.println(l);
        //格式化:LocalDate --> 字符串
        String s = d.format(l);
        System.out.println(s);

        //解析:
        TemporalAccessor parse = d.parse(s);
        TemporalAccessor parse1 = d.parse("2023-02-19");
        System.out.println(parse);
        System.out.println(parse1);
    }

6.编码、解码、格式化、解析

编码:字符串>字节

解码: 字节 >字符串

格式化:日期 >字符串                                                                                                    

解析:字符串 >日期

3.java比较器

1.对多个对象排序

java中的对象正常情况下只能使用:==,!=,但在开发中,我们需要对多个对象进行排序,就需要比较对象的大小。因此需要使用两种接口中的任何一个:comparable;comparator

2.Comparable接口的使用:自然排序(默认)

1.调用Arrays.sort(),Arrays.toString()即可

    //第一种方式:comparable--自然排序;按照默认从大到小进行比较 
    @Test
    public void test1(){
        String[] arr = new String[]{"AA","CC","DD","BB"};
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    }

2.像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方法。

3.String、包装类排列都是从小到大排。

4.重写compareTo(obj)规则:大于-正整数,小于-负整数,等于-0。

    @Override
    public int compareTo(Object o) {
        if (o instanceof Person){
            Person p1 = (Person) o;
            if (this.getAge() > p1.getAge()){
                return 1;
            }else if (this.getAge() < p1.getAge()){
                return -1;
            }else{
                return -this.getName().compareTo(p1.getName());
            }
        }else{
            throw new RuntimeException("您输入的类型不一致!");
        }
    }

5.对于自定义类,如果要进行排序,可以让自定义类实现Comparable接口,重写compareTo(obj)方法,指明如何排序。

3.Comparator:定制排序

匿名实现Comparator方法即可

    //第二种方式:comparator--定制排序
    @Test
    public void test2(){
        String[] arr = new String[]{"AA","CC","DD","BB"};
        Arrays.sort(arr, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return -o1.compareTo(o2);
            }
        }
        );
        System.out.println(Arrays.toString(arr));
    }

4.Comparable接口和Comparator对比

Comparable接口方式一旦制定,保证Comparable接口实现类的对象在任何位置都能够比较大小,Comparator接口属于临时性的比较

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

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

相关文章

用gpt定制一个pytest接口测试框(附源码)

目的&#xff1a; 描述我的需求和目标让gpt给我写一个测试接口框架 并且让他自己完善。 我说:帮我写一个基于python语言的 pytest的接口测试框架 支持post get put delete请求 添加详细的断言&#xff0c;处理身份验证和授权&#xff0c;处理HTTP错误 加上allure2报告和有请求…

代码随想录第51天

1.最佳买卖股票时机含冷冻期 淦&#xff0c;自己写&#xff0c;用3个状态死活写不出来。 动规五部曲&#xff0c;分析如下&#xff1a; 确定dp数组以及下标的含义 dp[i][j]&#xff0c;第i天状态为j&#xff0c;所剩的最多现金为dp[i][j]。 其实本题很多同学搞的比较懵&…

SecurityAccess(0x27)服务

SecurityAccess&#xff08;0x27&#xff09;服务 此服务的目的是提供访问数据和/或诊断服务的手段&#xff0c;这些服务因安全&#xff0c;排放或安全原因而受到限制。 用于将 例程或数据下载/上传到服务器和从服务器读取特定存储器位置的诊断服务是可能需要安全访问的情况。…

使用Inkscape绘制矢量电路图

GNU Inkscape是一个免费的开源矢量图形编辑器&#xff0c;非常适合画论文中的矢量插图。 Inkscape Inkscape支持win mac linux全平台&#xff08;下载&#xff09;&#xff0c;windows端还发布了uwp版本&#xff0c;可在Windows store安装。 基本操作&#xff1a; inkscape工…

2023年前端面试题汇总-性能优化

1. CDN 1.1. CDN的概念 CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是指一种通过互联网互相连接的电脑网络系统&#xff0c;利用最靠近每位用户的服务器&#xff0c;更快、更可靠地将音乐、图片、视频、应用程序及其他文件发送给用户&…

简谈软件版本周期 | Alpha、Beta、RC、Stable版本之间的区别

目录 &#x1f48c; 引言 ⭕ 软件版本周期 &#x1f6e0;️ 软件开发期 ⚖️ 软件完成期 &#x1f4b0; 商业软件版本 &#x1f48c; 引言 定义好版本号&#xff0c;对于产品的版本发布与持续更新很重要&#xff1b;但是对于版本怎么定义&#xff0c;规则如何确定&#x…

【微服务架构】无法在Sentinel Dashboard查看到服务的监控信息原因

&#xff08;目前项目中使用的Hystrix&#xff0c;而Hystrix已经不维护了&#xff0c;至今仍然是2018年发布的1.5.8版本。&#xff09; 开始学习一下新的服务治理框架Sentinel Sentinel官网介绍 在集成Sentinel案例中碰到的问题 微服务&#xff0c;无法在sentinel dashboard…

Oracle中的数据导出(3)

假如我现在不想再打开DOS界面输入命令导出数据&#xff0c;那又有什么简单便捷的方法实现呢&#xff1f; 我将在本篇描述一种自动化的操作方法&#xff0c;简单讲就是&#xff1a;我把需要查询的数据脚本放在桌面的一个mini&#xff0c;通过双击快捷图标直接实现数据结果导出到…

VMware ESXI7.0.3的安装

文章目录 一、VMware ESXI7.0版本的安装与配置1.1、VMware概述。1.2、VMware 解析&#xff1a;1.3、VMware ESXI解析&#xff1a;2.1、准备资料2.2.1、VMware ESXI的ISO下载 3.1、安装ESXI4.1、浏览器键入esxi上述ipv4地址&#xff1a;192.168.229.171 一、VMware ESXI7.0版本的…

VMware ESXi 8.0b Unlocker OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (集成驱动版)

VMware ESXi 8.0b Unlocker & OEM BIOS 集成 REALTEK 网卡驱动和 NVMe 驱动 (集成驱动版) 发布 ESXi 8.0 集成驱动版&#xff0c;在个人电脑上运行企业级工作负载 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-8-sysin/&#xff0c;查看最新版。原创作…

C语言——分段函数求值

一、题目描述 二、题目分析 本题是简单的分段函数的求解&#xff0c;应学会合理的运用for\if\swich函数解答问题。 三、代码实现 //for语句解题#include <stdio.h> int main() {int x,y;scanf("%d",&x);if(x<1){yx;}else if(1<x && x<…

FL Studio软件最新21中文版本安装包下载

FL Studio21集合最新FL基础操作、编曲技巧、混音技巧、乐理基础、声乐演奏等各类内容&#xff0c;编曲软件FL Studio 简称FL&#xff0c;全称&#xff1a;Fruity Loops Studio&#xff0c;因此国人习惯叫它"水果"。目前版本是FL Studio20&#xff0c;它让你的计算机就…

章节1:远程代码执行渗透与防御

章节1&#xff1a;远程代码执行渗透与防御 01 什么是远程代码执行&#xff1f; 远程代码执行&#xff08;RCE漏洞&#xff09; 远程代码执行&#xff1a;Remote Code Execute 远程命令执行&#xff08;命令注入漏洞&#xff09;&#xff1a;Remote Command Execute 定义&a…

高速PCB Layout设计要用哪些工具?

随着时代高速发展&#xff0c;高速PCB项目逐渐成为主流项目之一&#xff0c;越来越多的电子工程师需要掌握高速PCB Layout设计能力&#xff0c;同时电子工程师在进行高速PCB Layout时需要用到多种工具&#xff0c;下面来看看有哪些工具和软件&#xff1f; 1、设计软件 ①Altiu…

Redis的常用数据结构之列表类型

列表类型的数据特点 用于存储多个有序的字符串单个列表最多可以存储2的32次方-1个元素&#xff08;4294967295&#xff09;。列表的元素是可以重复的可以分别对列表的两端做插入&#xff08;push&#xff09;和弹出&#xff08;pop&#xff09;操作 List相关的操作命令 向右…

Vue3(二):Vue3生命周期、自定义hook、其他API、Suspense等组件

Vue3&#xff1a;第二章 一、Vue3生命周期二、自定义hook函数三、toRef四、其他Composition API1.shallowRef与shallowReactive2.readonly与shallowReadonly3.toRaw 与 markRaw&#xff0c;customRef4.provide和inject5.响应式数据的判断 五、组合式API的优势1.选项式API的问题…

股票买卖篇(II,III,IV)--基础,详细!状态机简单应用

目录 股票买卖II 本题思路 关于异常值的解释 代码 股票买卖III 本题思路 (包括对交易过程的理解&#xff0c;需认真理解) 代码 股票买卖 IV 本题思路 代码 股票买卖II 输入样例 6 7 1 5 3 6 4 输出样例 7 输入样例 5 1 2 3 4 5 输出样例 4 本题思路 该题是最…

1. Mysql InnoDB中的索引

一、InnoDB中的索引 InnoDB存储引擎支持以下几种常见的索引&#xff1a;B树索引、全文索引、哈希索引&#xff0c;其中比较关键的是B树索引。 1. B树索引介绍 InnoDB中的索引自然也是按照B树来组织的&#xff0c;前面我们说过B树的叶子节点是用来放数据的。但是放什么数据呢…

攻防世界-基础android

下载链接&#xff1a;下载 参考链接&#xff1a;攻防世界-Mobile-基础android (Misc经验解法&#xff09;_攻防世界基础android_Q_yt的博客-CSDN博客 方法一&#xff1a; 这是个偏向Misc的解题思路&#xff0c;下载完是个apk文件&#xff0c;载入010 Editor看一下&#xff0…

京东工作8年,肝到T8就剩这份心得了,已助朋友拿到10个Offer

在京东工作了8年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你维护与大促相关的系统的时候&#xff0c;熬到T7也费了不少心思&#xff0c;小编也是个爱学习的人&#xff0c;把这几年的工作经验整理成了一份完整的笔记…