关于java String类(源码等)分析

news2025/7/7 23:40:48

String 类

在这里插入图片描述

  • String声明为final ,不可以被继承

  • String 实现了Serializable接口,表明字符串是可序列化的

  • String 实现了Compareble接口,表示String 可比较大小

  • String 内部定义了 final char[] value value用于存储字符串数据,表明了不可变的字符特性 ---- 1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。2.当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值。3.当调用String 的 replace 方法修改指定的字符或字符串时,也需要重新指定内存区域赋值。

  • 通过字面量的方式(区别new)去给字符串赋值,此时字符串值声明在字符串常量池中,常量池中是不会存储相同内容的字符串的。

    package StringTT;

    import org.junit.Test;

    public class Stringlei {

      @Test
      public void test1(){
      	String s1 = "abc"; // 字面量的定义方式
      	String s2 = "abc";
      
      	System.out.println(s1 == s2); // 对象比较的是地址值
      	s1 = "hello";
      
      
      
      	System.out.println(s1);
      	System.out.println(s2);
      
      	System.out.println("*****************");
      	String s3 = "abc";
      	s3 += "def" ;
      	System.out.println(s3);
      }
    

    }

在这里插入图片描述

创建String对象

在这里插入图片描述
new 是在堆空间中创建

String s = new String(“abc”); 方式创建对象,在内存中创建了几个对象?两个:一个是堆空间new的结构,另一个是char[]对象常量池中的数据:“abc”

package StringTT;

import org.junit.Test;

public class StringTest2 {




	@Test
	public void test(){
	//方式一:通过字面量定义
		String s1 = "javaEE";
		String s2 = "javaEE";

	// 方式二:用new 在堆空间中创建
	
		String s3 = new String("javaEE");
		String s4 = new String("javaEE");
	
		System.out.println(s1 == s2);  // true
		System.out.println(s3 == s4);  // false
	
	}
}	

常量与常量的拼接结果在常量词中,常量与变量拼接,结果就会在堆当中

@Test
public void test1(){
	String s1 = "javaEE";
	String s2 = "hadoop";
	
	String s3 = "javaEEhadoop";
	String s4 = "javaEE" + "hadoop";
	String s5 = s1 + "hadoop";
	String s6 = "javaEE" + s2;
	String s7 = s1 + s2;
	
	System.out.println(s3 == s4); // true
	System.out.println(s3 == s5); // false
	System.out.println(s3 == s6); // false
	System.out.println(s3 == s7); // false
	System.out.println(s5 == s4); // fasle
	System.out.println(s5 == s6); // fasle
	System.out.println(s5 == s7); // fasle
	
	String s8 = s5.intern(); // 得到的是在常量池
	System.out.println(s8 == s3); // true 
}

String 方法

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

String 和 char[] 的转换

  • String 转 char[] 用 String.toCharArray()方法

  • char[] 转 String 调用String 的构造器

    package StringTT;

    import org.junit.Test;

    public class StringTest1 {
    // String 和 byte的转换
    @Test
    public void test123(){
    String str1 = “abc123”;
    char[] charArray = str1.toCharArray();
    for (int i = 0;i < 100; i++){
    System.out.println(charArray[i]);
    }
    }

      @Test
      public void test2(){
      	char[] ch1 = new char[]{'h','e','l','l','o'};
      	String str2 = new String(ch1);
      	System.out.println(str2);
      }
    

    }

String 和 byte[] 的转换

有中文的话就转不了一个数字了
编码 :字符串 --> 字节 (看得懂 -->看不懂)String 转 byte[] 用String的getBytes()方法
解码:字节 – > 字符串(看不懂的二进制 – > 看得懂)byte[] --> String
解码过程中,必须与编码所使用的字符集一致

package StringTT;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

import org.junit.Test;

public class StringTest1 {
	// String  和 byte的转换
	@Test
	public void test123(){
		String str1 = "abc123";
		char[] charArray = str1.toCharArray();
		for (int i = 0;i < str1.length(); i++){
			System.out.println(charArray[i]);
		}
	}


	@Test
	public void test2(){
		char[] ch1 = new char[]{'h','e','l','l','o'};
		String str2 = new String(ch1);
		System.out.println(str2);
	}


	@Test
	public void test3() throws UnsupportedEncodingException{
		String str1 = "abc123中国";
		byte[] b1 = str1.getBytes(); // 使用默认的字符集进行转换
		System.out.println(Arrays.toString(b1)); //输出
	
		byte[] b2 = str1.getBytes("gbk"); //使用gbk字符集进行编码
		System.out.println(Arrays.toString(b2));
	
		//解码 byte[] --> String
		String s1 = new String(b1); // 默认的字符集进行解码
		System.out.println(s1);
	}
}

StringBuffer 、StringBuilder、String 异同

  • String 不可变的字符序列,底层用char[]进行存储
  • StringBuffer 可变的字符序列,线程安全的,效率偏低,底层用char[]进行存储
  • StringBuilder 可变的字符序列,JDK5.0新增,线程不安全,效率高,底层用char[]进行存储

