Java4----String

news2024/11/15 20:08:57

一、概述

        java.lang.String 类代表字符串,Java程序中所有字符串文字都为此类

注意:

        字符串内容是不会发生改变的,它的对象在创建后不能被更改

比如:

String name = "666";

name = "8wx";

这是两个字符串

        java程序中所有的字符串文字都被实为此类的对象,字符串不可变,它的值在创建后不可被更改

二、创建String 对象的两种方式

1.直接赋值

String name = "马克诺弗";

2.new

构造方法说明
public String()创建空白字符串,不含任何对象 ""
public String(String original)根据传入的字符串,创建字符串对象
public String(char[] chs)根据字符数组,创建字符串对象
public String(byte[] chs)根据字节数组,创建字符串对象
public class test {
    public static void main(String[] args) {
        //1.使用直接赋值的方式获取一个字符串对象
        String s1 = "abc";
        System.out.println(s1);

        //2.使用new的方式来获取一个字符串对象
        String s2 = new String();
        System.out.println("@"+s2+"!");

        //根据传入的字符串,创建字符串对象
        String s3 = new String("abc");
        System.out.println(s3);

        //根据字符数组,创建字符串对象
        char[] chs = {'a','b','c'};
        String s4 = new String(chs);
        System.out.println(s4);

        //根据字节数组,创建字符串对象
        byte[] bytes = {97,98,99};
        String s5 = new String(bytes);
        System.out.println(s5);
        
    }
}

在内存方面:

        当使用双引号直接赋值时,系统会检查字符串在串池中是否存在。存在即复用,不存在创建新的。而new出来的则不会复用,所以推荐直接赋值。

三、Java的常用比较方法

1、

        

String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);//true

2、

String s1 = "abc";
String s2 = "abd";
System.out.println(s1 == s2);//false

3、

String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2);//false

所以

==号比的是什么?

1.基本数据类型——数据值

2.引用数据类型——地址值

所以引入两个比较字符串的方法:

1、boolean equals方法        ——        完全一样才是true,否则为false

2、boolean equalslgnoreCase        ——        忽略大小写的比较

public class test {
    public static void main(String[] args) {
        String s1 = new String("abc");
        String s2 = "Abc";

        boolean flag1 = s1.equals(s2);
        boolean flag2 = s1.equalsIgnoreCase(s2);
        System.out.println(flag1); //false
        System.out.println(flag2); //true

    }
}

同理,键盘录入字符串比较时==也不行,所以以后要比较字符串的内容,就必须用String里面的方法

四、练习

1、

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        //已知正确的用户名和密码,模拟用户登录,三次机会,登录之后,给出相应提示
        boolean flag = false;
        for (int i = 0; i < 3; ) {
            System.out.println("请输入用户名");
            Scanner sc = new Scanner(System.in);
            String name = sc.next();
            System.out.println("请输入密码");
            String pw = sc.next();
            flag = panduan(name,pw);
            if(flag){
                System.out.println("登录成功");
                break;
            }
            else{
                i++;
                System.out.println("登录失败,请重新登录");
            }
        }
        if(!flag){
            System.out.println("账户已被冻结,请联系管理员!!!");
        }
    }

    public static boolean panduan(String name,String pw){
        String user = "看月落月升";
        String password = "123456789";
        boolean flag1 = user.equals(name);
        boolean flag2 = password.equals(pw);
        if(flag1 && flag2) {
            return true;
        }
        else{
            return false;
        }
    }
}

2、

public class test {
    public static void main(String[] args) {
        ///遍历输入的字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i); //根据索引找到该字符
            System.out.println(c);
        }
    }
}

3、

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        ///统计字符次数:大写字母,小写字母,数字字符
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str = sc.next();    //这个方法不能获取空格,nextLine()可以,但两者不能混合使用\n影响
        int bigCount = 0;
        int smallCount = 0;
        int numberCount = 0;
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            if(c >= 'a' && c <= 'z'){
                smallCount++;
            }
            else if(c >= 'A' && c <= 'Z'){
                bigCount++;
            }
            else if(c >= '0' && c <= '9'){
                numberCount++;
            }
        }
        System.out.println("小写字母有:"+smallCount+"个");
        System.out.println("大写字母有:"+bigCount+"个");
        System.out.println("数字字符有:"+numberCount+"个");
    }
}

4、

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        //定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符返回
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入数组个数");
        int count = sc.nextInt();
        int[] arr = new int[count];
        for (int i = 0; i < arr.length; i++) {
            System.out.println("请输入第"+(i+1)+"个数:");
            int x = sc.nextInt();
            arr[i] = x;
        }

        if(count == 0){
            System.out.println("[]");
        }
        else{
            System.out.printf("[");
            for (int i = 0; i < arr.length; ) {
                System.out.printf("%d",arr[i]);
                if(i != arr.length - 1){
                    i++;
                    System.out.printf(",");
                }
                else{
                    System.out.printf("]");
                    break;
                }
            }
        }
    }
}

