认识Java中的String类

news2024/11/27 22:38:28

前言

大家好呀,本期将要带大家认识一下Java中的String类,本期注意带大家认识一些String类常用方法,和区分StringBuffer和StringBuilder感谢大家收看

一,String对象构造方法与原理

String类为我们提供了非常多的重载的构造方法让我们构造字符对象,感兴趣可以点开源码看看,下面介绍常用四种以及使用场景

1.常量池直接构造:最简便的构造方式,栈中创建的对象的引用指向常量池中的对象,如下图str

2.使用new构造:在堆区中开辟一片空间存放字符对象,如下图str1

3.字符数组构造:New的String对象传入一个字符数组构造字符对象,如下图str2

4.字节数组构造:利用字节数组构造,此时需注意字节数组中存放字母的ACCII码值,构造时需选择编码格式,一般使用UTF-8编码格式进行编码如下图str3

public class Test {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String str="helloWorld";//直接构造
        String str1=new String("helloWorld");//new出对象
        char[] ch={'h','e','l','l','o','W','o','r','l','d'};
        String str2=new String(ch);//字符数组构造
        byte[] bytes = {104, 101, 108, 108, 111}; // 字节数组,对应ASCII "hello"
        String str3 = new String(bytes, "UTF-8"); // 使用UTF-8编码构造字符串
        System.out.println(str+"\n"+str1+"\n"+str2+"\n"+str3);
    }
}

值得一提利用字符数组和字节数组有常见的构造方法

表示截取var1字数数组中从var2到var3的字符构造字符串,截取的区间左闭右闭,例如

二,String对象的不可变性

String对象一经创建,便不可更改,更改的话,只会在创建一个新的对象,把更改过后的内容放进去,这个就是String对象的不可变性,String的这个特性使的对String对象的操作相对低效,于是StringBuilder类就可以提高我们的效率。后面介绍StringBuilder类时会详细说明

三,String类中的常用方法

1,字符串转换

(1)大小写转换

java中使用toUpperCase和toLowercase对字符串进行大小写转换,注意这个方法不会改变原来字符串,而是返回一个新的字符串

public class Test1 {
    public static void main(String[] args) {
        String str="HELLO";
        String str1=str.toLowerCase();
        System.out.println(str1);
        String str2="hello";
        String str3=str2.toUpperCase();
        System.out.println(str3);
    }
}
(2)字符串和数值转换

Java中,如果想把一个子符转成数值需要用到它们对应类型的包装类,同样,把任意类型对象转成字符串需要用到String的valueOf方法,如下

public class Test1 {
    public static void main(String[] args) {
        String s="1234";
        System.out.println(Integer.parseInt(s));
        int i=1234;
        System.out.println(String.valueOf(i));
    }
}
(3)字符串转数组

字符串对象调用toCharArray方法,返回一个字符数组,可以得到字符串中每个字符,然后,我们可以遍历这个数组打印观察其中的字符

public class Test1 {
    public static void main(String[] args) {
        String str="hello";
        char[] ch=str.toCharArray();
        for (int i=0;i<ch.length;i++){
            System.out.println(ch[i]);
        }
    }
}

(4)格式化

String类调用format方法,优点在于可以更方便地创建复杂的输出字符串,特别是在需要格式化输出的时候,学过C语言的小伙伴们应该不陌生,例如

public class Test1 {
    public static void main(String[] args) {
        String str="hello";
        String str1="World";
       int i=10;
        System.out.println(String.format("%s %s %d", str, str1,i));
    }
}

2,寻找字符

(1)寻找某个下表对应字符--charAt

String对象调用charAt(in i)方法,传入一个字符串对应字符的下标,返回对应下标的字符,源码如下

顺带一提如果字符由数字组成也返回一个数字字符

