重学java 30.API 1.String字符串

news2024/11/15 18:02:25

于是,虚度的光阴换来了模糊 

                                       —— 24.5.8

一、String基础知识以及创建

1.String介绍

1.概述

        String类代表字符串

2.特点

        a.Java程序中的所有字符串字面值(如“abc”)都作为此类的实例(对象)实现

                凡是带双引号的,都是String的对象

                String s = "abc"

                "abc"就是对象,String就是对象的数据类型,s就是对象名

        b.字符串是常量,它们的值在创建之后不能更改

                String s ="he11o"

                S += "world" —> 会产生新对象

        c.String 对象是不可变的,所以可以共享

                String s1 = "abc"

                String s2 = "abc"

package S57String;

public class Demo161String1 {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";
        System.out.println(s1==s2); // 比较地址值 true
    }
}

2.String的实现原理

1.jdk8的时候:String底层是一个被final修饰的char数组-> private final char[] value;

2.jdk9开始到之后:底层是一个被final修饰的byte数组-> private final byte[] value;
        一个char类型占2个字节
        一个byte类型占1个字节 —> 省内存空间
字将串定义完之后,数组就创建好了,被final一修饰,数组的地址值直接定死

3.String的创建

1.String() —> 利用string的无参构造创建string对象
2.String(string original) —> 根据字符串创建string对象

3.String(char[] value) —> 根据char数组创建string对象

4.String(byte[] bytes) —> 通过使用平台的默认字符解码指定的 byte 数组,构造一个新的 string对象

        a、平台:操作系统

        b、操作系统默认字符集:GBK

                GBK:一个中文占2个字节

                UTF-8:一个中文占3个字节

                而且,中文对应的字节一般都是负数

                代码在idea中写的,idea启动的时候,会自动加一个启动参数,此启动参数为UTF-8
                -Dfile.encoding

5.简化形式:String 变量名 =" ”

package S57String;

public class Demo162String2Create {
    public static void main(String[] args) {
//        1.String() —> 利用string的无参构造创建string对象
        String s1 = new String();
        System.out.println("s1="+s1);
//        2.String(string original) —> 根据字符串创建string对象
        String s2 = new String("abc");
        System.out.println("s2="+s2);
//        3.String(char[] value) —> 根据char数组创建string对象
        char[] chars = {'a','b','c'};
        String s3 = new String(chars);
        System.out.println("s3="+s3);
//        4.String(byte[] bytes) —> 通过使用平台的默认字符解码指定的 byte 数组,构造一个新的 string对象
        byte[] bytes1 = {97,98,99};
        String s4 = new String(bytes1);
        System.out.println("s4="+s4);
//        三个负数代表中文,在ASCII表中找不到,所以无法正常显示
        byte[] bytes2 = {-97,-98,-99};
        String s5 = new String(bytes2);
        System.out.println("s5="+s5);

        byte[] bytes3 = {-28,-67,-96};
        String s6 = new String(bytes3);
        System.out.println("s6="+s6);
//        5.简化形式:String 变量名 =" ”
        String s7 = "abc";
        System.out.println("s7="+s7);
    }
}

1.string(char[] value,int offset,int count) —> 将char数组的一部分转成string对象

        value:要转String的char数组

        offset:从数组的哪个索引开始转
        count:转多少个
2.string(byte[]bytes,int offset,int length) —> 将byte数组的一部分转成String对象

        bytes:要转String的byte数组

        offset:从数组的哪个索引开始转

        length:转多少个

    public static void main(String[] args) {
        /*
        1.string(char[] value,int offset,int count) —> 将char数组的一部分转成string对象
            alue:要转String的char数组
            offset:从数组的哪个索引开始转
            count:转多少个
         */
         char[] chars = {'a','b','c','d','e','f'};
         String s1 = new String(chars,1,5);
         // 从索引1开始转5个
         System.out.println("s1="+s1);
        /*
        2.string(byte[]bytes,int offset,int length) —> 将byte数组的一部分转成String对象
            bytes:要转String的byte数组
            offset:从数组的哪个索引开始转
            length:转多少个
         */
        byte[] bytes = {97,98,99,100,101};
        String s2 = new String(bytes,0,4);
        System.out.println(s2);
    }