源码分析

String str = new String();//char[] value = new char[0];
String str = new String(“abc”); // char[] value = new char[]{‘a’,‘b’,‘c’};

StringBuffer str = new StringBuffer();//char[] value = new char[16]; 底层创建了一个长度是16的字符数组

StringBuffer str1 = new StringBuffer(“abc”); // char[] value = new char(“abc”.length + 16) 创建了长度为19的字符数组

问题1:打印str1的长度是多少呢?还是3
问题2:如果要添加的数据,底层数据盛不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的两倍+2,同时将原有数组的元素复制到新数组中

指导意义:开发中建议使用StringBuffer(int capacity) 或 StringBuilder(int capacity) ,就看需不需要考虑安全

package StringTT;

import org.junit.Test;

public class StringBufferBuiderTest {
	@Test
	public void test(){
	StringBuffer sb1 = new StringBuffer("abc");
	sb1.setCharAt(0, 'm');
	System.out.println(sb1);

	String s1 = "abc";
	s1.replace('a','m');
	System.out.println(s1); //s1不变
	}
}

在这里插入图片描述
public String substring – 返回一个start 开始 end索引结束的左闭右开区间的子字符串

在这里插入图片描述

效率从高到低排列:StringBuilder > StringBuffer > String

JDK8.0之前 日期和时间API

@Test
public void test(){
	long time = System.currentTimeMillis();
	System.out.println(time);  //1970/1/1 到我们现在的时间差 毫秒数,通常叫一个时间戳
}

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

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

相关文章

蓝牙耳机什么牌子的好用?口碑比较好的国产蓝牙耳机推荐

对于那些经常戴耳机的人来说&#xff0c;戴上一副舒服的耳机是非常必要的。所以&#xff0c;那些口碑好&#xff0c;佩戴舒适的蓝牙耳机让大多数人都有了很好的体验感。人们之所以如此喜爱蓝牙耳机&#xff0c;一方面是因为其小巧而精致&#xff0c;另一方面则是因为其便于携带…

前端——router路由

1.路由配置 在store文件夹下&#xff0c;新建index.js文件中配置路由 /* vue3中 路由配置 */ //1.path&#xff1a;与vue2中子路由path不带“/”不同的是&#xff0c;vue3这里子路由path带了"/" //这样vue3中路由访问路径也就不是嵌套的&#xff0c;虽然路由配置这…

【深度学习】实验3答案:PyTorch实战——CIFAR图像分类

DL_class 学堂在线《深度学习》实验课代码报告&#xff08;其中实验1和实验6有配套PPT&#xff09;&#xff0c;授课老师为胡晓林老师。课程链接&#xff1a;https://www.xuetangx.com/training/DP080910033751/619488?channeli.area.manual_search。 持续更新中。 所有代码…

Python采集天气数据,做可视化分析【附源码】

知识点: 动态数据抓包requests发送请求结构化非结构化数据解析 开发环境: python 3.8 运行代码pycharm 2021.2 辅助敲代码requests 如果安装python第三方模块: win R 输入 cmd 点击确定, 输入安装命令 pip install 模块名 (pip install requests)回车在pycharm中点击Term…

RocketMQ 5.0 API 与 SDK 的演进

作者&#xff1a; 艾阳坤 RocketMQ 5.0 SDK 采用了全新的 API&#xff0c;使用 gRPC 作为通信层的实现&#xff0c;并在可观测性上做了很大幅度的提升。 全新统一的 API 此处的 API 并不单单只是接口上的定义&#xff0c;同时也规定了各个接口不同的方法和行为&#xff0c;明…

【案例实战】分布式应用下登录检验解决方案(JWT)

文章目录1.需求背景以及JWT简介2.创建Maven项目&#xff0c;搭建SpringBoot项目3.容器化急速部署MySQL4.数据库表准备5.SpringBoot整合MySQLMyBatisPlus6.MyBatisPlus逆向工程自动生成7.SpringBoot整合JWT8.开发测试接口9.开发登录接口10.开发登录拦截器11.启动验证1.需求背景以…

cookie介绍:cookie实现增删改查功能

1、cookie介绍 只能存储文本&#xff0c;只能实现在本地的存储&#xff1b;单条存储有大小限制4kB左右&#xff0c;数量限制&#xff08;一般浏览器&#xff0c;限制大概在50条左右&#xff09;&#xff1b;读取有域名限制&#xff1a;不可跨域读取&#xff0c;只能由来自写入…

集成学习与随机森林

1、集成学习概念 集成学习(ensemble learning)是一类机器学习框架&#xff0c;通过构建并结合多个学习器来完成学习任务。一般结构是&#xff1a;先产生一组“个体学习器”&#xff0c;再用某种策略将它们结合起来。结合策略主要有平均法、投票法和学习法等 集成学习包含三个…

仿大众点评——秒杀系统部分01