5、

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        //定义一个方法,实现字符串反转,键盘录入一个字符串,调用该方法,输出结果   abcd ——>  dcba
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入该字符:");
        String str = sc.next();
        String result = reverse(str);
        System.out.println(result);
    }

    public static String reverse(String str) {
        char[] demo = new char[str.length()];
        int j = 0;
        for (int i = str.length() - 1; i >= 0 ; i--,j++) {
            char c = str.charAt(i);
            demo[j] = c;
        }
        String result = new String(demo);
        return result;
    }
}

6、

public class test {
    public static void main(String[] args) {
        //手机号屏蔽  String substring(int beginindex,int endindex)  包左不包右
        String phone = "19955558890";
        String demo1 = phone.substring(0,3);
        String demo2 = phone.substring(7,11);
        String result = demo1 + "****" + demo2;
        System.out.println(result);

    }
}

7、

public class test {
    public static void main(String[] args) {
        //敏感词替换 String replace(旧值,新值);
        String talk = "你玩得真好,以后不玩了,TMD,CNM";
        String[] arr = {"TMD","CNM","SB","MLGB"};

        for (int i = 0; i < arr.length; i++) {
            talk = talk.replace(arr[i],"***");
        }
        System.out.println(talk);
    }
}

五、StringBuilder的基本操作

StringBuilder是一个容器,创建后里面的内容是可以改变的,提高字符串的操作效率,节省内存

方法名说明
public StringBuilder()创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象

StringBuilder sb = new StringBuilder();

常用方法

方法名说明
public StringBuilder(任意类型);添加数据,并返回对象本身
public StringBuilder reverse();反转容器里的内容
public int length();返回长度(字符出现的个数)
public String toString();通过toString()就可以把StringBulider转换为String
public class test {
    public static void main(String[] args) {
        //1.创建对象
        StringBuilder sb = new StringBuilder("你好");
        //2.添加元素
//        sb.append(1);
//        sb.append(true);
//        sb.append("abc");
        //3.无需接收,直接转换
        sb.reverse();
        //获取长度
        int len = sb.length();
        System.out.println(len);    //2


        //打印:其是Java已经写好的类,打印对象是属性值,不是地址值
        System.out.println(sb);

    }
}
public class test {
    public static void main(String[] args) {
        //1.创建对象
        StringBuilder sb = new StringBuilder();
        //2.添加元素
        sb.append("aaa");
        sb.append("bbb");
        sb.append("ccc");
        System.out.println(sb);

        //使其变为String 
        String str = sb.toString();
        System.out.println(str.length());

    }
}

六、链式编程

当我们再调用一个方法的时候,不需要用变量接收他的结果,可以继续调用其他方法

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        String str = getString().substring(1).replace("A","Q");
        System.out.println(str);
    }

    public static String getString() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String str = sc.next();
        return str;
    }
}

综合练习

import java.util.Scanner;

public class test {
    public static void main(String[] args) {
        //对称字符串
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入字符串:");
        String str = sc.next();
//        char[] reverse = new char[str.length()];
//        int j = str.length() - 1;
//        for (int i = 0; i < str.length(); i++) {
//            char c = str.charAt(i);
//            reverse[j] =  c;
//            j--;
//        }
//        String result = new String(reverse);
        String result = new StringBuilder().append(str).reverse().toString();
        boolean b = result.equals(str);
        if(b){
            System.out.println("是对称字符串");
        }else{
            System.out.println("不是对称字符串");
        }
        
    }

}

七、StringJoiner

也可以看做成一个容器,创建之后内容可变

提高字符串的操作性效率,而且代码编写特别简洁

构造方法

方法名说明
public StringJoiner(间隔符号)创建一个StringJoiner对象,指定拼接的间隔符号
public StringJoiner(间隔符号,开始符号,结束符号)创建一个StringJoiner对象,指定拼接时的间隔符号、开始符号、结束符号

成员方法

方法名说明
public StringJoiner add(添加的内容)添加数据,并返回对象本身
public int length()返回长度(字符出现的个数)
public String toString()返回拼接后的字符串
import java.util.StringJoiner;

public class test {
    public static void main(String[] args) {
        /*//1.创建一个对象,并指定中间的间隔符号
        StringJoiner sj = new StringJoiner("---");
        //2.添加元素
        sj.add("aaa").add("bbb").add("ccc");
        //打印结果
        System.out.println(sj); //aaa---bbb---cccc*/
        StringJoiner sj = new StringJoiner(", ","[","]");
        sj.add("aaa").add("bbb").add("ccc");

        int len = sj.length();  //包括添加的,[]和空格
        System.out.println(len);
        System.out.println(sj);
    }

}

