Java高级应用——常用类(String类)和(Comparator排序)

文章目录

    • 常用类(String类)和(Comparator排序)
      • String类
        • 介绍
        • 用法以及常用API
        • StringBuffer和StringBuilder
      • 比较器(Comparator)

常用类(String类)和(Comparator排序)

String类

介绍

String类型本身是使用final关键字声明的,这意味着我们无法继承String类。

String对象的字符内容存储在一个字符数组value[]中。例如,"abc" 等效于 char[] data={'h','e','l','l','o'}。需要注意的是,由于私有访问修饰符的限制,外部无法直接获取字符数组,并且String类没有提供获取和设置value数组的方法。

由于final关键字的存在,字符数组的引用不可改变,同时String类也没有提供方法来修改value数组中的某个元素值。这意味着String代表着不可变的字符序列。换句话说,一旦对字符串进行修改,就会生成一个新的对象。

用法以及常用API
  1. 创建字符串对象:
    • 使用字面量创建:String str = "Hello";
    • 使用构造函数创建:String str = new String("Hello");
  2. 字符串长度:
    • int length(): 返回字符串的字符个数。
  3. 字符串比较:
    • boolean equals(Object obj): 比较字符串与指定对象是否相等。
    • boolean equalsIgnoreCase(String anotherString): 忽略大小写比较字符串是否相等。
    • int compareTo(String anotherString): 按字典顺序比较字符串。
    • int compareToIgnoreCase(String str): 忽略大小写按字典顺序比较字符串。
  4. 字符串连接:
    • String concat(String str): 将指定字符串连接到原字符串的末尾。
  5. 字符串提取:
    • char charAt(int index): 返回字符串中指定位置的字符。
    • String substring(int beginIndex): 返回从指定索引开始到字符串末尾的子字符串。
    • String substring(int beginIndex, int endIndex): 返回从指定索引开始到指定索引结束的子字符串。
  6. 字符串搜索:
    • boolean contains(CharSequence sequence): 判断字符串是否包含指定的字符序列。
    • int indexOf(int ch): 返回指定字符在字符串中第一次出现的位置。
    • int indexOf(String str): 返回指定字符串在字符串中第一次出现的位置。
    • int lastIndexOf(int ch): 返回指定字符在字符串中最后一次出现的位置。
    • int lastIndexOf(String str): 返回指定字符串在字符串中最后一次出现的位置。
  7. 字符串替换:
    • String replace(char oldChar, char newChar): 将字符串中的指定字符替换为新字符。
    • String replace(CharSequence target, CharSequence replacement): 将字符串中的指定字符序列替换为新的字符序列。
  8. 字符串分割:
    • String[] split(String regex): 根据指定的正则表达式将字符串拆分为子字符串数组。
  9. 字符串转换:
    • char[] toCharArray(): 将字符串转换为字符数组。
    • String toLowerCase(): 将字符串转换为小写形式。
    • String toUpperCase(): 将字符串转换为大写形式。
    • String trim(): 去除字符串两端的空格。
  10. 字符串格式化:
    • static String format(String format, Object... args): 使用指定的格式字符串和参数创建格式化字符串。
  11. 字符串检查:
    • boolean isEmpty(): 判断字符串是否为空(长度为0)。
    • boolean startsWith(String prefix): 判断字符串是否以指定前缀开头。
    • boolean endsWith(String suffix): 判断字符串是否以指定后缀结尾。
  12. 字符串拼接:
    • static String join(CharSequence delimiter, CharSequence... elements): 使用指定的分隔符将多个字符序列连接为一个字符串。
StringBuffer和StringBuilder

StringBuffer和StringBuilder是Java中用于处理可变字符串的类,它们提供了一系列方法来进行字符串的增删改操作。

  1. StringBuffer和StringBuilder的相同点:
    • 两者都是可变的字符串类,用于处理需要频繁修改的字符串。
    • 它们都位于java.lang包中。
  2. StringBuffer和StringBuilder的区别:
    • StringBuffer是线程安全的,适用于多线程环境下的字符串操作,而StringBuilder没有实现线程安全,适用于单线程环境下的字符串操作。
    • StringBuffer的方法使用了synchronized关键字进行同步,保证了线程安全,但在性能上略低于StringBuilder。
    • StringBuilder的方法没有进行同步,因此在单线程环境下性能更高。
  3. 创建字符串缓冲区对象:
    • 使用构造函数创建:StringBuffer sb = new StringBuffer();StringBuilder sb = new StringBuilder();
    • 可以指定初始容量:StringBuffer sb = new StringBuffer(int capacity);StringBuilder sb = new StringBuilder(int capacity);
  4. 字符串追加:
    • append(参数): 将参数追加到字符串缓冲区的末尾。
  5. 字符串插入:
    • insert(int offset, 参数): 在指定位置插入参数值到字符串缓冲区。
  6. 字符串删除:
    • delete(int start, int end): 删除指定范围内的字符。
    • deleteCharAt(int index): 删除指定位置的字符。
  7. 字符串替换:
    • replace(int start, int end, String str): 用指定字符串替换指定范围内的字符。
  8. 字符串反转:
    • reverse(): 反转字符串缓冲区中的字符顺序。
  9. 获取字符串长度:
    • length(): 返回字符串缓冲区的长度(字符个数)。
  10. 获取字符串容量:
    • capacity(): 返回字符串缓冲区的当前容量。
  11. 设置字符串缓冲区容量:
    • ensureCapacity(int minimumCapacity): 设置字符串缓冲区的最小容量。
  12. 转换为字符串:
    • toString(): 将字符串缓冲区对象转换为String类型。