秒杀系统 全局ID生成器 全局唯一ID生成策略&#xff1a; UUIDRedis自增snowflake算法数据库自增 这里使用Redis自增的数值&#xff0c;并拼接一些其它信息 Redis自增ID策略&#xff1a; 每天一个key&#xff0c;方便统计订单量ID构造是 时间戳 计数器 ID的组成部分&#…

Unity接入日志插件Log4Net

前言 log4net是一个日志插件&#xff0c;可以帮助我们把控制台输出的日志写入到本地。这个功能说简单就简单&#xff0c;说复杂其实还挺复杂。 为什么这么说呢&#xff0c;首先文件写入本地确实简单&#xff0c;但是如果你要实现一下功能就没那么简单了。 1.把每行日志按照指…

2022年“新一代”设备管理系统——支持低代码平台

在现代化企业的信息化管理体系建设中&#xff0c;设备管理系统被看作是重中之重。因为设备是工厂的主要生产要素&#xff0c;而且随着生产设备的日益增多&#xff0c;设备的重要性日益凸显。如何妥善管理这些设备也成了企业管理者经常考虑的问题。单纯依靠人工管理逐渐不能满足…

uniapp实现下拉刷新及上拉(分页)加载更多(app,H5,小程序均可使用)

开门见山地说&#xff0c;在移动端开发中&#xff0c;80%的项目都会涉及到列表展示&#xff0c;而有了列表不可避免的需求就是列表的下拉刷新和上拉加载更多。本篇文章主要介绍在使用uniapp开发移动端的过程中&#xff0c;比较好用的一个下拉及上拉组件&#xff0c;节约大家选择…

5.2启动内存分页机制,畅游虚拟空间

5.2启动内存分页机制&#xff0c;畅游虚拟空间 即使机器上只有512MB的内存&#xff0c;每个进程自己的内存空间也是4GB&#xff0c;这4GB便是指的虚拟内存空间。下面就是讲解虚拟内存空间是怎么来的。 5.2.1内存为什么要分页 问题场景&#xff1a;由于多进程的发展&#xff…

软考 - 计算机组成与结构

数据计算 数据的进制转化 十六进制符号 0X 或 H&#xff0c;可表示为0x18F 或 18FH m进制转n进制&#xff1a;先将m进制转化为十进制数&#xff0c;再将十进制数转化为n进制数&#xff08;2进制可直接转8进制&#xff08;3位&#xff09;和16进制&#xff08;4位&#xff09…

Python如何自动操作电脑桌面应用程序

前言 本文是该专栏的第2篇,后面会持续分享python的各种黑科技知识,值得关注。 熟悉python的朋友,都知道python可以做自动化,比如说selenium,pyppeteer,airtest等等。 但你是否听说过python可以来自动操作电脑桌面的应用程序呢,趟若临时接到某个需求,让你用python脚本…

基于zynq7100的OV5640摄像头照相机实验,提供工程源码和技术支持

目录1.设计架构2.工程简介3.zynq配置4.sd卡文件系统FATFS配置5.sd卡文件系统FATFS读写测试6.OV5640摄像头显示测试7.OV5640摄像头循环拍照测试8.OV5640摄像头按键拍照测试9.上板调试10.福利领取1.设计架构 设计框图如下&#xff1a; 采用Xilinx官方推荐的VDMA架构实现图像缓存…

TiDB丨一次TiDB GC阻塞引发的“惨案”......

前不久&#xff0c;从项目一线同学得到某集群的告警信息&#xff0c;某个时间段 TiDB duration 突然异常升高&#xff0c;持续时间6小时左右&#xff0c;需要定位到具体原因。 于是乎&#xff0c;我们就来一场关于TiDB GC阻塞的排查...... 分析过程 第一招 初步判断 既然…

Docker+nginx在CVM的机器远程发布hellogin

有两种方式&#xff0c;一种通过docker容器安装&#xff0c;一种是直接安装, 这里我们通过docker服务安装 常用操作 images是查询当前机器上所有的镜像有哪些 docker images删除镜像 docker rmi [MAGE ID ]可以查当前运行中的容器 docker ps -a开始/停止/删除容器 docker…

动态树的最值

一 问题描述 一棵树有 N 个节点&#xff0c;每个节点都有一个权值 Wi &#xff0c;有 4 种操作。 ① 1 x y &#xff0c;在两个节点 x、y 之间添加一条新边。因此&#xff0c;在这种操作之后&#xff0c;两棵树将连接成一棵新树。 ② 2 x y &#xff0c;在树集合中找到包含节…

LeetCOde-剑指46-把数字翻译成字符串

1、动态规划法 我们通过观察可以发现&#xff0c;假如我们使用数组dp[i]dp[i]dp[i]来记录前iii位可能构成的字符串个数&#xff1a;1、当新加入的第i1i1i1位和第iii位能够构成一个大于9小于26的数字时&#xff0c;dp[i1]dp[i]dp[i−1]dp[i1]dp[i]dp[i-1]dp[i1]dp[i]dp[i−1]&a…