JavaSE基础 (认识String类)

news2024/9/22 11:38:49

一,什么是String类

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提 供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字 符串应用又非常广泛,因此Java语言专门提供了String类

二,常用方法

2.1字符串构造方法

既然了解了String类,我们如何初始化它呢。

我们有三种常见方法,

第一种是直接引用

String name = "小明";

第二种是创建新对象,引用对象

String name1 = new String("小华");

第三种是用字符数组转换

        char[] str = new char[]{'1','2','3','4'};
        String name2 = new String(str);

我们来打印一下

都能正常输出。

我们说过String是引用类型,那么在内存是怎么划分的呢

我们的name在堆上会指向我们在栈上创建的新对象,都是对我们的对象进行操作的。

在java中我们引用起来的也是引用类型,我们来证明下。

        int sz = "12345".length();
        System.out.println(sz);

我们能对这个字符串.出我们length();方法,说明“12345”也是一个引用类型。

2.2String对象的比较

我们在java中肯定会涉及到字符串的比较的,那我们该如何去做呢,

第一个就是直接用==进行比较

什么?我们能直接去比吗,是的,我们在java中对于基础数据类型可以直接用==比较他们的值。

而对于引用类型我们比的是他们的地址,我们来测试一下

        String student1 = new String( "小明");
        String student2 = new String( "小明");
        System.out.println(student1 == student2);

我们看到我们创建了两个对象,他们字符串的内容都是小明,那么他们会输出相等的true吗

答案是不一样的,那我们只能去比较字符串的地址,怎么才能去比较具体的内容呢,我们string类型提供了我们equals方法。

boolean equals(Object anObject)方法:按照字典序比较

System.out.println(student1.equals(student2));

        

我们看到答案是相同,String类重写了我们的equals方法,让他每一个字符串按照词典顺序去比较,那我们如何忽略大小写去比呢,就像我们在网页登录时验证码是忽略大小写的,

    public static void main(String[] args) {
        String student1 = new String( "Hello");
        String student2 = new String( "hello");
        System.out.println(student1 == student2);
        System.out.println(student1.equals(student2));
    }

我们看到用这个方法是做不到的,

System.out.println(student1.equalsIgnoreCase(student2));

我们使用这个方法,就能忽略大小写对字符串的影响。

我们还可以不返回true和flase,我们可以根据字符串比较字母的差值,返回对应的数字,我们用

compareto方法来实现,

    public static void main(String[] args) {
        String a = new String("abc");
        String b = new String("abd");
        System.out.println(a.compareTo(b));
    }

我们看到返回值为负一,第一个字符串小于第二个字符串。

同样我们也可以用compareto来忽略字符串大小写的比较。

public static void main(String[] args) {
        String a = new String("abc");
        String b = new String("abC");
        System.out.println(a.compareTo(b));
        System.out.println(a.compareToIgnoreCase(b));
    }

我们看到,第二种方法是已经忽略了字符串大小写了的,第一种没有忽略,差值正好是32。

2.3字符串查找

char charAt(int index),第一个方法,可以返回字符串具体下标的值,不能返回越界的下标值。

我们来举例子

        String arr = new String("Hello");
        char s = arr.charAt(0);
        System.out.println(s);

我们来访问arr字符串的零下标。

成功访问到了。

        String arr = new String("Hello");
        for (int i = 0; i < arr.length(); i++) {
            char s1 = arr.charAt(i);
            System.out.print(s1);
        }

我们还可以一个一个访问通循环打出我们的字符串。

int indexOf(int ch),int indexOf(int ch, int fromIndex)我们可以通过index函数来找我们想要的字符或者字符串第一次出现的位置,fromlndex我们指定开始寻找的位置,我们来举个例子

        String name = new String("Hello World");
        System.out.println(name.indexOf('o'));
        System.out.println(name.indexOf('o',5));
        System.out.println(name.indexOf("ll"));
        System.out.println(name.indexOf("ll",5));

我们可以看到,我们找o出现的位置5下标之后o出现的位置,ll出现的位置,5之后ll出现的位置

