字符串,集合

ops/2025/2/1 15:12:34/

String

概述

java.lang.String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都为此类的对象

注意:字符串的内容是不会发生改变的,它的对象在创建后不能被更改

String是Java定义好的一个类。定义在java.lang 包中,所以使用的时候不需要导包

String类的特点

  • 字符串不可变,它们的值在创建后不能被更改

  • 虽然 String 的值是不可变的,但是它们可以被共享

  • 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )

String类的构造方法

  • 常用的构造方法

    方法名说明
    public String()创建一个空白字符串对象,不含有任何内容
    public String(char[] chs)根据字符数组的内容,来创建字符串对象
    public String(byte[] bys)根据字节数组的内容,来创建字符串对象
    String s = “abc”;直接赋值的方式创建字符串对象,内容就是abc
java">package string;public class string {public static void main(String[] args) {
//        直接赋值一个字符串对象String str1 = "abc";System.out.println(str1);//        使用new的方式来获取一个字符串对象
//        空参构造:可以获取一个空白的字符串对象String str2 =new String();System.out.println('@'+str2+'!');//        传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象String str3 = new String("abc");System.out.println(str3);//        传递一个字符数组,根据字符数组的内容再创建一个新的字符串对象
//        需求:需要修改字符串的内容。char[] chars = {'a','b','c'};String str4 = new String(chars);System.out.println(str4);//        传递一个字节数组,根据字节数组的内容再创建一个新的字符串对象
//        拿到数字到ASCII码表中找对应的字符
//        应用场景:以后在网络当中传输的数据其实都是字节信息
//        一般要把字节信息进行转换,转成字符串,此时就要用到这个构造了。byte[] bytes = {97,98,99};String str5 = new String(bytes);System.out.println(str5);}
}

创建字符串对象两种方式的区别

  • 通过构造方法创建

    通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同

  • 直接赋值方式创建

    以“”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。不存在:创建新的   存在:复用

字符串的比较

==号的作用
  • 比较基本数据类型:比较的是具体的值

  • 比较引用数据类型:比较的是对象地址值

equals方法的作用
  • 方法介绍

java">public boolean equals(String s)     //比较两个字符串内容是否相同、区分大小写
java">package string;import javax.xml.transform.Result;public class compete {public static void main(String[] args) {String s1 = new String("abc");String s2 = "Abc";//        ==比较的是两个字符串的地址值System.out.println(s1 == s2);//        equals比较的是两个字符串的内容boolean result1 = s1.equals(s2);System.out.println(result1);//        equalsIgnoreCase比较的是两个字符串的内容,忽略大小写
//        忽略大小写只能是英文状态下的boolean result2 = s1.equalsIgnoreCase(s2);System.out.println(result2);}
}

遍历字符串

需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串

public char charAt(int index):根据索引返回字符

public int length():返回此字符串的长度

String substring(int beginindex, int endindex)   截取
注意点:包头不包尾,包左不包右

只有返回值才是截取的小串
String substring(int beginindex)  截取到未尾

String replace(旧值,新值)   替换

注意点:只有返回值才是替换之后的结果

StringBuilder

stringBuilder是Java已经写好的类java在底层对他做了一些特殊处理。打印对象不是地址值而是属性值。

StringBuilder 可以看成是一个容器,创建之后里面的内容是可变的。

当我们在拼接字符串和反转字符串的时候会使用到

作用:提高字符串的操作效率

链式编程:
当我们在调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法

方法名说明
public StringBuilder()创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象
public StringBuilder append (任意类型)添加数据,并返回对象本身
public StringBuilder reverse()反转容器中的内容
public int length()返回长度(字符出现的个数)
public String toString()通过toString()就可以实现把StringBuilder转换为String

StringJoiner

  • StringJoiner跟StringBuilder一样,也可以看成是一个容器,创建之后里面的内容是可变的。

  • 作用:提高字符串的操作效率,而且代码编写特别简洁,但是目前市场上很少有人用。

  • JDK8出现的

方法名说明
public Stringjoiner(间隔符号)创建一个StringJoiner对象,指定拼接时的间隔符号
public StringJoiner (间隔符号,开始符号,结束符号)创建一个StringJoiner对象,指定拼接时的间隔符号开始符号、结束符号
public Stringjoiner add (添加的内容)添加数据,并返回对象本身
public int length()返回长度(字符出现的个数)
public String toString()返回一个字符串(该字符串就是拼接之后的结果)

关于字符串的小扩展:(先了解)

字符串存储的内存原理

String s = “abc”;直接赋值

特点:

此时字符串abc是存在字符串常量池中的。

先检查字符串常量池中有没有字符串abc,如果有,不会创建新的,而是直接复用。如果没有abc,才会创建一个新的。

所以,直接赋值的方式,代码简单,而且节约内存。

new出来的字符串

看到new关键字,一定是在堆里面开辟了一个小空间。

String s1 = new String(“abc”);

String s2 = “abc”;

