【基础篇-Day8:JAVA字符串的学习】

目录

  • 1、常用API
  • 2、String类
    • 2.1 String类的特点
    • 2.2 String类的常见构造方法
    • 2.3 String类的常见面试题:
      • 2.3.1 面试题一:
      • 2.3.2 面试题二:
      • 2.3.3 面试题三:
      • 2.3.4 面试题四:
    • 2.4 String类字符串用于比较的方法
    • 2.5 String类字符串的遍历
    • 2.6 String类字符串的截取方法
    • 2.7 String类字符串的替换方法
    • 2.8 String类字符串的切割方法
    • 2.9 String类字符串方法的总结
  • 3、StringBuilder类
    • 3.1 StringBuilder介绍
    • 3.2 StringBuilder的构造方法
    • 3.3 StringBuilder的常用方法
    • 3.4 StringBuffer与StringBuilder的区别:

1、常用API

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • Scanner类录入字符串注意事项:
    在这里插入图片描述

  • API帮助文档的使用流程:在这里插入图片描述

2、String类

2.1 String类的特点

  • Java程序中,所有双引号字符串,都是String的实例,即对象。如下是两种创建字符串对象的方法:
String s = "";
String s1 = new String();
  • 字符串一旦被创建,则不可被更改,即字符串的内容不可更改,如果要修改,则只能使用新的对象做替换。如下:
String s = "abc";
s = "def";
  • String字符串虽然不可改变,但可以被共享。为了解释清除什么是共享,因此这里要涉及一个概念,即字符串常量池:当我们使用双引号创建字符串对象时,会先去字符串常量池中检查是否存在改数据:

存在:创建
不存在:复用

看如下代码就是共享的例子:

String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);输出:
true

上述代码的内存图解释:
在这里插入图片描述

注:==比较地址,而equals()比较内容

总结:
在这里插入图片描述

2.2 String类的常见构造方法

在这里插入图片描述

注意事项:
1、打印对象名时,会输出对象在堆内存开辟的内存地址,但是打印字符串对象时,输出的是内容。
2、这三个构造方法创建对象,都没有直接使用双引号来的方便。

2.3 String类的常见面试题:

2.3.1 面试题一:

  • System.out.pringln(s1 == s2)输出true还是false,为什么?

答:两个字符串都是用双引号创建对象时,其实都是引用了堆内存中字符串常量的内存地址,因此使用==号作比较时,两个指向同一个地址,自然输出true。下面是内存图解释:
在这里插入图片描述

2.3.2 面试题二:

  • 直接使用双引号创建字符串,与使用构造方法创建字符串有什么区别?

答:使用双引号时,会在堆内存的字符串常量池中开辟一个空间,而使用构造方法new一个对象时,会在堆内存的普通区局开辟一个空间,因此当这两种创建内容相同,但是用==做比较时,会输出false。看下面的内存图解释;
在这里插入图片描述

2.3.3 面试题三:

  • 字符串做+拼接时的原理。

答:使用+做拼接时,首先会在堆内存开辟StringBuilder对象的内存地址,然后再调用此类的toString方法转换成字符串,转换后的字符串也会在堆内存中开辟一个空间,最后再将转换后字符串的地址给栈内存中引用的变量,因此拼接后的字符串和使用双引号创建的字符串内容虽然相同,但是指向的地址是不同的,使用==自然会返回false。下面是内存图解释:
在这里插入图片描述

2.3.4 面试题四:

  • 字符串常量拼接原理:在编译时就会做优化处理,所以编译成字节码文件后,就是拼接到一起的样子,例如下图:
    在这里插入图片描述

输出为true,原因是s2编译成字节码文件后为"abc",和s1是一样的。

2.4 String类字符串用于比较的方法

在这里插入图片描述

练习:
在这里插入图片描述