运行结果非常明显,第一次o出现在4下标,5之后是7下标,ll出现在2下标5之后ll并没有出现返回负一。

int lastIndexOf(int ch),我们不光有从前往后找,还有从前往后找,用法和IndexOf()用法一样。

        String name = new String("Hello World");
        System.out.println(name.lastIndexOf('o'));
        System.out.println(name.lastIndexOf('o',5));
        System.out.println(name.lastIndexOf("ll"));
        System.out.println(name.lastIndexOf("ll",5));

结果就完全不一样了。

2.4转化

我们在数值和字符串之间也可以发生转换,比如,我们可以把整数,小数,布尔类,甚至一个对象都转化成字符串,我们使用valueOf

我们来尝试下

    public static void main(String[] args) {
        int a = 1234;
        double b = 12.34;
        boolean c = true;
        System.out.println(String.valueOf(a));
        System.out.println(String.valueOf(b));
        System.out.println(String.valueOf(c));
        System.out.println(String.valueOf(new Student("小明",18)));
    }

还有我们的类

public class Student {
    public String name;
    public int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String toString(){
        return name + age;
    }
}

我们试着把这4种类型转化为字符串我们看看是否能成功

我们看到了虽然是输出了,但是这到底是不是字符串呢,我们加一下试试就知道了。

    System.out.println(String.valueOf(a)+11);

加上11.我们看看能不能出结果

哎我,这是什么答案呢,没有相加,它实际上变成了一个新的字符串,哇,那么我们java的字符串就可以直接相加了吗,可以但不推荐,为啥呢,因为太慢了,这个过程看似很短,但是它设计了很多创建对象的过程,并不是,直接使用一个对象进行操作,所以效率很低下我们后面再讨论怎么解决这个情况

我们把这4种类型转化成了字符串,那么怎么把它从字符串转化回来呢,

我们可以用包装类

        int a = Integer.parseInt("1234");
        double b = Double.parseDouble("12.34");
        boolean c = Boolean.parseBoolean("false");
        System.out.println(a+11);
        System.out.println(b);
        System.out.println(c);

我们看到结果确实为数字我们可以进行加减

之前提到了字符数组可以转化为字符串,而字符串也可以转化为字符数组

我们来进行演示

    public static void main(String[] args) {
        String s = new String("Hello World");
        char[] str = s.toCharArray();
        for (int i = 0; i < str.length; i++) {
            System.out.print(str[i]);
        }
    }

成功转化

在java中依旧保留了c语言格式化输出的特点

比如%d

    public static void main(String[] args) {
        String s = String.format("%d-%d %d",1,2,3);
        System.out.println(s);
    }

我们这样就完成了。

2.字符串替换

我们使用replaceall,repleaceafist, replace,进行字符串指定字符,或者单个字符的替换。

        String s = new String("Hollow Horld");
        System.out.println(s.replace('H','W'));
        System.out.println(s.replaceAll("o","w"));
        System.out.println(s.replaceFirst("o","ss"));
    }

+First是代表替换第一次的,ALL为全部替换,很灵活的函数

2.6字符串拆分

我们还可以进行字符串的拆分,通常用到网页网址上的拆分,我们继续来举例子:

        String web = new String("student&0x123456");
        String[] Strings = web.split("&");
        for (int i = 0; i < Strings.length; i++) {
            System.out.println(Strings[i]);
        }

我们使用splist函数进行划分,传入&表示我我们要对&左右的进行操作,它会把字符串拷贝为两份,而不是将之前的字符串一分为二,我们将字符串放到数组即可遍历,同样我们也可以遍历多个字符串,并且特殊的是,我们在拆分.,+,|,*时都有使用转义字符//进行声明,如果是/字符我们要写成。

2.7字符串截取

我们使用substring()进行字符串截取。

        String name = new String("123425516");
        String s = name.substring(7);
        System.out.println(s);

我们来看结果

从第7个位置截取到最后

2.8其他操作方法

我们还有很多很多的字符串操作方法,toUpperCase, toLowerCase,tim()等等·这里就不一一列举了