比较器(Comparator)

在Java中,比较器(Comparator)是一种用于定义对象之间顺序关系的接口。它提供了一种机制,允许开发人员根据自定义的规则对对象进行排序。Java中的比较器通常用于集合(如列表、树、堆等)的排序操作,以及实现自定义的排序算法。

比较器接口(Comparator Interface)定义了以下方法:

  1. int compare(T obj1, T obj2): 这是比较器最重要的方法,用于比较两个对象的顺序。它接受两个参数obj1和obj2,表示要比较的对象,返回一个整数值用于表示两个对象的相对顺序关系。具体规则如下:

    • 返回负整数:如果obj1小于obj2。
    • 返回零:如果obj1等于obj2。
    • 返回正整数:如果obj1大于obj2。
  2. boolean equals(Object obj):比较器还可以重写equals()方法,用于判断两个比较器是否相等。

在Java中,比较器可以通过两种方式来使用:

  1. 实现Comparator接口:开发人员可以创建一个实现Comparator接口的自定义比较器类。这个类必须实现compare()方法,并根据自定义规则来比较对象。比较器可以用于集合的排序操作,或者在特定的算法中使用。

    例如,下面是一个自定义的比较器类,用于按照字符串长度进行排序:

    import java.util.Comparator;public class StringLengthComparator implements Comparator<String> {@Overridepublic int compare(String s1, String s2) {return s1.length() - s2.length();}
    }
    ```然后,可以使用这个比较器对字符串列表进行排序:````java
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;public class Main {public static void main(String[] args) {List<String> strings = Arrays.asList("apple", "banana", "orange", "kiwi");Collections.sort(strings, new StringLengthComparator());System.out.println(strings);}
    }
    ```输出结果为:[kiwi, apple, banana, orange]
    
  2. 使用匿名内部类或Lambda表达式:如果只需要在特定的地方使用比较器,可以使用匿名内部类或Lambda表达式来创建一个临时的比较器对象。

    使用匿名内部类的示例:

    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;public class Main {public static void main(String[] args) {List<String> strings = Arrays.asList("apple", "banana", "orange", "kiwi");Collections.sort(strings, new Comparator<String>() {@Overridepublic int compare(String s1, String s2) {return s1.length() - s2.length();}});System.out.println(strings);}
    }
    ```使用Lambda表达式的示例:````java
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.List;public class Main {public static void main(String[] args) {List<String> strings = Arrays.asList("apple", "banana", "orange", "kiwi");Collections.sort(strings, (s1, s2) -> s1.length() - s2.length());System.out.println(strings);}
    }
    ```无论使用哪种方式,比较器都提供了一种灵活的机制,允许开发人员根据自定义规则对对象进行排序。比较器在Java中广泛应用于各种数据结构和算法中。
    

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

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

相关文章

【ComfyUI】Pytorch预训练模型(torch.hub)缓存地址修改

序言 最近玩ComfyUI时&#xff0c;每次生成图片&#xff0c;总是会下载一些东西&#xff0c;时间长了&#xff0c;C盘就不够用了&#xff0c;今天清理C盘发现&#xff0c;总是会在C:\Users\yutao\.cache\torch\hub\checkpoints这个路径下&#xff0c;下载大模型文件&#xff0…

适合零基础小白学的 Python 教程,视频或者书籍都可以?

Python 有很多衍生方向&#xff0c;比如 web 开发、网络爬虫、数据分析、数据挖掘、机器学习、人工智能等等&#xff0c;就业范围是很广的&#xff0c;Python 相较于别的编程语言对小白入门还是很友好的&#xff0c;Python 入门推荐这份书籍&#xff1a;PYTHON全案例实践 【PD…

6.wifi开发【智能家居:下】,正式开发:智能开关灯,智能采集温湿度,智能调彩灯

一。WEB Server开发 1.需求分析 用户通过页面操作插座彩灯温湿度 【开发前端1】&#xff1a;智能插座网页设计 智能插座网页设计需求 1.通过浏览器访问ESP8266 webserver 2.显示“创客学院-WiFi-智能家居” 3.显示“智能插座” 4.显示当前插座工作状态 5.按键触发插座动作 2.…

新手必看:Android studio 侧边栏实现,带源码

文章目录 前言效果图正文toolbar 用于定义应用程序的导航栏app_bardrawer_layout 用于创建侧边栏导航nav_header_draw app:menu"menu/activity_main_drawer" 前言 本篇内容主要是自己实现侧边栏后的一些总结&#xff0c;部分理论来着网络和ai助手&#xff0c;如有错…

