java字符串超详解

目录

1. API

1.1 API 概述

2. String

2.1 String概述

2.2 String 构造方法

2.3 String对象的特点

2.4 字符串的比较

2.5 String中的方法

3. StringBuilder

3.1 StringBuilder 概述

3.2 StringBuilder 的构造方法

 3.3 StringBuilder 的添加和反转

3.4 StringBuilder 和 String 相互转换

 3.5 StringBuilder 中的方法

1. API

1.1 API 概述

API(Application Programming Interface): 应用程序编程接口。是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

JavaAPI:指的就是JDK中提供的各种功能的Java类这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现

2. String

2.1 String概述

String类代表字符串。java程序中的所有字符串文字(例如"abc")都被实现为此类的实例。

Java 程序中所有的双引号字符串,都是String 类的对象

String类在java.lang 包下,所以使用的时候不需要导包

字符串的特点:

  • 字符串不可变,它们的值在创建后不能被更改
  • 虽然String的值是不可变的,但是它们可以被共享
  • 字符串效果上相当于字符数组(char[]),但是底层原理是字节数组( byte[]) (JDK8及以前是字符数组,JDK9及以后是字节数组)

2.2 String 构造方法

方法名说明
public String()创建一个空白字符串对象,不含有任何内容
public String(char[] chs)根据字符数组的内容,来创建字符串对象
public String(byte[] bys)根据字节数组的内容,来创建字符里对象
String s = “abc"直接赋值的方式创建字符用对象,内容就是abc

例如:

public class Demo05 {
	public static void main(String[] args) {
		// public String() 创建一个空白字符串对象,不含有任何内容
		String s1 = new String();
		System.out.println("s1:" + s1); // 无内容

		// public String(char[] chs) 根据字符数组的内容,来创建字符串对象
		char[] c = { 'a', 'b', 'c' };
		String s2 = new String(c);
		System.out.println("s2:" + s2);// abc

		// public String(byte[] bys) 根据字节数组的内容,来创建字符里对象
		byte[] b = { 97, 98, 99 };
		String s3 = new String(b);
		// 97 98 99对应的底层字符分别为a b c 。
		// a b c 三个字符在计算机底层存储的是数据分别为97 98 99的值
		System.out.println("s3:" + s3);// abc

		// String s = “abc" 直接赋值的方式创建字符用对象,内容就是abc
		String s4 = "abc";
		System.out.println("s4:" + s4);// abc
	}
}

结果:

2.3 String对象的特点

1.通过new 创建的字符串对象,每一次new都会申请一个内存空间,虽然内容相同,但是地址值不同。

char[] chs ={'a','b','c'};
String s1 = new String(chs);
String s2 = new String(chs);

上面的代码中,JVM会首先创建一个字符数组,然后每一次new的时候都会有一个新的地址,只不过s1和s2参考的字符串内容是相同的

2.以" "方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次JVM 都只会建立一个String 对象,并在字符串池中维护

String s3 = "abc";
String s4 = "abc";

在上面的代码中,针对第一行代码,JVM 会建立一个String对象放在字符串池中,并给s3参考,第二行则让s4直接参考字符串池中的String对象,也就是说它们本质上是同一个对象

2.4 字符串的比较

使用==做比较
基本类型:比较的是数据值是否相同

引用类型:比较的是地址值是否相同

字符串是对象,它比较内容是否相同,是通过一个方法来实现的,equals()

public boolean equals(0bject anObject): 将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串

例如:

public class Demo07 {
	public static void main(String[] args) {
		char[] c = { 'a', 'b', 'c' };
		String s1 = new String(c);
		String s2 = new String(c);

		String s3 = "abc";
		String s4 = "abc";

		System.out.println(s1 == s2);
		System.out.println(s1 == s3);
		System.out.println(s3 == s4);
		System.out.println("---------");
		System.out.println(s1.equals(s2));
		System.out.println(s1.equals(s3));
		System.out.println(s3.equals(s4));

	}
}

结果:

例2:遍历字符串

public char charAt(int index): 返回指定索处的char值,字符串的索引也是从0开始的

遍历字符串,其次要能够获取到字符串的长度

public int length(): 返回此字符串的长度

数组的长度:数组名.length
字符串的长度:字符串对象.length()

 

import java.util.Scanner;

public class Demo10 {
	public static void main(String[] args) {
		System.out.println("输入字符串");
		Scanner sc = new Scanner(System.in);
		String line = sc.next();
		// 获取字符串的每一个字符
		for (int i = 0; i < line.length(); i++) {
			System.out.print(line.charAt(i) + " ");
		}
	}
}