字符串时不可变的,里面的内容无法修改,我们之前在距离的时候都是再创建一个字符串,所以我们使用StringBulider和StringBuffer进行字符串的修改这里面不仅保留了字符串的功能还有很多的扩展功能这里就不一一列举了。我们下篇文章来讲

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

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

相关文章

vue中scoped详解以及样式穿透>>>、/deep/、::v-deep

1、scoped scoped属性用于限制样式仅应用于当前组件。当一个style标签拥有scoped属性时&#xff0c;它的CSS样式就只能作用于当前的组件&#xff0c;通过该属性&#xff0c;可以使得组件之间的样式不互相污染。 原理&#xff1a;当样式中加了scoped属性时候&#xff0c;编译的…

解决 Python 中 AttributeError: module ‘typing‘ has no attribute ‘_ClassVar‘

启动 Flask 的时候遇到&#xff1a; AttributeError: module typing has no attribute _ClassVar 卸载 dataclasses pip uninstall dataclasses 启动 Flask 正常

jenkins pipeline 发布 jar并运行

废话不多说&#xff0c;上教程 一&#xff0c;配置publish ssh 二&#xff0c;配置 ssh server 记住Name 三 设置发布选项 1 设置模块多选&#xff08;请安装多选插件&#xff1a;Active Choices Plug-in&#xff09; ​ ​ 四 编写pipeline 说明&#xff1a; 1 module…

vue项目实战 vueCropper 仿微信头像任意区域截取图片,上传到腾讯云保存

在package.json中添加 "vue-cropperjs": "4", 后在控制台执行&#xff1a;npm install ImageCropper.vue <template><div v-if"src"><!-- Vue Cropper区域 --><el-row class"cropper-wrapper" v-if"src…

stm32_按键消抖_代码与流程分析

stm32按键消抖 一 问题背景二 解决思路三 代码实现 一 问题背景 开关按钮&#xff1a;按下信号为0&#xff0c;正常信号为1 在按下时&#xff0c;表面上看我们只按了一下&#xff0c;但信号的传递并不是单纯的由1直接变为0。这是由于机械触点断开/闭合时会有抖动&#xff0c;…

北京大学:利用好不确定性,8B小模型也能超越GPT-4

大模型有一个显著的特点&#xff0c;那就是不确定性——对于特定输入&#xff0c;相同的LLM在不同解码配置下可能生成显著不同的输出。 比如问一问chatgpt“今天开心吗&#xff1f;”&#xff0c;可以得到两种不同的回答。 常用的解码策略有两种&#xff0c;一个是贪婪解码&am…

好展位,抢先订!2025浙江(玉环)机械展

2025第18届浙江&#xff08;玉环&#xff09;机械工业展览会 时间地点&#xff1a;2025年4月25-28日 玉环会展中心 近年来&#xff0c;随着玉环工业经济的蓬勃发展&#xff0c;汽摩配件、阀门水暖五金产业、铜加工、眼镜配件、金属加工生产等行业&#xff0c;如同贪婪的巨人&…

React Native初次使用遇到的问题

Write By Monkeyfly 以下内容均为原创&#xff0c;如需转载请注明出处。 前提&#xff1a;距离上次写博文已经过去了5年之久&#xff0c;诸多原因导致的&#xff0c;写一篇优质博文确实费时费力&#xff0c;中间有其他更感兴趣的事要做&#xff08;打游戏、旅游、逛街、看电影…

4.2、存储管理-页式存储

页式存储和段氏存储会考 页式存储几乎必考&#xff0c;段氏存储可能会考 页式存储 页式存储是操作系统的一种存储管理方式。 因为我们的程序往往是远远大于内存的&#xff0c;所以程序在执行的时候&#xff0c;是不会一次性把所有内容都装入到内存中&#xff0c;它会把程序分…

实验3-3 比较大小 想知道①和②的区别是什么(都错)

//实验3-3 比较大小 代码① #include<stdio.h> #include<math.h>void swap(int a, int b);// 正确声明 swap 函数int main() {int a, b, c;scanf("%d %d %d",&a,&b,&c);// 比较并交换 a 和 bif (a > b) {swap(a, b);}// 比较并交换 b 和 …