public class Test1 {
    public static void main(String[] args) {
        String str="hello";
        String str1="World";
        String str3="16774";
        char ch=str3.charAt(1);
        char ch1=str1.charAt(0);
        System.out.println(ch);
        System.out.println(ch1);

    }
}
(2)寻找某个字符首次出现位置--indexOf

String对象调用Indexof方法传入一个字符,返回对应字符首次出现的下标值,它还可以在传入一个int值表示从这个int值对应的下表开始找对应字符,没找到返回-1。

public class Test1 {
    public static void main(String[] args) {
        String str="Hello World";
        System.out.println(str.indexOf("l"));
        System.out.println(str.indexOf("l",5));//只传入一个数,表示从5下标一直找到结尾
    }
}

(3)从字符串末尾开始向前找字符--lastIndexof

与indexof用法类似,不过这次是从后向前找字符,没找到则返回-1

public class Test1 {
    public static void main(String[] args) {
        String str="Hello World";
        System.out.println(str.lastIndexOf("l"));
        System.out.println(str.lastIndexOf("l",5));//传入一个数,表示从5一直向前找
    }
}

3,字符串比较

(1)==

实质上是比较字符串的地址,同一地址返回true否则返回false

public class Test1 {
    public static void main(String[] args) {
        String str="Hello";
        String str1=new String("Hello");
        String str2="Hello";
        String str3=new String("Hello");
        System.out.println(str==str1);//前面已经讲过字符串的构造,很明显地址不同
        System.out.println(str==str2);//都在常量池中地址相同
        System.out.println(str1==str3);//每次new都会在堆区开辟空间,二者地址不同
    }
}
(2)equals

只比较字符串内容,与地址无关(String内部重写了这个方法)

public class Test1 {
    public static void main(String[] args) {
        String str = "Hello";
        String str1 = new String("Hello");
        String str2 = "Hello";
        System.out.println(str.equals(str1));
        System.out.println(str.equals(str2));
        System.out.println(str1.equals(str2));
    }
}

(3)compareTo

这部分内容我们在接口部分讲过,主要是我们重写Comparable接口中的compareTo方法来比较两个字符类型的大小。注意String类是重写了compareTo这个方法的,我们直接使用即可,它会根据比较字符的大小返回一个整型值,对这部分内容感兴趣的朋友们可以看看CSDN这篇文章,下面说明String对象如何调用这个方法

public class Test {
    public static void main(String[] args) {
        String s="hello";
        String s1="world";
        System.out.println(s.compareTo(s1));//s小于s1,返回一个小于0的数
        System.out.println(s1.compareTo(s));//s1大于s,返回一个大于0的数
        System.out.println(s.compareTo(s));//相同字符串返回0
    }
}

4,字符串操作

(1)替换操作--replace

使用replace方法可以把字符串中特定的所有字符替换成指定字符

public class Test {
    public static void main(String[] args) {
        String s = "hello,world";
        String s1 = s.replace("l", "s");
        System.out.println(s+"\n"+s1);
    }
}

当然,这个方法会返回一个新对象,不会对原来字符串做任何修改

(2)分裂操作--split

Java中有将字符串根据指定字符拆分成几个子字符串的方法

由源码可以看出,这个方法传入一个字符,返回一个String类型的数组,我们可以通过遍历得到这个数组每个元素

public class Test {
    public static void main(String[] args) {
        String s = "hello,world";
        String[] str=s.split("l");
        for (int i = 0; i <str.length; i++) {
            System.out.println(str[i]);
        }
    }
}

当然也可以传入一个字符串

public class Test {
    public static void main(String[] args) {
        String s = "hello,world";
        String[] str=s.split("ll");
        for (int i = 0; i <str.length ; i++) {
            System.out.println(str[i]);
        }
    }
}

当然,要是没有这个字符那么这个字符串就不会被分割

public class Test {
    public static void main(String[] args) {
        String s = "hello,world";
        String[] str=s.split("k");
        for (int i = 0; i <str.length ; i++) {
            System.out.println(str[i]);
        }
    }
}