结果:

 例3:统计字符次数

import java.util.Scanner;

public class Demo06 {
	public static void main(String[] args) {
		System.out.println("输入字符串");
		Scanner sc = new Scanner(System.in);
		String line = sc.next();
		int a = 0;
		int b = 0;
		int c = 0;
		for (int i = 0; i < line.length(); i++) {
			if (line.charAt(i) >= '0' && line.charAt(i) <= '9') {
				a++;
			} else if (line.charAt(i) >= 'a' && line.charAt(i) <= 'z') {
				b++;
			} else if (line.charAt(i) >= 'A' && line.charAt(i) <= 'Z') {
				c++;
			}
		}
		System.out.println("数字有" + a + "位");
		System.out.println("小写字母有" + b + "位");
		System.out.println("大写字母有" + c + "位");
	}
}

结果:

 例4:拼接字符串

public class Demo08 {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		ToString(arr);
	}

	public static void ToString(int[] arr) {
		System.out.print("[");
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length - 1) {
				System.out.print(arr[i]);
			} else {
				System.out.print(arr[i] + ",");
			}
		}
		System.out.println("]");
	}
}

结果:

 例5:字符串反转

import java.util.Scanner;

public class Demo09 {
	public static void main(String[] args) {
		System.out.println("输入字符串");
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		for (int i = s.length() - 1; i >= 0; i--) {
			System.out.print(s.charAt(i)+" ");
		}
	}
}

结果:

2.5 String中的方法

方法名说明
public boolean equals(Object anObject)比较字符串的内容,严格区分大小写(用户名和密码)
public char charAt(int index)返回指定索引处的 char 值
public int length()返回此字符串的长度

3. StringBuilder

3.1 StringBuilder 概述

如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费内存空间,而这种操作还不可避免。那么有没有一种比较好的方式可以解决这个问题呢?答察是肯定的,我们可以通过Java 提供的StringBuilder 类就来解决这个问题。

StringBuilder是一个可变的字符串类,我们可以把它看成是一个容器这里的可变指的是StringBuilder对象中的内容是可变的。

String 和 StringBuilder 的区别

  • String:内容是不可变的
  • StringBuilder:内容是可变的

3.2 StringBuilder 的构造方法

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

 例如:

public class Demo11 {
	public static void main(String[] args) {
		// public StringBuilder() 创建一个空白可变字符串对象,不含有任何内容
		StringBuilder s = new StringBuilder();
		System.out.println("s:" + s);
		System.out.println("s.length()" + s.length());// 长度
		// public StringBuilder(String str) 根据字符串的内容,来创建可变字符串对象
		StringBuilder s1 = new StringBuilder("abc");
		System.out.println("s1:" + s1);
		System.out.println("s1.length()" + s1.length());// 长度

	}
}

结果:

 3.3 StringBuilder 的添加和反转

方法名说明
public StringBuilder append(任意类型)添加数据,并返回对象本身
public StringBuilder reverse()返回相反的字符序列

例如:

public class Demo12 {
	public static void main(String[] args) {
		// public StringBuilder append(任意类型) 添加数据,并返回对象本身
		StringBuilder s = new StringBuilder();
		StringBuilder ss = new StringBuilder();
		// StringBuilder s2 = s.append("abcd");
		// System.out.println("s:" + s);
		// System.out.println("s2:" + s2);//s2:abcd
		// System.out.println("--------");
		s.append("abc");
		s.append("def");
		s.append("ghi");
		s.append(123456);
		System.out.println(s);
		System.out.println("--------");
		// 链式编程
		ss.append("abc").append("def").append("ghi").append(123456);
		System.out.println(ss);
		System.out.println("-----------");

		// public StringBuilder reverse() 返回相反的字符序列
		s.reverse();
		ss.reverse();
		System.out.println(s);
		System.out.println(ss);

	}
}

结果:

3.4 StringBuilder 和 String 相互转换

1.StringBuilder转换为 String
public String toString():通过toString()就可以实现把StringBuilder转换为String
2.String 转换为 StringBuilder:

public StringBuilder(String s): 通过构造方法就可以实现把 String转换为StringBuilder

例如:

public class Demo14 {
	public static void main(String[] args) {
		// 1.StringBuilder转换为 String
		StringBuilder s = new StringBuilder();
		s.append("hello");
		String st = s.toString();
		System.out.println(st);

		// 2.String 转换为 StringBuilder:
		String st2 = "hello123";
		StringBuilder s2 = new StringBuilder(st2);
		System.out.println(s2);
	}
}

结果:

 例1:拼接字符串

public class Demo15 {
	public static void main(String[] args) {
		int[] arr = { 1, 2, 3 };
		String s = ToStirng(arr);
		System.out.println(s);
	}

	public static String ToStirng(int[] arr) {
		StringBuilder sb = new StringBuilder();
		sb.append("[");
		for (int i = 0; i < arr.length; i++) {
			if (i == arr.length - 1) {
				sb.append(arr[i]);
			} else {
				sb.append(arr[i]).append(",");
			}
		}
		sb.append("]");
		String s = sb.toString();
		return s;
	}
}

结果:

例2:字符串反转

public class Demo13 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("输入字符串");
		String line = sc.next();
		String s = info(line);
		System.out.println(s);
	}

	public static String info(String s) {
		// StringBuilder sb=new StringBuilder();
		// sb.reverse();
		// String ss = sb.toString();
		// return ss;
		return new StringBuilder(s).reverse().toString();
	}
}

结果:

 3.5 StringBuilder 中的方法

方法名说明
public StringBuilder append(任意类型)添加数据,并返回对象本身
public StringBuilder reverse()返回相反的字符序列
public String toString()通过toString()就可以实现把StringBuilder转换为String

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Kill OOM

1、什么是OOM&#xff1f; OOM是每个程序员早晚都必须面对的问题&#xff0c;通常情况下&#xff0c;Java程序员所说的OOM是JVM OOM,即java.lang.OutOfMemoryError&#xff0c;是指Java程序在运行时申请内存超过JVM可用内存限制&#xff0c;导致JVM无法继续分配内存&#xff0…

小红书2023“家生活”趋势白皮书

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 近年来&#xff0c;年轻人与家的关系愈发紧密。 在小红书上&#xff0c;我们观察到了家居家装内容的蓬勃生长&#xff0c;3 年来相关内容的笔记规模增长了6倍&#xff0c;相关品类的搜索量增加的 3.…

【JavaEE初阶】了解JVM

文章目录 一. JVM内存区域划分二. JVM类加载机制2.1 类加载整体流程2.2 类加载的时机2.3 双亲委派模型(经典) 三. JVM垃圾回收机制(GC)3.1 GC实际工作过程3.1.1 找到垃圾/判定垃圾1. 引用计数(不是java的做法,Python/PHP)2. 可达性分析(Java的做法) 3.1.2 清理垃圾1. 标记清除2…

自学(黑客)技术,入门到入狱!

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟入…

@ControllerAdvice注解使用及原理探究 | 京东物流技术团队

最近在新项目的开发过程中&#xff0c;遇到了个问题&#xff0c;需要将一些异常的业务流程返回给前端&#xff0c;需要提供给前端不同的响应码&#xff0c;前端再在次基础上做提示语言的国际化适配。这些异常流程涉及业务层和控制层的各个地方&#xff0c;如果每个地方都写一些…

Typescript中的元组与数组的区别

Typescript中的元组与数组的区别 元组可以应用在经纬度这样明确固定长度和类型的场景下 //元组和数组类似&#xff0c;但是类型注解时会不一样//元组赋值的类型、位置、个数需要和定义的类型、位置、个数完全一致&#xff0c;不然会报错。 // 数组 某个位置的值可以是注解中的…

正点原子HAL库入门1~GPIO

探索者F407ZGT6(V3) 理论基础 IO端口基本结构 F4/F7/H7系列的IO端口 F1在输出模式&#xff0c;禁止使用内部上下拉 F4/F7/H7在输出模式&#xff0c;可以使用内部上下拉不同系列IO翻转速度不同 F1系列的IO端口 施密特触发器&#xff1a;将非标准方波&#xff0c;整形为方波 当…

01-序言

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan 简介&#xff1a; 此专栏是学习“线性代数”课程做的笔记&#xff0c;教程来自B站。视频作者是Grant Sanderson&#xff0c; 这套视频里的动画是他通过manim制作的&#xff08;manim是…

怎么维护好自己的电脑

你的电脑已经成为你工作、学习、娱乐的最佳工具之一&#xff0c;但是如果你不做好电脑维护工作&#xff0c;就可能面临着电脑变慢、蓝屏、崩溃等问题。在这篇文章中&#xff0c;我们将介绍10个电脑维护步骤&#xff0c;让你的电脑更加稳定&#xff01; 为什么需要电脑维护&…

