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

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

                                       —— 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); // 比较地址值 falseSystem.out.println(s1.equals(s2));// 比较内容 trueSystem.out.println(s3.equals(s1));// 比较内容 不忽略大小写 falseSystem.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]);}}

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

其他功能

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(" ",""));
}

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

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

相关文章

在家中访问一个网站的思考

在家中访问一个网站的思考 1、家庭网络简介2、家庭WLAN DHCP2.1、家庭路由器PPPOE拨号2.2、DHCP&#xff08;动态主机配置协议&#xff09;2.3、接入家庭网的主机IP地址2.4、家庭总线型以太网2.5、Mac地址2.6、ARP协议2.7、IP协议 & UDP/TCP协议2.8、NAT&#xff08;Netwo…

【一起深度学习吧!!!!!】24/05/03

卷积层里的多输入输出通道 1、 多输入通道&#xff1a;代码演示&#xff1a; 多输出通道&#xff1a;代码实现&#xff1a; 1、 多输入通道&#xff1a; 当输入包含多个通道时&#xff0c;需要构造一个输入通道与之相等的卷积核&#xff0c;以便进行数据互相关计算。 例如李沐…

Ubuntu24.04安装中文输入法

Ubuntu24.04安装中文输入法 为了更好的体验&#xff0c;请访问个人博客 www.huerpu.cc:7000 一、添加中文语言支持 在安装中文输入法之前&#xff0c;首选要添加中文语言支持。选择System&#xff0c;点击Region & Language。 点击Manage Install Languages。 点击Insta…

repo跟git的关系

关于repo 大都讲的太复杂了,大多是从定义角度跟命令角度去讲解,其实从现实项目使用角度而言repo很好理解. 我们都知道git是用来管理项目的,多人开发过程中git功能很好用.现在我们知道一个项目会用一个git仓库去管理,项目的开发过程中会使用git创建分支之类的来更好的维护项目代…

css 文字描边

又是抄样式的一天。这次是百度地图。实现了问题和图形描边的效果。 代码&#xff1a; .BMap_scaleTxt.dark {color: #fff;text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000, 1px 1px 0 #000; } 效果&#xff1a;

安装numpy遇到的问题

安装numpy的时候提示无法安装如下&#xff1a; (venv) E:\works\AI\venv\Scripts>pip install numpy pandas matplotlib jupyter -i https://pypi.douban.com/simple Looking in indexes: https://pypi.douban.com/simple WARNING: Retrying (Retry(total4, connectNone, r…

分析师常用商业分析模型

一、背景 在用户调研中&#xff0c;我们发现分析师对商业分析模型的使用还是比较频繁。本文主要对用户调研结果中的分析师常用商业分析模型以及一些业界经典的商业分析模型进行分析&#xff0c;并梳理出执行落地流程&#xff0c;以此来指导分析师工具设计分析功能的引导性。 …

软件测试--接口测试

接口测试&#xff1a;直接对后端服务的测试&#xff0c;是服务端性能测试的基础 接口&#xff1a;系统之间数据交互的通道 接口测试&#xff1a;校验接口响应数据与预期数据是否一致

【JavaEE初阶系列】——Servlet运行原理以及Servlet API详解

目录 &#x1f6a9;Servlet运行原理 &#x1f6a9;Servlet API 详解 &#x1f393;HttpServlet核心方法 &#x1f393;HttpServletRequest核心方法 &#x1f388;核心方法的使用 &#x1f534;获取请求中的参数 &#x1f4bb;query string &#x1f4bb;直接通过form表…

回归分析的理解

1.是什么&#xff1a; 2.回归问题的求解&#xff1a; 首先是根据之前的数据确定变量和因变量的关系根据关系去预测目标数据根据结果做出判断 2.1如何找到关系&#xff1f; y’是根据模型生成的预测结果&#xff1a; y’axb&#xff0c;而我们的目的是y’和y(正确的结果)之间…