s1记录的是new出来的,在堆里面的地址值。

s2是直接赋值的,所以记录的是字符串常量池中的地址值。

==号比较的到底是什么?

如果比较的是基本数据类型:比的是具体的数值是否相等。

如果比较的是引用数据类型:比的是地址值是否相等。

结论:==只能用于比较基本数据类型。不能比较引用数据类型。

字符串拼接的底层原理

        如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。
        如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。JDK8以前底层会使用StringBuilder

        一个加号,堆内存中俩对象

字符串拼接的时候,如果有变量:
JDK8以前:系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接。
拼接后,再调用其toString方法转换为String类型,而toString方法的底层是直接new了一个字符串对象。
IDK8版本:系统会预估要字符串拼接之后的总大小,把要拼接的内容都放在数组中,此时也是产生一个新的字符串。

StringBuilder源码分析

默认创建一个长度为16的字节数组

添加的内容长度小于16,直接存

添加的内容大于16会扩容(原来的容量*2+2)

如果扩容之后还不够,以实际长度为准

ArrayList集合和数组的优势对比:

  1. 长度可变

  2. 添加数据的时候不需要考虑索引,默认将数据添加到末尾

ArrayList类概述

  • 什么是集合

    提供一种存储空间可变的存储模型,存储的数据容量可以发生改变

  • ArrayList集合的特点

    长度可以变化,只能存储引用数据类型。

  • 泛型的使用

    用于约束集合中存储元素的数据类型

ArrayList类常用方法

构造方法
方法名说明
public ArrayList()创建一个空的集合对象
成员方法

增删改查

方法名说明
public boolean add(要添加的元素)将指定的元素追加到此集合的末尾
public boolean remove(要删除的元素)删除指定元素,返回值表示是否删除成功
public E remove(int index)删除指定索引处的元素,返回被删除的元素
public E set(int index,E element)修改指定索引处的元素,返回被修改的元素
public E get(int index)返回指定索引处的元素
public int size()返回集合中的元素的个数


http://www.ppmy.cn/ops/154778.html

相关文章

DDD - 领域驱动设计分层架构:构建可演化的微服务架构

文章目录 引言1. 什么是DDD分层架构?1.1 DDD分层架构的演变1.2 四层架构的起源与问题1.3 依赖倒置和五层架构 2. DDD分层架构的核心层次2.1 用户接口层(User Interface Layer)2.2 应用层(Application Layer)2.3 领域层…

kafka消费者详细介绍(超级详细)

文章目录 一、Kafka 消费者与消费者组1.1 Kafka 消费者(Consumer)概述1.1.1 消费者工作流程1.1.2 消费者的关键配置 1.2 Kafka 消费者组(Consumer Group)概述1.2.1 消费者组的工作原理1.2.2 消费者组的优点1.2.3 消费者组的再均衡…

Linux网络编程中的零拷贝:提升性能的秘密武器

在当今数字化时代,网络应用的性能至关重要。而在网络编程中,数据传输的效率直接影响着应用的整体性能。传统的数据传输方式往往涉及大量的数据拷贝和上下文切换,这在高并发、大数据量的场景下,会成为性能瓶颈。零拷贝技术的出现&a…

25.Word:学生成绩管理系统【8】

目录 NO1.2​ NO3 NO4.5.6 NO7.8.9​​ NO1.2 F12另存为→考生文件夹布局→页面设置对话框→纸张大小→页边距:上下左右→文档网格: NO3 布局→分隔符→分节符:下一页(封面、目录、一、二、三、四)6节双击页眉页…

Kotlin开发(六):Kotlin 数据类,密封类与枚举类

引言 想象一下,你是个 Kotlin 开发者,敲着代码忽然发现业务代码中需要一堆冗长的 POJO 类来传递数据。烦得很?别急,Kotlin 贴心的 数据类 能帮你自动生成 equals、hashCode,直接省时省力!再想想需要多种状…

React第二十八章(css modules)

css modules 什么是 css modules 因为 React 没有Vue的Scoped,但是React又是SPA(单页面应用),所以需要一种方式来解决css的样式冲突问题,也就是把每个组件的样式做成单独的作用域,实现样式隔离,而css modules就是一种…

directx12 3d+vs2022游戏开发第一章 笔记三 向量代数

一、向量类型 1.局部变量或全局变量用XMVECTOR 类型。 2. 对于类中的数据成员, 使用XMFLOAT2(2d向量)、XMFLOAT3(3d向量)和XMFLOAT4(4d向量) 类型。 3. 在运算之前, 通过加载函数将XMFLOATn类型转换为 XMV…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.18 逻辑运算引擎:数组条件判断的智能法则

1.18 逻辑运算引擎:数组条件判断的智能法则 1.18.1 目录 #mermaid-svg-QAFjJvNdJ5P4IVbV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QAFjJvNdJ5P4IVbV .error-icon{fill:#552222;}#mermaid-svg-QAF…