力扣刷题之3111.覆盖所有点的最少矩形数目

题干描述 给你一个二维整数数组 point &#xff0c;其中 points[i] [xi, yi] 表示二维平面内的一个点。同时给你一个整数 w 。你需要用矩形 覆盖所有 点。 每个矩形的左下角在某个点 (x1, 0) 处&#xff0c;且右上角在某个点 (x2, y2) 处&#xff0c;其中 x1 < x2 且 y2 …

关于vue开发中,高德地图有时不显示的问题

场景1&#xff1a;在弹出框中初始化地图 先设置 this.dialogVisible true; 然后再用nextTick初始化地图 this.$nextTick(() > { this.initAmap(); }); 场景2&#xff1a;点击tab页路由回退&#xff0c;导致高德地图不初始化的问题 解决方法&#xff1a; 通过$refs的方…

焦化行业超低排放改造巩固提升方案(朗观视觉)

朗观视觉小编观察发现&#xff1a;随着全球对环境保护意识的日益增强&#xff0c;焦化行业作为高污染、高排放的工业领域&#xff0c;其超低排放改造已成为行业转型升级的必然趋势。为了积极响应国家关于推进生态文明建设、打赢蓝天保卫战的号召&#xff0c;山东省生态环境厅发…

Windows + Ubuntu双系统!小白轻松安装

前言 这几天有小伙伴想着装WindowsUbuntu双系统&#xff0c;但苦于找不到办法&#xff0c;就在某篇文章后台留言&#xff1a; 这不&#xff0c;今天就更新了嘛&#xff01;虽然做不到有求必应&#xff0c;但教程帖还是可以写写的&#xff0c;能帮一个是一个&#xff01; 今天要…

深入探讨RCE漏洞及其防御策略

1. RCE漏洞 1.1. 漏洞原理 远程代码执行&#xff08;RCE&#xff09;漏洞允许攻击者远程注入并执行操作系统命令或代码&#xff0c;从而控制后台系统。 1.2. 漏洞产生条件 调用第三方组件存在代码执行漏洞。用户输入内容作为系统命令参数拼接到命令中。对用户输入的过滤不严…

关于Linux服务器端更新命令apt update没有效果问题总结(校园网认证)

这里写目录标题 项目场景&#xff1a;问题描述错误解决过程个人解决apt update和apt upgrade 项目场景&#xff1a; 在使用Django进行服务器部署的时候&#xff0c;需要使用执行命令 apt update&#xff1a; 具体场景&#xff1a; 问题描述 需要使用apt命令进行升级、下载…

[HITCON 2017]SSRFme 1

目录 代码审计 符号shell_exec() 函数:GET " . escapeshellarg($_GET["url"])&#xff1a;pathinfo($_GET["filename"]basename() 题目解析 代码审计 118.182.186.90 <?phpif (isset($_SERVER[HTTP_X_FORWARDED_FOR])) {$http_x_headers explod…

二叉树,二叉查找树,平衡二叉树

一.绪论: 二.数据结构(二叉树): 1.简介: 1)每一个节点&#xff08;也叫结点&#xff09;都是一个独立的对象-->当中不仅要存数据值&#xff0c;还要存父节点地址值&#xff0c;左子节点地址值&#xff0c;右子 节点地址值 2)没有父节点或者子节点的节点就记为null 2.遍历方…

【Bug记录】模板生成错误:不属于vector的成员

项目场景&#xff1a; 在调用自己写的一个简化版优先级队列时候报语法错误&#xff1a;模板生成错误 问题描述 模板生成错误&#xff0c;如下图 原因分析&#xff1a; 问题的分析&#xff1a;刚开始怀疑写模板写错了&#xff0c;之后看错误列表发现是top函数不属于vector。…

<数据集>棉花识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13765张 标注数量(xml文件个数)&#xff1a;13765 标注数量(txt文件个数)&#xff1a;13765 标注类别数&#xff1a;4 标注类别名称&#xff1a;[Partially opened, Fully opened boll, Defected boll, Flower] 序…