构造照亮世界——快速沃尔什变换 (FWT)

博客园 我的博客 快速沃尔什变换解决的卷积问题 快速沃尔什变换&#xff08;FWT&#xff09;是解决这样一类卷积问题&#xff1a; ci∑ij⊙kajbkc_i\sum_{ij\odot k}a_jb_k ci​ij⊙k∑​aj​bk​其中&#xff0c;⊙\odot⊙ 是位运算的一种。举个例子&#xff0c;给定数列 a,…

二叉搜索树相关

二叉搜索树 定义&#xff1a;对二叉搜索树的一些操作基本结构Insert操作Find操作Erase操作 InOrder遍历二叉树操作模拟字典模拟统计次数 定义&#xff1a; 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树:若它的左子树不为空&a…

品鉴中的艺术表达:如何将红酒与绘画、雕塑等艺术形式相结合

品鉴雷盛红酒不仅是一种味觉的享受&#xff0c;更是一种艺术的体验。将雷盛红酒与绘画、雕塑等艺术形式相结合&#xff0c;能够创造出与众不同的审美体验&#xff0c;进一步丰富品鉴的内涵。 首先&#xff0c;绘画作为视觉艺术的一种表现形式&#xff0c;能够通过色彩和构图来传…

Linux:进程等待 进程替换

Linux&#xff1a;进程等待 & 进程替换 进程等待wait接口statuswaitpid接口 进程替换exec系列接口 当一个进程死亡后&#xff0c;会变成僵尸进程&#xff0c;此时进程的PCB被保留&#xff0c;等待父进程将该PCB回收。那么父进程要如何回收这个僵尸进程的PCB呢&#xff1f;父…

47.Redis学习笔记

小林coding -> 图解redis的学习笔记 文章目录 Rediswindwos安装docker安装redis启动redis使用RDM访问虚拟机中的redispython连接redis缓存穿透、击穿、雪崩基本数据类型高级数据类型高并发指标布隆过滤器分布式锁Redis 的有序集合底层为什么要用跳表&#xff0c;而不用平衡…

什么是 AI Agent ?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 讲解的同时&#xff0c;也给你推荐一些实用的学习资源。 AI agent &#xff08;智能体 / 代理&#xff09;这个词儿最近非常流行&#xff0c;似乎「大语…

目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

文章目录 一、目标检测介绍二、YOLOv7介绍三、源码/论文获取四、环境搭建4.1 环境检测 五、数据集准备六、 模型训练七、模型验证八、模型测试九、错误总结9.1 错误1-numpy jas mp attribute int9.2 错误2-测试代码未能跑出检测框9.3 错误3- Command git tag returned non-zero…

RabbitMQ高级(MQ的问题,消息可靠性,死信交换机,惰性队列,MQ集群)【详解】

目录 一、MQ的问题 1. 问题说明 2. 准备代码环境 1 创建project 2 创建生产者模块 3 创建消费者模块 二、消息可靠性 1. 介绍 2. 生产者确认机制 3. MQ消息持久化 4. 消费者确认机制 5. 消费者auto模式的失败重试 6. 小结 三、死信交换机和延迟消息 1. 介绍 2. …

【EasySpider】EasySpider+mysql执行配置异常

问题 使用易采集工具操作时候&#xff0c;遇到一个执行异常&#xff0c;后来发现没有选择数据类型 Loading stealth.min.js MySQL config file path: ./mysql_config.json 成功连接到数据库。 Successfully connected to the database. Traceback (most recent call last):…

湘潭大学数据库作业题完整答案

作业一&#xff1a; 考虑如下所示的关系数据库。这些关系上适当的主码是什么&#xff1f; 职工&#xff08;姓名&#xff0c;街道&#xff0c;城市&#xff09; 工作&#xff08;姓名&#xff0c;公司名&#xff0c;工资&#xff09; 公司&#xff08;公司名&#xff0c;城市&a…