根据文章段落内容自动插入图片php版

每篇内容根据段落判断插入图片代码附上&#xff1a; $chatd"<table>";if(stripos($content,$chatd)0){//随机输出三张图功能if($moduleid!37 &&$thumb){//判断是否存在图$idrand(1,999999);$midrand(1,9999999);$getimg"http://www.nongpin88.co…

uniapp项目实践总结(二十三)网页和小程序应用打包教程

导语&#xff1a;当你的应用程序开发完成后&#xff0c;在发布到互联网之前&#xff0c;需要进行打包操作&#xff0c;包括网页端、小程序端的打包。 目录 准备工作网页打包小程序打包 准备工作 在打包之前&#xff0c;请保证你的 uniapp 应用程序编译到网页、小程序是可以正…

2023国庆后前端面试应该准备什么?

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 表妹一键制作自己的五星红旗国庆头像&#xff0c;超好看 本篇文章会持续更新&#xff0c;也会同步到公众号前端面试官&#xff0c;方便大家随时随地学习…

聊聊并发编程——多线程之synchronized

目录 一.多线程下数据不一致问题 二.锁和synchronized 2.1 并发编程三大特性 2.2引入锁概念 三.synchronized的锁实现原理 3.1 monitorenter和monitorexit 3.2synchronized 锁的升级 3.2.1偏向锁的获取和撤销 3.2.2轻量级锁的加锁和解锁 自适应自旋锁 轻量级锁的解锁…

Apache DolphinScheduler 在奇富科技的首个调度异地部署实践

奇富科技&#xff08;原360数科&#xff09;是人工智能驱动的信贷科技服务平台&#xff0c;致力于凭借智能服务、AI研究及应用、安全科技&#xff0c;赋能金融机构提质增效&#xff0c;助推普惠金融高质量发展&#xff0c;让更多人享受到安全便捷的金融科技服务。作为国内领先的…

从裸机开始安装操作系统

目录 一、预置知识 电脑裸机 win10版本 官方镜像 V.S. 正版系统 二、下载微软官方原版系统镜像 三、使用微PE系统维护U盘 四、安装操作系统 五、总结 一、预置知识 电脑裸机 ●只有硬件部分&#xff0c;还未安装任何软件系统的电脑叫做裸机。 ●主板、硬盘、显卡等必…

start()方法源码分析

当我们创建好一个线程之后&#xff0c;可以调用.start()方法进行启动&#xff0c;start()方法的内部其实是调用本地的start0()方法&#xff0c; 其实Thread.java这个类中的方法在底层的Thread.c文件中都是一一对应的&#xff0c;在Thread.c中start0方法的底层调用了jvm.cpp文件…

static const char* 和const char*有报错,发生访问冲突

const char *srcfilere aByteArray.data(); 当重复某一操作时&#xff1a;有报错&#xff0c;发生访问冲突 const char *srcfilere aByteArray.data(); 即可解决访问冲突问题。 困扰了至少一天吧 应该是static的问题&#xff0c;吃了基础不好的亏。

AUTOSAR中的Crypto Stack(二)--CSM数据类型解析

在上一节,简单梳理了加密栈的基本要求。其中最关键最核心的还是用户如何使用HSM这个黑盒子,这就必须要对Crypto Service Manager要有很清晰的认识。 那么首先我们还是围绕概述里提到的job类型进行分析。 1. Crypto_JobType 上图, 在AUTOSAR的架构里,所有的密码操作…

【OLSR路由协议】链路状态路由(OLSR)协议中选择多点中继节点算法研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Grafana设置默认主页

点击【设置/管理】-> 【默认首选项 Preferences】-> 【主页仪表盘】 在下拉中选择一个页面作为主页即可

SPA项目之登录注册--请求问题(POSTGET)以及跨域问题

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于VueElementUI的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.ElementUI是什么 &#x1f4a1;…

SpringSecurity 入门

文章目录 Spring Security概念快速入门案例环境准备Spring配置文件SpringMVC配置文件log4j配置文件web.xmlTomcat插件 整合SpringSecurity 认证操作自定义登录页面关闭CSRF拦截数据库认证加密认证状态记住我授权注解使用标签使用 Spring Security概念 Spring Security是Spring…

docker 安装 nessus新版、awvs15-简单更快捷

一、docker 安装 nessus 参考项目地址&#xff1a; https://github.com/elliot-bia/nessus 介绍&#xff1a;几行代码即可一键安装更新 nessus -推荐 安装好 docker后执行以下命令 #拉取镜像创建容器 docker run -itd --nameramisec_nessus -p 8834:8834 ramisec/nessus …

C#中的(++)和(--)运算符

目录 背景: 的前加 效果展示:​ 的后加 效果展示 :​ 总结: 背景: 自增和自减运算符存在于C/C/C#/Java等高级语言中&#xff0c;它的作用是在运算结束前(前置自增自减运算符 )或后(后置自增自减运算符 )将 变量的值加(或减)1。 在C#中&#xff0c;和--是自增和自减运…

【趣味JavaScript】5年前端开发都没有搞懂toString和valueOf这两个方法!

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…