当前位置: 首页 > article >正文

字符串,集合

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
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方法的作用
  • 方法介绍

public boolean equals(String s)     //比较两个字符串内容是否相同、区分大小写
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.kler.cn/a/525637.html

相关文章:

  • wordpress每隔24小时 随机推荐一个指定分类下的置顶内容。
  • sem_wait的概念和使用案列
  • 指针的介绍3后
  • 深度学习中常用的评价指标方法
  • 代码随想录算法训练营第三十八天-动态规划-完全背包-279.完全平方数
  • 【C++题解】1393. 与7无关的数?
  • MySQL数据库(二)
  • redis数据安全与性能保障
  • .gitignore 文件的使用
  • Windows平台免费艺术签名设计工具:一键生成书法级个性签名
  • AIGC时代的Vue或React前端开发
  • 搜索与图论复习1
  • Hive详细讲解-概述与环境搭建
  • 代码随想录算法训练营第三十九天-动态规划-213. 打家劫舍 II
  • Unity实现按键设置功能代码
  • 分享|通过Self-Instruct框架将语言模型与自生成指令对齐
  • 为大模型提供webui界面的利器:Open WebUI 完全本地离线部署deepseek r1
  • 【memgpt】letta 课程6:代理RAG和外部内存
  • 130周四复盘(162)研究神作
  • Qt u盘自动升级软件
  • 【愚公系列】《循序渐进Vue.js 3.x前端开发实践》036-案例:实现支持搜索和筛选的用户列表
  • 【某大厂一面】JDK1.8中对HashMap数据结构进行了哪些优化
  • 手撕Diffusion系列 - 第十一期 - lora微调 - 基于Stable Diffusion(代码)
  • Kafka常见问题之 org.apache.kafka.common.errors.RecordTooLargeException
  • 《DeepSeek 网页/API 性能异常(DeepSeek Web/API Degraded Performance):网络安全日志》
  • MIMIC IV数据库中mimiciv_hosp的transfers表的careunit分析