笔试题

题1

s1与s2地址值一样,s3内容是s1共享过来,但是s3是new出来的,会自己创造新的空间,所以会有新的空间

问1:Strings=new String("abc")共有几个对象?

        2个,一个new本身,一个是"abc”

问2:Strings= new String("abc")共创建了几个对象?

        1个或者2个,就看abc有没有提前创建出来了

        如果之前没有提前创建abc,那么就会创建2个,先创建abc,再new
        如果之前提前创建了abc了,那么String s = new String("abc"),就只创建了一个,因为abc不用单独再创建了,直接共享过来即可
                String s1 = "abc"
                String s2 = new String("abc")

题2

总结

1.字符串拼接,如果等号右边是字符串字面值拼接,不会产生新对象

2.字符串拼接,如果等号右边有变量参数拼接,产生新字符串对象

二、String常用方法

1.判断方法

        boolean equals(String s) —> 比较字符串内容
        boolean equalsIgnoreCase(String s) —> 比较字符串内容,忽略大小写

示例

    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = new String("abc");
        String s3 = "Abc";
        System.out.println(s1==s2); // 比较地址值 false
        System.out.println(s1.equals(s2));// 比较内容 true
        System.out.println(s3.equals(s1));// 比较内容 不忽略大小写 false
        System.out.println(s3.equalsIgnoreCase(s1));// 比较内容 忽略大小写 true
    }

练习

已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录成功与否,给出相应的提示步骤:
        ①先定义两个字符串,表示注册过的用户名和密码
        ②创建scanner对象,键盘录入用户名和密码
        ③比较,如果输入的用户名和密码跟已经注册过的用户名和密码内容一样,就登录成功,否则就登录失败

    public static void main(String[] args) {
//            ① 先定义两个字符串,表示注册过的用户名和密码
        String username = "root";
        String password = "954926928";
//            ② 创建scanner对象,键盘录入用户名和密码
        for (int i = 0; i < 3; i++) {
            Scanner sc = new Scanner(System.in);
            System.out.println("请您输入用户名");
            String ans = sc.next();
//            ③ 比较,如果输入的用户名和密码跟已经注册过的用户名和密码内容一样,就登录成功,否则就登录失败
            if (ans.equals(username)) {
                System.out.println("请您输入用户密码");
                String que = sc.next();
                if (que.equals(password)) {
                    System.out.println("登陆成功!");
                    break;
                } else {
                    System.out.println("密码错误,请重新登录");
                }
            } else {
                System.out.println("没有找到用户,请先注册账户");
            }
        }
    }

确定的值.equals,这样可以防止空指针

Objects中的equals方法,自带防止空指针

        即使是两个指针都为null,也会判断成一样的

2.获取功能

         int length()->获取字符串长度

        String concat(Strings)->字符串拼接,返回新串儿

         char charAt(int index)-> 根据索引获取对应的字符

         int indexof(string s)->获取指定字符串在大字符串中第一次出现的索引位置

         String substring(int beginIndex)->截取字符串,从指定索引开始截取到最后,返回新串儿

         String substring(int beginIndex,int endIndex)->截取字符串,从beginIndex开始到endIndex结束,含头不含尾,返回新串儿