八、字符串原理

字符串存储的内存原理

直接赋值会复用字符串常量池里的

new出来的不会复用,而是开辟一个新的空间

==号比较的到底是什么?

基本数据类型比较数据值

引用数据类型比较地址值

字符串拼接的底层原理

字符串拼接的时候,如果有变量:

        JDK8以前:系统底层会自动创建一个StringBuilder对象,然后再调用其append方法完成拼接。

拼接后,再调用其toString方法转换为String类型,而toString方法的底层是直接new了一个字符串对象。

        JDK8版本:系统会预估要字符串拼接之后的总大小,把要拼接的内容都放在数组中,此时也是产生一个新的字符串。

结论:

如果有很多字符串变量拼接,不要直接+。底层会创建多个对象,浪费时间和性能,使用StringBuilder和StringJoiner方法

字符串拼接的底层原理 

如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。

如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。

 StringBuilder提高效率原理图

所有要拼接的内容都会往StringBuilder中放,不会创建很多无用的空间,节约内存

默认创建一个长度为16的字节数组

添加的内容长度小于16,直接存

添加的内容大于16会扩容(原来的容量*2+2)

如果扩容之后还不够,以实际长度为准

public class test {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        System.out.println(sb.capacity());  //16
        System.out.println(sb.length());    //0


        sb.append("abcdefghijklmnopqrstuvwxyz0123456789");

        System.out.println(sb.capacity());  //36
        System.out.println(sb.length());    //36
    }
}

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

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

相关文章

通信工程学习:什么是HFC混合光纤同轴电缆

HFC&#xff1a;混合光纤同轴电缆 HFC&#xff08;Hybrid Fiber Coaxial&#xff09;混合光纤同轴电缆是一种结合了光纤与同轴电缆的宽带接入网技术。以下是对HFC混合光纤同轴电缆的详细解释&#xff1a; 一、HFC混合光纤同轴电缆的定义与概述 定义&#xff1a;HFC是一种结合光…

如何设置开机跳过桌面启动自己的应用及如何恢复

开机跳过桌面启动自己的应用 最近研究如何在win10下实现kiosk模式&#xff0c;其实win10本身是有一个展台模式&#xff0c;就是可以把应用设为window启动后进入的一个程序且全屏显示&#xff0c;用户无法切换到桌面或其他应用&#xff0c;但它的前提是只能从UWP的应用里去选择&…

利士策分享,中秋致敬:向坚守一线的劳动者致以最深敬意

利士策分享&#xff0c;中秋致敬&#xff1a;向坚守一线的劳动者致以最深敬意 在这个月华如练的夜晚&#xff0c;当万家灯火与皎洁的明月交相辉映&#xff0c;家家户户围坐一堂&#xff0c;共享中秋团圆的温馨时刻&#xff0c;有那么一群人&#xff0c;他们的身影却依然忙碌在…

Python | python中的特殊方法__str__和__repr__

__str__和__repr__ 无方法有方法__str____repr__同时存在 __str__和__repr__都是更改print的输出形式 无方法 无特殊方法 class Person:def __init__(self,name,age):self.name nameself.age ageprint(Person(aa, 34))<main.Person object at 0x000002231EF78B38> …

uniapp 如何自定义导航栏并自适应机型

如今的移动设备有各种不同的屏幕形状&#xff0c;如刘海屏、水滴屏等。这些异形屏会影响页面的布局&#xff0c;尤其是导航栏和底部栏的显示。通过获取安全区域信息&#xff0c;可以确保页面内容不会被异形屏的特殊区域遮挡。 在设计页面顶部导航栏时&#xff0c;可以根据 saf…

springboot 集成轻量级规则编排引擎 LiteFlow 使用详解

目录 一、前言 二、流程编排概述​​​​​​​ 2.1 什么是流程编排 2.1.1 流程编排主要特征 2.1.2 流程编排应用场景 2.2 流程编排与工作流区别 2.2.1 定义上的差别 2.2.2 应用场景上的差别 2.2.3 技术实现上的差异 三、微服务中流程编排常用的技术 3.3.1 LiteFlow …

车型展示+接驳体验!苏州金龙海格客车闪耀汉诺威商用车展

德国当地时间9月16日&#xff0c;IAA汉诺威商用车展媒体日活动在德国汉诺威展览中心开幕。该展会自1897年首次举办以来&#xff0c;已有超过一个世纪的历史&#xff0c;是全球历史最长、规模最大、最具影响力的专业商用车展之一&#xff0c;更是世界商用车行业技术创新和发展趋…

