java常用类(2)

目录

1.String概述

1.1 字符串的不变性

1.2 创建String对象两种方式的区别

 1.3 字符串中的构造方法 

1.4 字符串判断功能的方法

1.5 字符串获取功能的方法 

1.6 字符串转换功能的方法

1.7 字符串替换功能的方法 

2.StringBuffer

2.1 构造方法

2.2 插入方法

2.2.1 append()方法

2.2.2 Insert()方法

2.3 删除方法

2.3.1 deleteCharAt()方法

2.3.2 delete()方法

2.4 其他方法

2.4.1 replace()方法

 2.4.2 reverse()方法

2.4.3 substring()方法 

3.StringBuilder

4.String,StringBuffer,StringBuilder对比


1.String概述

java中所有用" "双引号括起来的都是String类的对象,String类的对象有以下特征

1.1 字符串的不变性

字符串对象一旦创建就不能改变

public class String2 {public static void main(String[] args) {//字符串不变,它们的值在创建后不能被更改String s = "abcd";//abcd 第一个字符串对象s += "efg";//abcdefg 第二个字符串对象s += "aaaa";//abcdefgaaaa 第三个字符串对象System.out.println(s);}
}

上述代码,看似是s一直+=字符串,s好像是变了,但其实这是三个不同的字符串对象,只是s的指向一直在改变,所以当+=字符串次数很多时,是相当占用资源的

1.2 创建String对象两种方式的区别

方式一:

public class String1 {/*java.lang.Stringjava中所有字符串都是此类的实例"abc" -->字符串对象 底层是一个char数组 private final char value['a','b','c'];字符串对象创建方式:1.String s = "abc"创建时会先去字符串常量池中查找有没有值相同的对象,如果没有,就创建一个字符串对象,并返回地址如果字符串常量池中有,不用创建新的,直接返回已存在的对象的地址
*/public static void main(String[] args) {String s = "abc";String ss = "abc";System.out.println(s == ss);//trueSystem.out.println(s.equals(ss));//true}}

直接用一个字符串常量赋值给String类的对象,eg:String s ="abc";

用这种方式创建一个字符串对象,编译器会先在字符串常量池中找有没有与其值相同的字符串,如果有,则直接将该引用指向字符串常量池中的字符串,如果没有会在字符串常量池中创建一个该字符串,并将引用指向该对象,所以用这种方式创建两个值相同的字符串时用 == 判断返回的是true,因为它们指向字符串常量池中的同一个字符串

方式二:

public class String1 {/*2.String s1 = new String("abc");new 每次都是在堆中创建新的字符串对象*/public static void main(String[] args) {String s = "abc";String ss = "abc";System.out.println(s == ss);//trueSystem.out.println(s.equals(ss));//trueString s1 = new String("abc");String s2 = new String("abc");System.out.println(s1 == s2);//falseSystem.out.println(s1.equals(s2));//true}}

 用new调用构造方法创建对象,这种方式在创建时地址肯定是不一样的,new创建对象就是在堆中开辟不同的空间,然后将字符串填充进去,用==判断两个值相同的字符串对象时返回的是false

 1.3 字符串中的构造方法 

(1)String()

无参构造

String s1 = new String();

(2)String(String s)

用一个字符串构造字符串对象

String s2 = new String("abc");

(3)String(byte[ ] bytes)

用一个字节数组构造字符串对象

        String s3 = "你好";byte[] bytes = s3.getBytes();//编码 把字符转为 字节数组(数字)System.out.println(Arrays.toString(bytes));String s4 = new String(bytes,"GBK");//解码 把字节数组转为字符System.out.println(s4);

字符串中有一个getBytes()方法,可以将字符串转为字节数组,然后再利用String(byte[ ] bytes)将字节数组转为字符串可实现编码和解码

(4)String(char[ ] chars)

用一个字符数组构造字符串对象

        String s5 = "cab";char[] chars = s5.toCharArray();//把字符串转为字符数组Arrays.sort(chars);String s6 = new String(chars);//把字符数组转为字符串System.out.println(s6);

字符串中有一个toCharArray()方法可以将字符串转为字符数组,可以配合String(char[ ] chars)使用

1.4 字符串判断功能的方法

public class String4 {/*判断功能boolean equals(Object obj) //比较两个字符串的内容是否相等boolean equalsIgnoreCase(String str)//判断两个字符串的内容是否相等,忽略大小写boolean contains(String str)//判断字符串中是否包含指定的子串boolean isEmpty()//判断字符串是否为空串""boolean startsWith(String prefix)//判断是否以指定的字符串开头boolean endsWith(String suffix)//判断是否以指定的字符串结尾*/public static void main(String[] args) {String s1 = new String("abcd");String s2 = new String("abcD");System.out.println(s1.equals(s2));System.out.println(s1.equalsIgnoreCase(s2));System.out.println(s1.contains("ac"));System.out.println(s1.isEmpty());System.out.println(s1.startsWith("ab"));System.out.println(s1.endsWith("cd"));}
}

判断功能 

    (1) boolean equals(Object obj) //比较两个字符串的内容是否相等
    (2) boolean equalsIgnoreCase(String str)//判断两个字符串的内容是否相等,忽略大小写
    (3) boolean contains(String str)//判断字符串中是否包含指定的子串
    (4) boolean isEmpty()//判断字符串是否为空串""
    (5) boolean startsWith(String prefix)//判断是否以指定的字符串开头
    (6) boolean endsWith(String suffix)//判断是否以指定的字符串结尾

1.5 字符串获取功能的方法 

public class String5 {/*获取功能int length();//获取字符串长度char charAt(int index);//获取指定位置上的字符int indexOf(String str);返回指定字符串首次出现的位置int indexOf(String str,int fromIndex);从指定的位置位置开始查找,返回指定字符串首次出现的位置int lastIndex(String str);//从右向左查找,返回指定字符串首次出现的位置String substring(int start);//从指定的开始位置开始截取一个字符串副本到完String substring(int start,int end)从指定的开始位置截取一个字符串副本到指定位置(不包含结束位置)*/public static void main(String[] args) {String s1 = "abcdefgcd";//012345678System.out.println(s1.length());System.out.println(s1.charAt(4));for (int i = 0; i < s1.length(); i++) {System.out.print(s1.charAt(i));}System.out.println();System.out.println(s1.indexOf("cd"));System.out.println(s1.indexOf("c",3));System.out.println(s1.lastIndexOf("c"));System.out.println(s1.lastIndexOf("c",6));String s2 = s1.substring(3);String s3 = s1.substring(0,6);//左闭右开System.out.println(s2);System.out.println(s3);}
}

获取功能
   (1)  int length();//获取字符串长度
   (2)  char charAt(int index);//获取指定位置上的字符
   (3)  int indexOf(String str);返回指定字符串首次出现的位置
   (4)  int indexOf(String str,int fromIndex);从指定的位置位置开始查找,返回指定字符串首次出现的位置
   (5)  int lastIndex(String str);//从右向左查找,返回指定字符串首次出现的位置
   (6)  String substring(int start);//从指定的开始位置开始截取一个字符串副本到完
   (7)  String substring(int start,int end)从指定的开始位置截取一个字符串副本到指定位置(不包含结束位置)

1.6 字符串转换功能的方法

public class String6 {public static void main(String[] args) {/*转换功能byte[] getBytes();将字符串转为字节数组char[] toCharArray()将字符串转为字符数组static String valueOf(char[] chs)将字符数组转为字符串static String valueOf(int a)将传入的参数转为字符串类型String toLowerCase()将英文字母转为小写String toUpperCase()将英文字母转为大写String concat(String str)拼接指定的字符串内容到原字符串末尾,返回一个新的字符串对象Stirng[] split(分割符);将一个字符串用指定的分隔符拆分成一个字符串数组*/String s = String.valueOf(1234);System.out.println(s.charAt(1));int a = Integer.parseInt(s);String s1 = String.valueOf("abc".toCharArray());System.out.println(s1);String s2 = "account=admin;account=123;account=456";System.out.println(s2.toLowerCase());System.out.println(s2.toUpperCase());String s3 = s2.concat("aaa");System.out.println(s3);String[] strings = s2.split(";");System.out.println(Arrays.toString(strings));}
}


        转换功能
           (1) byte[] getBytes();将字符串转为字节数组
           (2) char[] toCharArray()将字符串转为字符数组
           (3) static String valueOf(char[] chs)将字符数组转为字符串
           (4) static String valueOf(int a)将传入的参数转为字符串类型
           (5) String toLowerCase()将英文字母转为小写
           (6) String toUpperCase()将英文字母转为大写
           (7) String concat(String str)拼接指定的字符串内容到原字符串末尾,返回一个新的字符串对象
           (8) Stirng[] split(分割符);将一个字符串用指定的分隔符拆分成一个字符串数组

1.7 字符串替换功能的方法 

public class String7 {/*替换功能String replace(char old,char new)用新的字符替换字符串中指定的字符String replace(String old,String new)用新的字符串替换字符串中指定的字符串replaceAll(String regex, String replacement)用新内容替换字符串中正则表达式匹配的字符串replaceFirst(String regex, String replacement)用新内容替换字符串中正则表达式匹配的字符串,只替换第一个String trim()去除字符串两端的空格*/public static void main(String[] args) {String s = " 2b3 cd 2efc5g ";System.out.println(s.replace("2","C"));System.out.println(s.replaceAll("\\d","C"));System.out.println(s.replaceFirst("\\d","C"));System.out.println(s.length());System.out.println(s.trim().length());}}


替换功能
       (1) String replace(char old,char new) 用新的字符替换字符串中指定的字符
       (2) String replace(String old,String new) 用新的字符串替换字符串中指定的字符串
       (3) replaceAll(String regex, String replacement) 用新内容替换字符串中正则表达式匹配的字符串
       (4) replaceFirst(String regex, String replacement) 用新内容替换字符串中正则表达式匹配的字符串,只替换第一个
       (5) String trim() 去除字符串两端的空格 

注意:

这里要注意replace和replaceAll方法的区别,两个都可以对所有字符进行替换,不要被名字迷惑,replaceAll()方法的匹配方式可以传入一个正则表达式,而replace()方法传入的是用谁替换谁是字符串

2.StringBuffer

因为String类的对象一旦创建就不能改变,并且在进行字符串的拼接时,要频繁创建新的对象,既占用空间,又耗时,所以有了StringBuffer类,StringBuffer类的对象底层的数组没有被final修饰,所以在操作时,可以直接在原来的字符串上改变,不用创建新的字符串对象

2.1 构造方法

public class StringBuffer1 {public static void main(String[] args) {StringBuffer s1 = new StringBuffer();//空的构造方法指定底层数组长度是16StringBuffer s2 = new StringBuffer("abcd");//有参构造,底层数组长度为字符串长度+16StringBuffer s3 = new StringBuffer(10);//还可以指定底层数组长度}
}

 (1) StringBuffer()

空的构造函数,底层会产生一个默认长度为16的char数组

(2) StringBuffer(String str)

用一个字符串初始化StringBuffer,底层会产生一个字符串长度+16的char数组

(3) StringBuffer(int capacity)

也可以用该构造方法指定底层数组的长度

2.2 插入方法

2.2.1 append()方法

public class StringBuffer1 {public static void main(String[] args) {StringBuffer s1 = new StringBuffer("abcd");//有参构造,底层数组长度为字符串长度+16s1.append("abcd");//向字符串末尾添加内容System.out.println(s1);s1.append("efg");System.out.println(s1);s1.append("hijk");System.out.println(s1);s1.append("aaaa");System.out.println(s1);}

该方法是直接在原字符串末尾进行追加,每追加一次就会判断当前长度是否大于数组长度,如果大于就会new一个新的字符数组,长度是2 * length(元数组长度) + 2个,并将原来数组中的值拷贝到新数组中,在改变原来数组的引用

2.2.2 Insert()方法

public class StringBuffer1 {public static void main(String[] args) {StringBuffer s2 = new StringBuffer("abcd");//有参构造,底层数组长度为字符串长度+16s2.insert(1,"A");//向指定的位置上插入指定的字符串System.out.println(s2);}
}

Insert()方法就是在指定位置处插入一个字符或字符串

2.3 删除方法

2.3.1 deleteCharAt()方法

public class StringBuffer1 {public static void main(String[] args) {StringBuffer s2 = new StringBuffer("abcd");//有参构造,底层数组长度为字符串长度+16s1.deleteCharAt(1);//删除指定位置上的字符System.out.println(s2);
}

该方法是删除指定位置处的字符

2.3.2 delete()方法

public class StringBuffer1 {public static void main(String[] args) {StringBuffer s2 = new StringBuffer("abcd");//有参构造,底层数组长度为字符串长度+16s2.delete(0,3);//删除指定区间的元素,左闭右开System.out.println(s2);}
}

删除指定区间的字符串,左闭右开

2.4 其他方法

2.4.1 replace()方法

public class StringBuffer1 {public static void main(String[] args) {StringBuffer s2 = new StringBuffer("abcd");//有参构造,底层数组长度为字符串长度+16s2.replace(0,4,"AAA");System.out.println(s2);}
}

该方法使用一个字符串替换指定区间内的字符串

 2.4.2 reverse()方法

public class StringBuffer1 {public static void main(String[] args) {StringBuffer s2 = new StringBuffer("abcd");//有参构造,底层数组长度为字符串长度+16s2.reverse();//反转字符串System.out.println(s2);}
}

该方法可以反转一个字符串

2.4.3 substring()方法 

public class StringBuffer1 {public static void main(String[] args) {StringBuffer s2 = new StringBuffer("abcd");//有参构造,底层数组长度为字符串长度+16String s2 = s1.substring(0,5);//截取字符串,从StringBuffer中截取一个字符串副本,返回给一个新的String对象,StringBuffer对象不变System.out.println(s2);}
}

该方法是截取指定区间(左闭右开)的字符串,原字符串不变,是拷贝了一份进行截取

3.StringBuilder

StringBuilder和StringBuffer基本相同,都是继承了AbstractStringBuilder,相当于向外提供了两个类,但实际上调用的是都是AbstractStringBuilder中的方法,唯一的区别就是StringBuffer的方法中加了synchronized关键字,是线程安全的,而StringBuilder是线程不安全的

4.String,StringBuffer,StringBuilder对比

String:是一个值不可以改变的字符串

StringBuffer:值可以改变且不需要创建新对象,  方法上都加了锁, 是在多线程(任务)执行时是线程安全的

StringBuilder: 值可以改变且不需要创建新对象, 由于方法上都没有加锁,在多线程(任务)执行时是线程不安全的, 适合单线程

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

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

相关文章

a-table单元格指定合并以及表格双击编辑以及未填写指定验证功能

文章目录 a-table单元格指定合并以及表格双击编辑以及未填写指定验证功能一、 a-table单元格指定合并1. a-table2. columns3. 图例 二、a-table 表格双击编辑以及未填写验证1. a-table2. js3. 图例 a-table单元格指定合并以及表格双击编辑以及未填写指定验证功能 一、 a-table…

从零开始精通Onvif之加密与认证

&#x1f4a1; 如果想阅读最新的文章&#xff0c;或者有技术问题需要交流和沟通&#xff0c;可搜索并关注微信公众号“希望睿智”。 概述 安全是Onvif规范的核心部分&#xff0c;它涵盖了加密和认证两大领域。在Onvif标准下&#xff0c;安全措施主要包括&#xff1a;设备访问控…

大模型AI技术实现语言规范练习

人工智能技术可以为语言规范练习提供多种有效的解决方案&#xff0c;帮助学习者更有效地掌握语言规范。以下是一些常见的应用场景。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 智能纠错 利用自然语言处理技术&#xff0c;可以…

DC/AC电源模块一种效率与可靠性兼备的能源转换解决方案

DC/AC电源模块都是一种效率与可靠性兼备的能源转换解决方案 DC/AC电源模块是一种能够将直流电源&#xff08;DC&#xff09;转换为交流电源&#xff08;AC&#xff09;的设备。它在现代电子设备中扮演着非常重要的角色&#xff0c;因为许多设备需要交流电源才能正常运行。无论…

树形结构的勾选、取消勾选、删除、清空已选、回显、禁用

树形结构的勾选、取消勾选、删除、清空已选、回显、禁用 基本页面&#xff1a; 分为上传文件和编辑的页面 代码实现要点&#xff1a; 上传文件页面&#xff1a; 点开选择范围弹窗&#xff0c;三个radio单选框都为可选状态&#xff0c;默认显示的是第一个单选框&#xff08;按…

开源C++版AI画图大模型框架stable-diffusion.cpp开发使用初体验

stable-diffusion.cpp是一个C编写的轻量级开源类AIGC大模型框架&#xff0c;可以支持在消费级普通设备上本地部署运行大模型进行AI画图&#xff0c;以及作为依赖库集成的到应用程序中提供类似于网页版stable-diffusion的功能。 以下基于stable-diffusion.cpp的源码利用C api来…

人工智能的未来:畅想智能新时代

人工智能正在改变我们的世界&#xff0c;它将带我们走向何方&#xff1f; 著名神经科学家、Numenta 公司创始人杰夫•霍金斯 Jeff Hawkins 在其著作《人工智能的未来》中&#xff0c;描绘了一幅人工智能发展的光明图景。他认为&#xff0c;人工智能将超越人类智能&#xff0c;…

理解Gobrs-Async相对于CompletableFuture的优势

Gobrs-Async框架针对复杂应用场景下的异步任务编排&#xff0c;提供了一些传统Future或CompletableFuture所不具备的特性和能力&#xff0c;以下是它能够解决的问题和相对于CompletableFuture的优势&#xff1a; 1. **全链路异常回调**&#xff1a; - Gobrs-Async允许为任务…

关于地图点击的操作

_this.map.dragging.disable(); //地图拖拽 _this.map.doubleClickZoom.disable(); //禁止双击放大地图 _this.map.scrollWheelZoom.disable(); //禁止鼠标滑轮滚动放大缩小地图 _this.map.dragging.enable(); //e…

备份和镜像TrinityCore

相比重新安装&#xff0c;省去了编译的过程&#xff0c;同时还能保留以前的人物、装备等。 注意&#xff0c;若不想重新编译安装&#xff0c;则需要创建一样的目录、账户等&#xff0c;以减少不必要的麻烦。 首先备份数据: mysql备份和导入方法见&#xff1a;使用dump备份my…

视觉与味蕾的交响:红酒与艺术的无界狂欢,震撼你的感官世界

在浩瀚的艺术海洋中&#xff0c;红酒以其不同的魅力&#xff0c;成为了一种跨界整合的媒介。当雷盛红酒与艺术相遇&#xff0c;它们共同呈现出一场特别的视觉盛宴&#xff0c;让人沉醉在色彩与光影的交织中&#xff0c;感受红酒与艺术的无界碰撞。 雷盛红酒&#xff0c;宛如一件…

AI作画Prompt不会写?Amazon Bedrock Claude3.5来帮忙

最新上线的Claude3.5 Sonnet按照官方介绍的数据来看&#xff0c;在多方面超越了CPT-4o&#xff0c;是迄今为止最智能的模型。 而跟上一个版本相比&#xff0c;速度是Claude 3 Opus的两倍&#xff0c;成本只有其五分之一。 Claude3.5 Sonnet不仅擅长解释图表、图形或者从不完…

vue3中子组件调用父组件事件

在 Vue 3 中&#xff0c;子组件调用父组件的事件&#xff08;或方法&#xff09;的方式与 Vue 2 类似&#xff0c;但 Vue 3 引入了 Composition API&#xff0c;这可能会改变你组织代码的方式。不过&#xff0c;基本的通信机制——通过自定义事件 ($emit) 通知父组件——仍然保…

总结:DataX

一、介绍 本文主要介绍DataX的安装与使用。 二、安装 安装&#xff1a;DataX/userGuid.md at master alibaba/DataX GitHub 六、案例 实现从MySQL同步数据到HDFS&#xff0c;然后使用Hive进行聚合计算并将结果存储回MySQL。 步骤2&#xff1a;使用DataX同步MySQL数据到H…

Day28:回溯法 491.递增子序列 46.全排列 47.全排列 II 332.重新安排行程 51. N皇后 37. 解数独

491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也可以视作递增序列的一种特殊情…

Atcoder ABC359E Water Tank 题解

题目传送门 题解 分析 分类讨论。 记第 i i i 个答案为 a n s i 1 ans_i1 ansi​1。 第 i i i 个数就是目前的最大值。 显然&#xff0c; a n s i h i i ans_ih_i \times i ansi​hi​i。第 i i i 个数就是目前的最大值。 记 l a s t i last_i lasti​ 为 i i i …

网络安全学习路线图(2024版详解)

近期&#xff0c;大家在网上对于网络安全讨论比较多&#xff0c;想要学习的人也不少&#xff0c;但是需要学习哪些内容&#xff0c;按照什么顺序去学习呢&#xff1f;其实我们已经出国多版本的网络安全学习路线图&#xff0c;一直以来效果也比较不错&#xff0c;本次我们针对市…

Java中多态的实现原理解析

Java中多态的实现原理解析 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在本文中&#xff0c;我们将深入探讨Java中多态的实现原理及其应用。多态是面向对象编…

centos中查看服务的日志

在CentOS中查看服务的日志通常涉及查看系统日志文件&#xff0c;这些文件通常位于/var/log/目录下。不同的服务可能会有不同的日志文件。以下是一些常见的日志文件和查看它们的方法&#xff1a; 1. **系统日志**&#xff1a;系统日志通常存储在/var/log/messages或/var/log/sy…

学会python——生成日志信息(python实例十二)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、生成日志信息 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的…