四,StringBuffer与StringBuilder应用与区分

StringBuffer与StringBuilder用法和功能都是类似的,区别就在于StringBuilder对字符串的操作都是在原字符之上修改,并不会创建新的对象,这就使得StringBuiler效率优于String类,举个例子,StringBuilder类有一个append的拼接字符串的方法,这个方法就会比String类通过+=拼接效率更高

import java.util.Timer;

public class Test {
    public static void main(String[] args) {
        String s = "hello";
        StringBuilder s1 = new StringBuilder("hello");
        Long time1=System.currentTimeMillis();
        //记录当前时间
        for (int i = 0; i <10000 ; i++) {
            s+="i";
        }
        Long time2=System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            s1.append("i");
        }
        Long time3=System.currentTimeMillis();
        System.out.println(time2-time1);
        System.out.println(time3-time2);

    }
}

另外,StringBuilder对象可以通过toString方法转化成String对象

public class Test1 {
    public static void main(String[] args) {
        StringBuilder s1 = new StringBuilder("hello");
        String s=s1.toString();
    }
}

StringBuffer类于他们只有一个区别,StringBuffer类的操作属于线程安全操作,它的大部分方法都加上了

 synchronized关键字,如下

线程安全操作简单理解就是指在多线程情况下,这个方法会被执行完才会让出cpu资源,执行后面代码,这保证了代码逻辑的正确性,当然,与之相对效率差一点点,所以在单线程情况下还是常用另外两个方法。

本期博客就到到这里啦,记录个人学习欢迎大家指正错误哦,谢谢大家,我们下期见

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

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

相关文章

kubesz(一键安装k8s)

引言 Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。kubeasz 是一个用于快速搭建 Kubernetes 高可用集群的项目&#xff0c;它基于 Ansible&#xff0c;通过提供一套简单、易用的配置&#xff0c;使得…

java异常处理知识点总结

一.前提知识 首先当运行出错的时候&#xff0c;有两种情况&#xff0c;一种叫做“错误”&#xff0c;另一种叫做“异常”。错误指的是运行过程中遇到了硬件或操作系统出错&#xff0c;这种情况程序员是没办法处理的&#xff0c;因为这是硬件和系统的问题&#xff0c;不能靠代码…

Linux: ubi rootfs 故障案例 (1)

文章目录 1. 前言2. ubi rootfs 故障现场3. 故障分析与解决4. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. ubi rootfs 故障现场 问题故障内核日志如下&#xff1a; Starting ker…

【数据结构与算法 | 二叉树篇】力扣101, 104, 111,LCR144

1. 力扣101 : 对称二叉树 (1). 题 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false…

Go语言 几种常见的IO模型用法 和 netpoll与原生GoNet对比

【go基础】16.I/O模型与网络轮询器netpoller_go中的多路io复用模型-CSDN博客 字节开源的netPoll多路复用器源码解析-CSDN博客 一、几种常见的IO模型 1. 阻塞I/O (1) 解释&#xff1a; 用户调用如accept、read等系统调用&#xff0c;向内核发起I/O请求后&#xff0c;应用程序…

多样本上下文学习:开拓大模型的新领域

大模型&#xff08;LLMs&#xff09;在少量样本上下文学习&#xff08;ICL&#xff09;中展现出了卓越的能力&#xff0c;即通过在推理过程中提供少量输入输出示例来学习&#xff0c;而无需更新权重。随着上下文窗口的扩展&#xff0c;我们现在可以探索包含数百甚至数千个示例的…

基于JSP技术的文物管理系统

你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员界面 用户前台…

步态控制之ZMP

零力矩点&#xff08;Zero Moment Point&#xff0c;ZMP&#xff09;概述 ZMP步态控制是人形机器人步态控制中的一个关键概念&#xff0c;旨在确保机器人在行走或站立过程中保持平衡。ZMP是指机器人接触面上力矩为零的点&#xff0c;确保在该点上机器人不会倾倒。这个示例展示…