【Java宝典】——探索数组的奥秘之旅

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 Java数组常见报错①:ArrayIndexOutOfBoundsException(数组索引超出范围)②:NullPointerException(空…

【数字组合】

题目 思路 状态表示&#xff1a; f [ i ] [ j ] f[i][j] f[i][j] 对应考虑1到 i 号数字&#xff0c;和为 j 的方法&#xff0c;表示方法数 目标表示&#xff1a; f [ n ] [ m ] f[n][m] f[n][m] 状态转移&#xff1a; f [ i ] [ j ] f [ i − 1 ] [ j ] f [ i − 1 ] [ j …

2022高教社杯全国大学生数学建模竞赛C题 问题二(1) Python代码

目录 问题 22.1 依据附件数据分析高钾玻璃、铅钡玻璃的分类规律数据类别编码不平衡数据处理分类模型决策树分类随机森林分类XGBoost分类LightGBM分类Catboost分类基于直方图的梯度提升Histogram-Based Gradient Boosting梯度提升树Gradient Boosting Tree逻辑回归Logistic朴素贝…

Python | Leetcode Python题解之第409题最长回文串

题目&#xff1a; 题解&#xff1a; class Solution:def longestPalindrome(self, s: str) -> int:ans 0count collections.Counter(s)for v in count.values():ans v // 2 * 2if ans % 2 0 and v % 2 1:ans 1return ans

【快速入门】UMLS使用手册官方-超全翻译(包括图与表翻译)

目录 第 1 章 UMLS 简介 第 2-4 章。元同义词库 第 5 章 语义网络 第 6 章 专业词汇和词汇工具 第 7 章 UMLS 术语服务 第 8 章 MetamorphoSys 1 UMLS 简介 1.1. UMLS 的目的 1.2. UMLS 的使用条件 1.3. UMLS 知识源和相关工具 1.3.1. 元同义词库 1.3.2. 语义网络 …

【网络安全 | PHP代码审计】熊海cms

原创文章,禁止转载。 文章目录 环境搭建代码审计文件包含漏洞SQL注入漏洞1SQL注入漏洞2SQL注入漏洞3SQL注入漏洞4SQL注入漏洞5SQL注入漏洞6XSS漏洞1XSS漏洞2垂直越权CSRF1CSRF2逻辑漏洞环境搭建 https://down.chinaz.com/soft/36930.htm解压并重命名: 修改配置(php版本需…

【Git】将本地项目上传到git | 在IDEA的提交记录中更改 提交的用户名

一:将本地项目上传到git 1:在​gitee​上创建以自己项目名称命名的空项目【注意项目名称与本地项目的文件夹名称一致】 2:进入想上传的项目的文件夹,然后右键点击 3:查看用户名及邮箱 $ git config user.name $ git config user.email4: 配置你的用户名及邮箱【如果有…

Git:Git管理

目录 Git 文件管理检测文件状态 status跟踪新文件 add提交更新 commit撤销提交 Commit Git 校验和历史查看 log版本回退 resetgit 忽略文件 Git 分支管理Git 提交对象Git master分支Git 分支管理本地分支管理远程分支管理分支hotfix处理 Git 工作流常见分支冲突处理分支合并冲突…

形象化展示numpy.stack

https://numpy.org/doc/stable/reference/generated/numpy.stack.html#numpy.stack 1. 一维数组 import numpy as npa np.arange(4) b np.arange(4) c np.stack([a,b]) d np.stack([a,b], axis1) print(a -->, a.shape,:\n, a) print(b -->, b.shape,:\n, b) print…

ICM20948 DMP代码详解(25)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;24&#xff09; 上一回讲到了inv_icm20948_load_firmware函数&#xff0c;对于大体功能进行了介绍&#xff0c;本回深入其具体实现代码细节。为了便于理解和回顾&#xff0c;再次贴出相关代码&#xff1a; //Setup Iv…

【个人博客hexo版】hexo安装时会出现的一些问题

项目场景&#xff1a; 项目场景&#xff1a;在完成了GitHub仓库和git的连接之后&#xff0c;就要新建一个文件夹&#xff08;例如hexo blog&#xff09;进行下一步hexo的使用 问题描述 例如&#xff1a;如图所示 原因分析&#xff1a; 这些error不用看它到底是什么&#xf…

Chrome谷歌浏览器登录账号next无反应

文章目录 问题描述 我们的Chrome浏览器在更新之后&#xff0c;会出现登录谷歌账号的时候&#xff0c;当你输入你的谷歌邮箱之后&#xff0c;点击 n e x t next next,也就是下一步的时候&#xff0c;页面没有反应&#xff0c;也就是没有跳转到输入密码的页面。 分析 根据logs里…

CLIP模型也能处理点云信息(论文复现)

CLIP模型也能处理点云信息&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 文章目录 CLIP模型也能处理点云信息&#xff08;论文复现&#xff09;概述模型结构模型总览图点云的投影视图间适配器 演示效果零样本投影少样本投影 核心逻辑使用方式部署…