python数据处理程序代码,如何用python处理数据

大家好&#xff0c;给大家分享一下python数据处理程序代码&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 要求&#xff1a;分别以james&#xff0c;julie&#xff0c;mikey&#xff0c;sarah四个学生的名字建立文本文件&#xff0c;分别存…

285 · 高楼大厦

链接&#xff1a;LintCode 炼码 - ChatGPT&#xff01;更高效的学习体验&#xff01; 题解&#xff1a; 1.从左往右维护一个单调递减&#xff0c;栈的长度就是&#xff0c;可以看到最多的高楼 2.从右往后也是维护一个单调递减的栈 class Solution { public:/*** param arr:…

Java判断文件的系统格式编码格式

使用Java判断一个文件的系统格式&#xff08;亲测可用&#xff09;&#xff0c;比如我们常见的Windows格式的文件&#xff0c;Unixg格式的文件&#xff0c;Mac格式的文件&#xff1b;常常有这样的场景&#xff1a;我们在Windows系统编写的脚步上传到Linux系统执行&#xff0c;执…

【验证测试】未初始化的全局变量和局部变量的初值

验证目标&#xff1a; 未初始化的全局变量的初值为 0未初始化的局部变量的初值为随机值 测试用例&#xff1a; #include <stdio.h>char gval1; int gval2; static long gval3;int main() {unsigned char uchTmp1;unsigned int uTmp2;printf("%d\n", gval1)…

Centos虚拟机忘记密码-修改密码

1.重启系统 2.在这个选择界面&#xff0c;按e建 3.找到如下位置&#xff0c;插入init/bin/sh 4.填写完成后按Ctrlx引导启动 5.输入mount -o remount, rw / (注意空格) 6.重置密码 出现以下为重置成功 7.执行touch /.autorelabel 8.退出exec /sbin/init 9.输入你的新密…

14-4_Qt 5.9 C++开发指南_QUdpSocket实现 UDP 通信_UDP组播

文章目录 1. UDP组播的特性2. UDP 组播实例程序的功能3. 组播功能的程序实现4. 源码4.1 可视化UI设计4.2 mainwindow.h4.3 mainwindow.cpp 1. UDP组播的特性 下图简单表示了组播的原理。UDP 组播是主机之间“一对一组”的通信模式&#xff0c;当多个客户端加入由一个组播地址定…

STM32——STM32F401x系列标准库的下载+环境搭建+建工程步骤(更完整)

文章目录 标准库的下载环境搭建建工程最后的话 标准库的下载 1.STM32标准库的官网下载网站https://www.st.com/content/st_com/en.html 2. 3. 4. 5. 6. 7.点击之后下滑 8.选择自己需要的版本下载 环境搭建建工程 大致步骤同之前我写的一篇STM32——建工程差不多&#xff0…

快速WordPress个人博客并内网穿透发布到互联网

快速WordPress个人博客并内网穿透发布到互联网 文章目录 快速WordPress个人博客并内网穿透发布到互联网 我们能够通过cpolar完整的搭建起一个属于自己的网站&#xff0c;并且通过cpolar建立的数据隧道&#xff0c;从而让我们存放在本地电脑上的网站&#xff0c;能够为公众互联网…

jenkins准备

回到目录 jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;主要用于持续、自动的构建/测试软件项目、监控外部任务的运行。Jenkins用Java语言编写&#xff0c;可在Tomcat等流行的servlet容器中运行&#xff0c;也可独立运行。通常与版本管理工具(SCM)、构…

【每日易题】数据结构链表篇——单链表oj题(1),几道典型例题带你快速掌握单链表

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 Hello,米娜桑们&#xff0c;这里是君兮_&#xff0c;今天来填一个埋了好久的坑&#xff0c;在暑假之前就预告过这个系列&#xff0c;但由于各种原因&#xff08;主要是有点懒&#xff09;今天才开坑。我们这个系列主要是…

Scratch 之 如何制作简单的碰撞箱

hello&#xff0c;大家好&#xff0c;今天教给大家如何制作粗糙的碰撞箱 本次教学不用拓展、不用自制积木、不用变量、不用列表 首先明确原理 图1 我们想做到第一个 而大家不要做成第二个 错误示范&#xff1a; 然后就变成了 咳咳咳 这就是我们不想看到的 于是你可以这样…