package com.itheima.string;import com.itheima.string.vo.User;import java.util.Scanner;public class Login {public static void main(String[] args) {login();}public static void login(){// 1、从数据库查找:正确的用户名和密码User user = new User("马四", "1qaz");// 2、和用户输入做比较Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++) {System.out.println("请输入用户名:");String username = sc.next();System.out.println("请输入密码:");String password = sc.next();if (username.equals(user.getName()) && password.equals(user.getPassword())){System.out.println("登录成功!");break;}System.out.println("你输入不正确,还剩余" + (2- i)  + "次机会");}}
}

注:如果字符串的比较要忽略大小写,则使用equalsIgnoreCase方法即可。

2.5 String类字符串的遍历

在这里插入图片描述

package com.itheima.string;public class StringMethodDemo {public static void main(String[] args) {
//        print1();print2();}/*字符串的第一种遍历方式*/private static void print1() {String s = "itheima";char[] charArray = s.toCharArray();for (int i = 0; i < charArray.length; i++) {System.out.println(charArray[i]);}}/*字符串的第二种遍历方式*/private static void print2() {String s = "itheima";for (int i = 0; i < s.length(); i++) {System.out.println(s.charAt(i));}}
}

注:第一种方法遍历效率高!!!

练习1:
在这里插入图片描述

package com.itheima.string;
import java.util.Scanner;public class StringTestDemo {public static void main(String[] args) {countCharNumber();}public static void countCharNumber(){int numCount = 0;//数字数量int lowerCount = 0;//小写数量int upperCount = 0;//大写数量Scanner sc = new Scanner(System.in);System.out.println("请录入一个字符串:");String s = sc.next();char[] chars = s.toCharArray();for (int i = 0; i < chars.length; i++) {if (chars[i] >= '0' && chars[i] <= '9'){numCount++;}else if (chars[i] >= 'a' && chars[i] <= 'z'){lowerCount++;} else if (chars[i] >= 'A' && chars[i] <= 'Z') {upperCount++;}}System.out.println("数字数量" + numCount);System.out.println("小写数量" + lowerCount);System.out.println("大写数量" + upperCount);}
}

2.6 String类字符串的截取方法

在这里插入图片描述

package com.itheima.string;public class StringTestDemo2 {public static void main(String[] args) {
//        substring1();stustring2();}private static void substring1() {String s = "itheima";String substring = s.substring(3);//包含开始索引,输出:ithSystem.out.println(substring);}private static void stustring2() {String s = "itheima";String substring = s.substring(1, 5);//包含开始索引,不包含结束索引输出:theiSystem.out.println(substring);}
}

练习:
在这里插入图片描述

package com.itheima.string;import java.util.Scanner;public class StringTestDemo3 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("请输入一个手机号:");String phoneNumber = scanner.next();String mockPhoneNumber = phoneNumber.substring(0, 4) + "****" + phoneNumber.substring(8, 11);System.out.println("最终效果为:" + mockPhoneNumber);}
}

2.7 String类字符串的替换方法

在这里插入图片描述

package com.itheima.string;public class StringTestDemo {public static void main(String[] args) {String s = "itheima";String replace = s.replace("heima", "baima");//旧值,新值System.out.println(replace);}
}

练习:
在这里插入图片描述

package com.itheima.string;
import java.util.Scanner;public class StringTestDemo4 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入一个字符串:");String s = sc.next();String replace = s.toUpperCase().replace("TMD", "***");//全部转大写System.out.println(replace);}
}

2.8 String类字符串的切割方法

在这里插入图片描述

package com.itheima.string;public class StringTestDemo4 {public static void main(String[] args) {String s = "abc,def,ghj";String[] split = s.split(",");for (int i = 0; i < split.length; i++) {System.out.println(split[i]);}String ss = "abc.def.ghj";String[] split1 = ss.split("\\.");//因为split参数是正则表达式匹配,而.代表任意数,所以需要用转义符\做转义即可for (int i = 0; i < split1.length; i++) {System.out.println(split1[i]);}}
}

2.9 String类字符串方法的总结

在这里插入图片描述

3、StringBuilder类

3.1 StringBuilder介绍

在这里插入图片描述

作用:
在这里插入图片描述
在这里插入图片描述

看下提高的效率:

package com.itheima.stringBuilder;public class StringBuilderDemo1 {public static void main(String[] args) {long start = System.currentTimeMillis();String s = "";for (int i = 0; i < 11111; i++) {s += i;}System.out.println(s);long end = System.currentTimeMillis();long start1 = System.currentTimeMillis();StringBuilder sb = new StringBuilder();for (int i = 0; i < 11111; i++) {sb.append(i);}System.out.println(sb);long end1 = System.currentTimeMillis();System.out.println(end - start);//502System.out.println(end1 - start1);//3}
}

可以发现,使用了StringBuilder类,运行时间减少了几个数量级。

3.2 StringBuilder的构造方法

在这里插入图片描述

在这里插入图片描述

3.3 StringBuilder的常用方法

在这里插入图片描述

  • 案例1:
    在这里插入图片描述
package com.itheima.stringBuilder;public class StringBuilderDemo2 {public static void main(String[] args) {StringBuilder sb = new StringBuilder("156651");String s1 = sb.toString();String s2 = sb.reverse().toString();if (s1.equals(s2)){System.out.println("是回文");}else {System.out.println("不是回文");}}
}

String和StringBuilder相互的转换:
在这里插入图片描述

  • 案例2:
    在这里插入图片描述
package com.itheima.stringBuilder;public class StringBuilderDemo3 {public static void main(String[] args) {int[] arr = {1, 2, 3};String string = getString(arr);System.out.println(string);}public static String getString(int[] arr){StringBuilder sb = new StringBuilder("[");for (int i = 0; i < arr.length; i++) {sb.append(arr[i]);if (i != arr.length - 1){sb.append(",");}}sb.append("]");return sb.toString();}
}

3.4 StringBuffer与StringBuilder的区别:

StringBuffer 与 StringBuilder使用上没有区别,因此学会了使用StringBuilder,则StringBuffer就会使用。

但是不同点在于,当多线程时,StringBuffer是安全的(效率低),而StringBuilder是不安全的(效率高)。为何这样,在后续多线程里介绍。

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

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

相关文章

埃隆·马斯克的 xAI 募集 60 亿美元,瞄准 AI 超级计算机|TodayAI

埃隆马斯克&#xff08;Elon Musk&#xff09;创立的人工智能公司 xAI 宣布成功募集了 60 亿美元的资金&#xff0c;用于推动其“首批产品推向市场&#xff0c;建立先进的基础设施&#xff0c;并加速未来技术的研发”。马斯克透露&#xff0c;xAI 目前的估值已达到 180 亿美元&…

css 中box-shadow使用总结

还记得我之前还是 ie 时代的时候我们如果遇到有投影&#xff0c;阴影的设计稿&#xff0c;一般的做法就是使用图片作为背景实现&#xff0c;如果要是做自适应宽高还需要利用好几个元素拼接起来设置图片背景实现&#xff0c;而现在我们想要实现投影只需要一个 css 属性 box-shad…

如何简化不同网间文件摆渡的操作流程,降低IT人员工作量?

为了保护内部核心数据不被泄露&#xff0c;同时有效屏蔽外部网络攻击的风险&#xff0c;企业大多会选择实施网络隔离。将“自己人”与“外人”隔离&#xff0c;具有较强的安全敏感性。有些企业还会在内部网络中进一步划分&#xff0c;比如划分为研发网、办公网、生产网等&#…

PaliGemma – 谷歌的最新开源视觉语言模型(一)

引言 PaliGemma 是谷歌推出的一款全新视觉语言模型。该模型能够处理图像和文本输入并生成文本输出。谷歌团队发布了三种类型的模型&#xff1a;预训练&#xff08;PT&#xff09;模型、混合&#xff08;Mix&#xff09;模型和微调&#xff08;FT&#xff09;模型&#xff0c;每…

Vue3实战笔记(48)— reactive大揭秘:Vue 3中复杂数据结构的响应式处理

文章目录 前言reactive 的基本用法1、创建响应式对象&#xff1a;2、在模板中使用响应式对象&#xff1a;3、响应式对象的嵌套&#xff1a; 总结 前言 前些天了解了ref&#xff0c;开发时候大部分时候都是直接用ref&#xff0c;其实还有reactive这玩意&#xff0c;有时候用起来…

C语言实现正弦信号扫频

C语言实现正弦信号扫频 包含必要的头文件:首先,你需要包含 <stdio.h> 和 <math.h> 头文件,分别用于输入输出和数学函数的使用。 定义扫频参数:定义正弦扫频的参数,例如起始频率、结束频率、扫频时间等。 生成正弦波信号:使用正弦函数生成扫频信号,可以根…

【Django】从零开始学Django【2】

五. CBV视图 Django植入了视图类这一功能&#xff0c;该功能封装了视图开发常用的代码&#xff0c;无须编写大量代码即可快速完成数据视图的开发&#xff0c;这种以类的形式实现响应与请求处理称为CBV(Class Base Views)。 1. 数据显示视图 数据显示视图是将后台的数据展示…

C语言 static extern 关键字详解

1、建立2个文件&#xff1b;文件1&#xff1a;file1.c // 文件&#xff1a;counter.c#include <stdio.h>static int count 0; // 声明一个静态全局变量void increment() {count; // 对静态全局变量进行递增操作 } static int n_function() //int n_function() {printf(…

LED屏控制卡是如何控制LED屏的?

LED屏控制卡是LED显示屏的关键组件之一&#xff0c;负责将输入的画面信息转换为LED屏能够显示的数据和控制信号。以下是LED屏控制卡的工作原理和功能的详细介绍&#xff1a; 1. LED显示屏控制器概述&#xff1a; LED显示屏控制器是LED显示屏的核心部件之一&#xff0c;也称为LE…

记一次Chanakya靶机的渗透测试

Chanakya靶机渗透测试 首先通过主机发现发现到靶机的IP地址为:172.16.10.141 然后使用nmap工具对其进行扫描:nmap -sC -sV -sS -p- 172.16.10.141 发现目标靶机开启了80,22,21等多个端口&#xff0c; 访问80端口,发现是一个普通的页面,点击进入多个界面也没有其他有用的信息,然…

前端面试题12-22

12 Proxy是什么&#xff0c;有什么作用&#xff1f; Proxy 是 ES6 (ECMAScript 2015) 引入的一种元编程特性。它允许你创建一个对象&#xff0c;该对象可以拦截和定义基本操作&#xff08;例如属性查找、赋值、枚举、函数调用等&#xff09;。Proxy 提供了一种机制&#xff0c…

Openai革新AI陪伴赛道?国内的AI陪伴创业公司有哪些?

人是一切社会关系的总和&#xff0c;而人的这种社会关系又依靠着情感来联系的。但是自从陪伴式AI的出现仿佛就打破了这种传统的关系。 在你的身边有这样一个“人”&#xff0c;她善解人意、风趣幽默&#xff0c;不会发脾气还会随时陪伴着你&#xff0c;这一在科幻电影中才会出现…

Linux-----sed案例练习

1.数据准备 准备数据如下&#xff1a; [rootopenEuler ~]# cat openlab.txt My name is jock. I teach linux. I like play computer game. My qq is 24523452 My website is http://www.xianoupeng.com My website is http://www.xianoupeng.com My website is http://www.…

解决linux kernel 编译的错误问题

linux 这么大的工程&#xff0c;当你的模块和别人的模块公用一个框架比如DRM 祖爷爷级别的Makefile 给你规定了 -Werrorincompatible-pointer-types 这个时候你又不想用它怎么办呢 就是在你的代码里加上 #pragma GCC diagnostic ignored "-Wincompatible-pointer-types&…

AI作画算法原理

AI作画算法原理详解如下&#xff1a; 一、引言 AI作画是指利用人工智能算法生成图像或绘画的技术。近年来&#xff0c;随着深度学习技术的突破&#xff0c;AI作画已取得了令人瞩目的成果。这些算法能够模拟人类艺术家的创作过程&#xff0c;生成具有艺术性和创意性的图像。 …

振弦采集仪在岩土工程地质灾害监测中的可行性研究

振弦采集仪在岩土工程地质灾害监测中的可行性研究 引言&#xff1a; 岩土工程地质灾害是指在岩土体中由于自然力和人类活动等因素引起的&#xff0c;对人类生活、财产以及环境造成威胁的灾害。为了及时发现并准确监测地质灾害的发生和演化过程&#xff0c;振弦采集仪作为一种新…

计网期末复习指南:物理层(物理层的任务、香农公式、常用信道复用技术)

前言&#xff1a;本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点&#xff0c;从计算机网络体系结构出发到应用层&#xff0c;每一个协议层通过一篇文章进行总结&#xff0c;本系列正在持续更新中... 计网期末复习指南&#xff08;一&#xff09;&#xff1a;计算机…

零基础想学编程,选择哪一门语言更好?(非常详细)零基础入门到精通就业,收藏这一篇就够了!

&#x1f446;点击关注 获取更多编程干货&#x1f446; 编程语言的用途广泛&#xff0c;它们各自在不同的领域和应用场景中发挥着重要作用。 零基础初学者在选择编程语言时&#xff0c;可以从就业方向入手选择。 Python 就业方向&#xff1a;数据科学、机器学习、人工智能…

基于 IP 的 DDOS 攻击实验

介绍 基于IP的分布式拒绝服务&#xff08;Distributed Denial of Service, DDoS&#xff09;攻击是一种利用大量受控设备&#xff08;通常是僵尸网络&#xff09;向目标系统发送大量请求或数据包&#xff0c;以耗尽目标系统的资源&#xff0c;导致其无法正常提供服务的攻击方式…

3-Django项目继续--初识ModelForm

目录 ModelForm 认识ModelForm 优势 初识Form 初识ModelForm 添加信息 views.py add_student_new.html 修改信息 views.py views.py add_student_new.html ModelForm 认识ModelForm 优势 1、方便校验用户提交的数据 2、页面展示错误提示 3、数据库字段很多的情况…