Python的登录注册界面跳转汽车主页面

1.登录注册界面的代码&#xff1a; import tkinter as tk from tkinter import messagebox,ttk from tkinter import simpledialog from ui.car_ui import start_car_ui# 设置主题风格 style ttk.Style() style.theme_use("default") # 可以根据需要选择不同的主题…

竞拍商城系统源码后端PHP+前端UNIAPP

下载地址&#xff1a;竞拍商城系统源码后端PHP前端UNIAPP

Live800:深度解析,客户服务如何塑造品牌形象

在当今竞争激烈的市场环境中&#xff0c;品牌形象对于企业的成功至关重要。而客户服务作为品牌与消费者之间最直接的互动方式&#xff0c;不仅影响着消费者的购买决策&#xff0c;更在塑造品牌形象方面发挥着不可替代的作用。本文将深度解析客户服务如何塑造品牌形象&#xff0…

1074 宇宙无敌加法器(测试点5)

solution 每位权值不同的高精度加法测试点5&#xff1a;结果为0的情况 #include<iostream> #include<string> using namespace std; int main(){string rule, a, b, ans "";int carry 0, temp, cnt, power;cin >> rule >> a >> b;…

【Python】FastAPI返回不带双引号的字符串

昨天为获取代理ip写的一个接口&#xff0c;但返回的数据是带有双引号&#xff0c;终究不适合一些应用场景&#xff0c;带引号的是这样的&#xff1a; 说实在话&#xff0c;一时我也愣住了&#xff0c;竟然不知道要咋去掉这个双引号。因为是api接口&#xff0c;直接显示结果&…

HW面试常见知识点2——研判分析(蓝队中级版)

&#x1f340;文章简介&#xff1a;又到了一年一度的HW时刻&#xff0c;本文写给新手想快速进阶HW蓝中的网安爱好者们&#xff0c; 通读熟练掌握本文面试定个蓝中还是没问题的&#xff01;大家也要灵活随机应变&#xff0c;不要太刻板的回答&#xff09; &#x1f341;个人主页…

计算机网络 期末复习(谢希仁版本)第8章

元文件就是一种非常小的文件&#xff0c;它描述或指明其他文件的一些重要信息。这里的元文件保存了有关这个音频/视频文件的信息。 10. 流式&#xff1a;TCP&#xff1b;流式实况&#xff1a;UDP。

零基础入门学用Arduino 第二部分(一)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

在windows下使用本地AI模型提供翻译、对话、文生图服务

文章目录 在windows下使用本地AI模型提供翻译、对话、文生图服务ollama简介下载安装配置环境变量模型安装目录服务监听地址跨域配置我的配置注意事项 开机自启 使用运行模型对话时的命令 查看本地已安装模型删除模型 查看ollama支持的模型 Docker Desktop简介下载安装配置开机自…

Linux驱动应用编程(四)IIC(获取BMP180温度/压力数据)

本文目录 一、基础1. 查看开发板手册&#xff0c;获取可用IIC总线2. 挂载从机&#xff0c;查看从机地址。3. 查看BMP180手册&#xff0c;使用命令读/写某寄存器值。4. 查看BMP180手册通信流程。 二、IIC常用API1. iic数据包/报2. ioctl函数 三、数据包如何被处理四、代码编写流…

(2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干

Vision-LSTM: xLSTM as Generic Vision Backbone 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2 方法 3 实验 3.1 分类设计 4 结论 0. 摘要 Transformer 被广泛用作计算…

FM148R,FM147A和利时卡件

FM148R,FM147A和利时卡件。软件组成及各部分功能软件组成---各组件功能注意事项&#xff1a;仿真功能&#xff1a;仿真系统可以用于在单机上对组态完成的工程内容进行模拟运行。FM148R,FM147A和利时卡件。便于对这些组态内容的正确性和合理性进行初步调试。二、FM148R,FM147A和…