示例

    public static void main(String[] args) {
       // ① int length()->获取字符串长度
        System.out.println("一切都会好的".length());

        // ② String concat(Strings)->字符串拼接,返回新串儿
        String S1 = "一切都会好的";
        String S2 = "我一直相信";
        System.out.println(S1.concat(S2));

        // ③ char charAt(int index)-> 根据索引获取对应的字符
        System.out.println(S1.charAt(4));

        // ④ int indexof(string s)->获取指定字符串在大字符串中第一次出现的索引位置
        System.out.println(S1.concat(S2).indexOf("信"));

        // ⑤ String substring(int beginIndex)->截取字符串,从指定索引开始截取到最后,返回新串儿
        System.out.println(S1.concat(S2).substring(2));

        // ⑥ String substring(int beginIndex,int endIndex)->截取字符串,从beginIndex开始到endIndex结束,含头不含尾(括号左开右闭),返回新串儿
        System.out.println(S1.concat(S2).substring(3,6));

        System.out.println("——————————————————————————————————————");
        for (int i = 0; i < S1.concat(S2).length(); i++) {
            System.out.println(S1.concat(S2).charAt(i));
        }
    }

3.转换功能

        1.char[] tocharArray() —> 将字符串转成char数组
        2.byte[] getBytes() —> 将字符串转成byte数组
        3.String replace(CharSequence c1,CharSequence c2) —> 替换字符
                                  CharSequence —> String的接口
        4.byte[] getBytes(String charsetName) —> 按照指定的编码将字符串转成byte数组

示例:

    public static void main(String[] args) throws UnsupportedEncodingException {
        // 1.char[] tocharArray() —> 将字符串转成char数组
        String s = "abcdef";
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            System.out.println(chars[i]);
        }

        System.out.println("————————————————————");

        // 2.byte[] getBytes() —> 将字符串转成byte数组
        byte[] bytes = s.getBytes();
        for (int i = 0; i < bytes.length; i++) {
            System.out.println(bytes[i]);
        }

        System.out.println("————————————————————");

        // 3.String replace(CharSequence c1,CharSequence c2) —> 替换字符 CharSequence —> String的接口
        System.out.println(s.replace("a","z"));
        System.out.println("————————————————————");

        // 4.byte[] getBytes(String charsetName) —> 按照指定的编码将字符串转成byte数组
        byte[] bytes1 = "一切都会好的".getBytes("utf-8");
        for (int i = 0; i < bytes1.length; i++) {
            System.out.println(bytes1[i]);
        }
    }

练习

键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)

        步骤:
                1.创建scanner对象,键盘录入
                2.定义三个变量,用来统计
                3.调用next方法录入一个字符串,遍历字符串,将每一个字符拿出来
                4.统计大写字母        

                        A-Z -> 65-90 
                        比如:B -> 66 -> 在65-90之间,证明就是大写字母
                5.统计小写字母
                        a-z -> 97-122
                        比如:b->98->在97-122之间,证明就是小写字母

                6.统计数字:

                        0-9 -> 48-57
                        比如:字符1->49->在48-57之间,证明就是数字

                7.将统计结果打印出来

package S57String;

import java.util.Scanner;

public class Demo168String8Practice {
    public static void main(String[] args) {
//        1.创建scanner对象,键盘录入
        Scanner sc = new Scanner(System.in);
//        2.定义三个变量,用来统计
        int big = 0;
        int small = 0;
        int number = 0;
//        3.调用next方法录入一个字符串,遍历字符串,将每一个字符拿出来
        String data = sc.next();
        char[] chars = data.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            char num = chars[i];

//        4.统计大写字母
//        A-Z -> 65-90
//        比如:B->66->在65-90之间,证明就是大写字母
            if (num >= 'A' && num <= 'Z') {
                big++;
            }
//        5.统计小写字母
//        a-z-> 97-122
//        比如:b->98->在97-122之间,证明就是小写字母
            if (num >= 'a' && num <= 'z') {
                small++;
            }
//        6.统计数字:
//        0-9 -> 48-57
//        比如:字符1T>49 ->在48-57之间,证明就是数字
            if (num >= '0' && num <= '9') {
                number++;
            }
        }
//        7.将统计结果打印出来
            System.out.println("大写有:"+big);
            System.out.println("小写有:"+small);
            System.out.println("数字有:"+number);
    }
}

4.分割功能

1.String[] split(String regex) —> 按照指定的规则分割字符串

注意:regex写的是正则表达式->,在正则表达式中代表任意一个字符

示例:

public class Demo169String9Cut {
    public static void main(String[] args) {
        String s = "abc,txt";
        // 按照逗号进行分割
        String[] split = s.split(",");
        for (int i = 0; i < split.length; i++) {
            System.out.println(split[i]);
        }
    }

按照.切割切不出来,需要用\\转义

5.其他功能

1.boolean contains(string s) —> 判断老串儿中是否包含指定的串儿

2.boolean endsWith(string s) —> 判断老串儿是否以指定的串儿结尾

3.boolean startsWith(string s) —> 判断老串儿是否以指定的串儿开头

4.string toLowerCase() —> 将字母转成小写

5.string toUpperCase() —> 将字母转成大写

6.string trim() —> 去掉字符串两端空格

示例:


public static void main(String[] args) {
    String s = "abcdefg";
//        1.boolean contains(string s) —> 判断老串儿中是否包含指定的串儿
    System.out.println(s.contains("def"));
//        2.boolean endsWith(string s) —> 判断老串儿是否以指定的串儿结尾
    System.out.println(s.endsWith("fg"));
//        3.boolean startsWith(string s) —> 判断老串儿是否以指定的串儿开头
    System.out.println(s.startsWith("abcd"));
//        4.string toLowerCase() —> 将字母转成小写
    System.out.println(s.toLowerCase());
//        5.string toUpperCase() —> 将字母转成大写
    System.out.println(s.toLowerCase().toUpperCase());
//        6.string trim() —> 去掉字符串两端空格,去不掉中间空格
        s = " 一切都会好的 ";
    System.out.println(s.trim());
//        7.去掉所有空格 replace将空格进行替换
    System.out.println("一起都会好的 我一直相信".replace(" ",""));
}

三、总结

1.概述

        代表的是字符串

2.特点

        a.凡是带双引号的,都是String的对象
        b.字符串是常量,他们的值在创建之后不能被更改
        c.srring对象是不可变的,所以可以共享

3.创建

        a.String0
        b.String(String s)
        c.sring(char[] chars)
        d.string(bytell bytes)

        e.string(char0] chars,int offset,int count)
                chars代表被转的数组
                ofset代表从数组的哪个索引开始转
                count代表转多少个

        f.String(bytel] bytes,int offset,int count)
                bytes代表被转的数组
                offset代表从数组的哪个素引开始转

                count代表转多少个

4.方法

        a.判断方法

                ① boolean equals(Object obj) -- 判断字符串内容是否一样

                ② boolean equalslgnoreCase(Strings) -- 判断字符串内容是否一样,忽略大小写

        b.获取方法

                ① int length() -- 获取字符串长度
                ② Slring concal(slring s)-- 拼接字符串,返回新串
                ③ char charAt(int index)-- 根据索引获取对应的字符
                ④ int indexOfstrings) -- 获取指定字符在字符串中第一次出现的素引位置
                ⑤ String subString(int beginIndex) -- 从beginIndex开始截取字符串到最后
                ⑥ String substring(int beginindex,int endindex) -- 从beginIndex到endIndex截取字符串,含头不含尾

        c.转换方法

                ① char[] toCharArray() -- 将字符串转成char数组

                ② byte[] getBytes0 -- 将字符串转成byte数组
                ③ bytell getBytes(Sting charsetName) -- 按照指定的编码规则将字符串转成byte数组

                ④ String replace(c1,c2) -- 将c1替换成c2

        d.分割方法

                ① String[] split(string regex) -- 按照指定规则分割字符串

        e.其他方法

                ① boolean contains(String s) -- 判断字符串是否包含指定的字符串内容
                ② boolean endsWith(string s) -- 判断字符串是否以指定的串儿结尾

                ③ boolean startsWith(String s) -- 判断字符串是否以指定的串儿开头
                ④ String toLowerCase() -- 将字母转成小写
                ⑤ String toUpperCase() -- 将字母转成大写
                ⑥ String trim() -- 去掉字符串两端空格

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

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

相关文章

Linux基础服务NFS入门篇

文章目录 Linux基础服务NFS入门篇0.前言1.NFS1.1NFS简介1.2NFS配置 Linux基础服务NFS入门篇 0.前言 本文根据大佬们的资料整理了NFS的基础知识&#xff0c; 加深对linux运维基础服务工具的理解&#xff0c;以便个人查询复习使用。 1.NFS 资料来自B站阿铭linux的印象笔记&#…

基于Springboot的校园疫情防控系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园疫情防控系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

17 空闲空间管理

目录 假设 底层机制 分割与合并 追踪已分配空间的大小 嵌入空闲列表 让堆增长 基本策略 最优匹配 首次匹配 下次匹配 其他方式 分离空闲列表 伙伴系统 小结 分页是将内存成大小相等的内存块&#xff0c;这样的机制下面&#xff0c;很容易去管理这些内存&#xff0c…

内外网文件传输摆渡工具大全|企业跨网文件交换解决方案

有许多文件传输工具可以用于内外网之间的安全文件传输。以下是一些常用的文件传输工具&#xff1a; 1、FileLink FileLink跨网文件传输系统提供一系列功能&#xff0c;包括文件传输审批、审计、敏感文件检查以及文件操作管控等。这些功能旨在确保文件传输的安全性和合规性&am…

Relaxed MemoryConsistency

SC和TSO都被称之为强&#xff08;strong&#xff09;保序模型&#xff1b; because the global memory order of each model usually respects (preserves) per-thread program order&#xff1b;回想一下&#xff0c;对于load和store的所有四种组合&#xff08;Load -> Lo…

python-dict序列化的数据为啥前后不一致

前情提要及背景:流式数据的二次处理终结篇-CSDN博客 假如直接将dict进行str,那么编码数据都是一致的,但是在postman上就表现不那么好看,如下: 而之前的显示如下: 其中的差别就是单引号与双引号的差别了。 采用如下方案无疑是最笨的方法了: 在Python中,如果你想将处理…

CMakeLists.txt语法规则:数学运算 math

一. 简介 前面几篇文章学习了 CMakeLists.txt语法中的一些常用变量&#xff0c;常用命令&#xff0c;双引号的作用。条件判断语句&#xff0c;循环语句等等。 本文简单学习一下 CMakeLists.txt语法中数学运算 match。 二. CMakeLists.txt语法规则&#xff1a;数学运算 math 在…

倍思|西圣开放式耳机哪个好用?热门机型深度测评!

在数字化生活的浪潮中&#xff0c;耳机已成为我们不可或缺的伴侣。然而&#xff0c;长时间佩戴传统的耳机容易导致的耳道疼痛等问题&#xff0c;严重的话将影响听力。许多人开始寻找更为舒适的佩戴体验。开放式耳机因为不需要需直接插入耳道的设计&#xff0c;逐渐受到大众的青…

创新指南|共创B2B独立站出海“效果”护城河

B2B 共同创造是一种通过在整个创新过程中紧密迭代来与最重要的客户共同创造新业务价值的强大方式。我们的方法是将设计思维、精益创业和商业模式创新的方法与面向客户的特定格式相结合&#xff0c;以激励参与者&#xff0c;同时融入用户、业务和技术合作伙伴-买家视角的关键价值…

LLMs:《Better Faster Large Language Models via Multi-token Prediction》翻译与解读

LLMs&#xff1a;《Better & Faster Large Language Models via Multi-token Prediction》翻译与解读 目录 《Better & Faster Large Language Models via Multi-token Prediction》翻译与解读 Abstract 2、Method方法 Memory-efficient implementation 高效内存实…

鸿蒙OpenHarmony开发板【快速入门】大合集

快速入门 快速入门概述 基于IDE入门 搭建开发环境 搭建Windows环境搭建Ubuntu环境配置远程访问环境创建工程并获取源码 轻量系统&#xff08;基于Hi3861开发板&#xff09; 编写“Hello World”程序编译烧录运行 小型系统&#xff08;基于Hi3516开发板&#xff09; 编写“Hell…

照片生成ai漫改头像生成漫画全套教程免费(自取)

今天给大家分享一一个AI漫改头像&#xff0c;轻松日增1000&#xff0c;简单操作好上手的一个互联网新项目&#xff0c;哈那其实AI漫改头像也火了差不多有半年左右了&#xff0c; 那其实利用AI软件将真人的照片生成漫画的形象&#xff0c;这个看起来很简单的方法却在小红书上大…

【全开源】Java同城信息付费系统家政服务房屋租赁房屋买卖房屋装修信息发布平台小程序APP公众号源码

同城信息付费小程序是一个集合了本地信息服务的平台&#xff0c;用户可以通过该平台获取各种同城信息&#xff0c;并支付相应的费用以享受特定服务。 信息分类与展示&#xff1a;小程序会根据不同的服务类型对信息进行分类&#xff0c;如家政服务、二手交易、房屋租赁、求职招…

node.js 下载安装 配置环境变量

1 官网下载 需要的版本https://nodejs.org/dist 下载 .msi的文件 2 根据安装向导&#xff0c;安装 3 检查安装 是否成功&#xff0c;winr 输入cmd&#xff0c;输入node --version 回车&#xff0c;查看版本 4 配置换进变量 node路径是 安装时 的安装路径 5 vscode 启动项目…

HTTP/1.1、HTTP/2、HTTP/3 的演变

HTTP/1.1、HTTP/2、HTTP/3 的演变 HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f;HTTP/2 做了什么优化&#xff1f;HTTP/3 做了哪些优化&#xff1f; HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接的…

【数据结构】详解栈

今天我们主要来了解栈&#xff01;如果对知识点有模糊&#xff0c;可翻阅以往文章哦&#xff01; 个人主页&#xff1a;小八哥向前冲~-CSDN博客 所属专栏&#xff1a;数据结构【c语言版】_小八哥向前冲~的博客-CSDN博客 c语言专栏&#xff1a;c语言_小八哥向前冲~的博客-CSDN博…

【ARM】ARM寄存器和异常处理

目录 1.指令的执行过程 2. ARM处理器概述 3.ARM指令集 4.ARM存储模型 5. ARM工作模式 6.ARM寄存器组织 &#xff08;1&#xff09;寄存器 &#xff08;2&#xff09; ARM寄存器 &#xff08;3&#xff09;CPSR寄存器​​​​​​​ 7. ARM异常处理 &#xff08;1&am…

26 | 备库为什么会延迟好几个小时?

在官方的 5.6 版本之前,MySQL 只支持单线程复制,由此在主库并发高、TPS 高时就会出现严重的主备延迟问题。 coordinator 就是原来的 sql_thread, 不过现在它不再直接更新数据了,只负责读取中转日志和分发事务。真正更新日志的,变成了 worker 线程。而 work 线程的个数,就是…

IDEA远程连接Docker服务

1.确保你的服务器已经安装docker docker安装步骤可查看&#xff1a;CentOS 9 (stream) 安装 Docker 2.安装完docker后开启远程连接 默认配置下&#xff0c;Docker daemon只能响应来自本地Host的客户端请求。如果要允许远程客户端请求&#xff0c;需要在配置文件中打开TCP监听…

CCF-Csp算法能力认证,202206-1归一化处理(C++)含解析

前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码&#xff1a;6vdq”复制这段内容后打开手机迅雷…