Java常用类(一)

news2025/1/31 11:17:13

目录

字符串相关的类

一、String

String的特性

String不可变性的体现

String的实例化方式一:字面量的定义方式

String实例化方式二:通过new构造器的方式

 字符串的特性

 String使用陷阱

面试题

 String的常用方法

​编辑 String与基本数据类型转换

String与字符数组的转换

 String与字节数字转换

二、StringBuffer类(线程安全)

源码分析

StringBuffer扩容问题

StringBuffer常用方法

三、StringBuilder类(线程不安全)

String、StringBuffer、StringBuilder的区别


字符串相关的类

一、String

String类:代表字符串。Java程序中所有字符串字面值都作为此类的实例实现。

字符串是常量,用双引号引起来表示,它的值在创建后不能更改。 

String的特性

  • String实现了Serializable接口,表示字符串是支持序列化的
  • String实现了Comparable接口,表示字符串是可比较大小的
  • String是一个final的,表示不可变序列,且不可以被继承。
    • 实质:String内部定义了final char[] value用于存储字符串内容
  • 当字面量(区别于new)赋值方式给字符串赋值时,此时字符串声明在字符串常量池中
    • 字符串常量池中不会存储两个相同内容的字符串

String不可变性的体现

  • 当字符串重新赋值时,需要重新指定内存区域赋值,不能使用原有的value赋值
  • 当对字符串进行连接操作时,也需要重新指定内存赋值,不能使用原有的value赋值
  • 当调用String的replace()方法修改值ID那个字符串是,也需要重新指定内存区域赋值

String的实例化方式一:字面量的定义方式

import org.junit.Test;


public class StringTest {
    @Test
    public void test1(){
        String s1="abc";//字面量的定义方式
        String s2="abc";
        s1="hello";
        System.out.println(s1 == s2);//比较地址值
        System.out.println(s1);//hello
        System.out.println(s2);//abc
    }
}

输出结果为

内存解析

String实例化方式二:通过new构造器的方式

import org.junit.Test;



public class StringTest {
     @Test
    public void test2(){

        //* 方式一:通过字面量定义的方式
        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(s1 == s3);//false
        System.out.println(s3 == s4);//false
        System.out.println(s1 == s4);//false
    }
}

运行结果为

内存解析

 

 字符串的特性

  • * 1、常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量
  • * 2、只要其中有一个是变量,结果就在堆中
  • * 3、如果拼接的结果调用intern()方法,返回值就在常量池中

 

import org.junit.Test;
public class StringTest {
  @Test
    public void test3(){
        String s1="java";
        String s2="ee";

        String s3="javaee";
        String s4="java"+"ee";
        String s5=s1+"ee";
        String s6="java"+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(s4 == s5);//false
        System.out.println(s3 == s7);//false

        String s8=s5.intern();//返回值的得到的s8使用的常量值中已经存在的"javaee "
        System.out.println(s3 == s8);//true

    }
}

运行结果 

true
false
false
false
false
true

 String使用陷阱

  • String s1 = "a";
    • 说明:在字符串常量池中创建了一个字面量为"a"的字符串。
  •  s1 = s1 + "b";
    • 说明:实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符串s1+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能。
  • String s2 = "ab";
    • 说明:直接在字符串常量池中创建一个字面量为"ab"的字符串。
  • String s3 = "a" + "b";
    • 说明:s3指向字符串常量池中已经创建的"ab"的字符串。
  • String s4 = s1.intern();
    • 说明:堆空间的s1对象在调用intern()之后,会将常量池中已经存在的"ab"字符串赋值给s4。

面试题

String s=new String("abc");方式创建对象,在内存中创建了几个对象?

  答:两个:一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:"abc"

 String的常用方法

 

 String与基本数据类型转换

字符串--->基本数据类型、包装类

  • Interger包装类的public static parseInt(String s):可以将“数字”字符组成的字符串转换为整型
  • 类似的使用java.lang包下的Byte、Short、Long、Double、Float类调用相应的类方法可以将“数字”字符组成的字符串转换为相应的基本数据类型

基本数据类型、包装类---->字符串 

  • 调用String类的public String valueOf(int n):可以将int型转换为字符串
  • 相应的valueOf(byte b)、valueOf(long l)、 valueOf(float f) 、valueOf(double d)、 valueOf(boolean b)可有参数的相应类型到字符串的转换

String与字符数组的转换

字符数组--->字符串

调用String类的构造器:String(char[]) String(char[],int offset,int length)分别用字符数组中的全部自负和部分字符创建字符串对象

字符串--->字符数组

  • public char[] toCharArray():将字符串的全部字符存放在一个字符数组中
  • public void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin):提供了将指定索引范围的字符串存放到数组中的方法

 String与字节数字转换

字节数组--->字符串(调用String的构造器)

  • String(byte[]):使用平台的默认字符集解码指定的btye数组,构造一个新的String
  • String(byte[],int offset,int length):用指定的字节数组的一部分,即从数组起始位置offset开始取length个字节构造一个字符串对象

字符串--->字节数组

  • public byte[] getBytes():使用平台默认字符集将此String编码为byte序列,并将结果存储到一个新的byte数组中
  • public byte[] getBytes(String charsetName):使用指定的字符集将此String编码到byte序列,并将结果存储到新的byte数组
package com.light.java;

import org.junit.Test;

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

public class StringTest {

 /**
     * String与byte[]之间的转换
     * 编码:字符串---->字节
     * String--->byte[]:调用String的getBytes()
     *
     * 解码:编码的逆过程,字节---->字符串
     * byte--->String:调用String的构造器
     * 说明:解码时使用的字符集必须与编码时所使用的字符集一致,否则会出现乱码
     */
    @Test
    public void test4() throws UnsupportedEncodingException {
        String str1="abc123战国";
        System.out.println("********编码*********");
        //编码
        byte[] bytes = str1.getBytes();//使用默认字符集编码(utf-8)
        System.out.println(Arrays.toString(bytes));

        byte[] gbks = str1.getBytes("gbk");//使用gbk字符集进行编码
        System.out.println(Arrays.toString(gbks));

        System.out.println("********解码*********");
        //解码
        //调用String的构造器
        String s = new String(bytes);//默认(utf-8)
        System.out.println(s);
        String s1 = new String(gbks,"gbk");//gbk字符集解码
        System.out.println(s1);
    }
}

运行结果为

二、StringBuffer类(线程安全)

java.lang.StringBuffer代表可变字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新对象

StringBuffer内部也是用char[]存储 

源码分析

  •  StringBuffer str2=new StringBuffer();//char[] value=new char[16];
    • 底层创建了长度为16的字符型数组
  • * StringBuffer str3=new StringBuffer("abc");//char[] value=new char["abc".length+16];
    • 底层创建了长度为"abc".length+16的字符型数组

StringBuffer扩容问题

如果要添加的数据底层装不下,那就需要扩容数组,默认情况下,扩容为原来的两倍+2,同时将原有数组复制到新数组中

StringBuffer常用方法

增: StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接

删:StringBuffer delete(int start,int end):删除指定位置的内容 [)

改: public char charAt(int n )

插:StringBuffer insert(int offset, xxx):在指定位置插入xxx

长度:public int length()

三、StringBuilder类(线程不安全)

StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样

String、StringBuffer、StringBuilder的区别

 * String:不可变的字符序列,底层用char[]存储

* StringBuffer:可变的字符序列,线程安全的,效率低,底层用char[]存储

* StringBuilder:可变的字符序列,线程不安全的,效率高,JDK5.0新增,底层用char[]存储

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

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

相关文章

TFT-LCD LVGL官方例程的应用

TFT-LCD LVGL官方例程的应用 移植完lvgl的源码和驱动后,就可以试着调用lvgl的官方例程来运行了;例程的目录如下 官方demo是一些比较完整的界面,文件夹里面有.gif的动态图展示,而类型和小部件适合根据需要做一个自己喜欢的界面&am…

TensorRT--学习笔记

官方文档是最权威的TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个C推理框架。利用Pytorch、TF或者其他框架训练好的模型,可以转化为TensorRT的格式,然后利用TensorRT推理引擎去运行我们这个模型,从而提升这个模型在英伟达GPU上运行的速…

【学习笔记38】JavaScript中的本地存储

一、localStorage 浏览器的本地存储(永久存储), 打开浏览器存储上之后, 关闭浏览器, 信息还在语法:window.localStorage.setItem(key, value)注意: value的值必须为字符串key的书写符合见名知意 window.localStorage.setItem(ceshi1, 1111111);window.localStorage.…

16.预处理、动态库、静态库

C语言编译过程 1.预处理 将.c中的头文件展开、宏展开 生成的文件是.i文件 2.编译 将预处理之后的.i文件生成.s汇编文件 3.汇编 将.s汇编文件生成.o目标文件 4.链接 将.o文件链接成目标文件(可执行程序) Linux下GCC编译器编译过程 gcc -E hello.c -o he…

C++11标准模板(STL)- 算法(std::upper_bound)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 返回指向第一个大于给定值…

[附源码]Python计算机毕业设计钓鱼爱好者交流平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Java项目:电器商城系统(java+SSM+JSP+jQuery+javascript+Mysql)

源码获取&#xff1a;俺的博客首页 "资源" 里下载&#xff01; 项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 修改个人信息,员工信息管理,商品管理,图片管理,图表管理,用户…

解决vscode远程安装插件不了、安装太慢问题

一、问题描述 一直显示正在安装&#xff0c;几个小时也没动静&#xff0c;特别是那个c/c插件的安装。 二、解决方法 1、采用手动安装插件的方式 步骤&#xff1a; ①、先去这个网站找你要安装的插件&#xff0c;然后下载到本地电脑。 All categories Extensions - Visual Studi…

分汤000

题目链接 分汤 题目描述 注意 没有提供 0ml 的 汤A 和 100ml 的 汤B 这种操作如果汤的剩余量不足以完成某次操作&#xff0c;我们将尽可能分配 解答思路 由题意得&#xff0c;首先想到的是动态规划&#xff0c;关键是规律以及终止条件是怎样的由于分汤都是在25的倍数上进行…

内点法最优潮流matlab程序

内点法最优潮流matlab程序 一、概述最优潮流问题 1.最优潮流和基本潮流的比较潮流计算可以归结为针对一定的扰动变量p(负荷情况)&#xff0c;根据给定的控制变量u(如发电机的有功出力、无功出力或节点电压模值等)&#xff0c;求出相应的状态变量x(如节点电压模值及角度)&#x…

如何控制MySQL事务提交后,刷redo-log的策略?

既然涉及到事务提交&#xff0c;那么我们就是以InnoDB来说明的。 MySQL有一个参数&#xff0c;能够控制事务提交时&#xff0c;刷redo log的策略。该参数为&#xff1a;innodb_flush_log_at_trx_commit。 策略1,set global innodb_flush_log_at_trx_commit 0 该方式可以获得…

天然气潮流计算matlab程序

天然气潮流计算matlab程序 1 天然气潮流计算理论 由于天然气涉及到流体的运动方程&#xff0c;直接计算非常复杂&#xff0c;因此需要提前做出一些假设来简化计算&#xff0c;经过研究&#xff0c;适当的假设对结果影响很小&#xff0c;因此本文对天然气系统做出如下假设&#…

安装包UI美化之路-进度条的多种配置方法

安装包的进度条&#xff0c;你真正关心过么&#xff1f; 你知道如何配置出美观的进度条么&#xff1f;遇到特殊的进度条需求&#xff0c;你知道怎么实现么&#xff1f; 安装包的美化过程中&#xff0c;有一个细节比较重要&#xff0c;那就是进度条的呈现样式&#xff01; 呈现…

3、网关和BFF

一、网关和BFF的演进 v1 使用nginx负载均衡简单的微服务体系&#xff1b; v2 nginx直接暴露 v2.5无线BFF v3 集群BFF无线网关 v4无线网关、无线BFF根据业务集群化&#xff0c;废弃nginx集群 二、网关和反向代理 网关和反向代理的选择&#xff1a; 关于网关集群问题&#…

【自动化持续集成必备基础】pipeline常用功能

简介 ​pipeline是一套运行在jenkins上的工作流框架&#xff0c;可以实现复杂流程的编排和可视化运行 pipeline支持两种语法&#xff1a;Declarative Pipeline(声明式流水线)和Scripted Pipeline (脚本式流水线) 本文重点介绍主流的声明式流水线 创建流水线项目 在Jenkins中如果…

SpringBoot SpringBoot 原理篇 2 自定义starter 2.4 使用属性配置设置功能参数【1】

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 原理篇 文章目录SpringBootSpringBoot 原理篇2 自定义starter2.4 使用属性配置设置功能参数【1】2.4.1 直接开干2.4.2 小结…

linux驱动之调试技巧--- 应用程序远程gdb+vscode调试应用程序, 串口kgdboc调试.ko驱动程序

环境: Ubuntu: Ubuntu 22.04.1 开发板: imx6ull linux内核版本: Linux4.9.88 虚拟机: vmware15 交叉编译工具gcc版本: 4.9.4 (Linaro GCC 4.9-2017.01) arm-linux-gdb版本: gdb (Linaro_GDB-2017.01) 7.10.1.20160210 先决条件 开发板 虚拟机 PC 可互通网络 交叉编译环境已经搭…

哈希(Hash)

文章目录一、哈希是什么&#xff1f;二、哈希冲突三、开放定址法1.线性探测2.二次探测四、拉链法/哈希桶五、哈希的应用1.位图1.1 面试题1.2 位图概念1.3 位图的应用2.布隆过滤器2.1概念2.2布隆过滤器的查找2.3布隆过滤器的删除一、哈希是什么&#xff1f; Hash&#xff0c;一般…

语音识别系列︱利用达摩院ModelScope进行语音识别+标点修复(四)

终于有时间更新语音识别系列了&#xff0c;之前的几篇&#xff1a; 语音识别系列︱用python进行音频解析&#xff08;一&#xff09; 语音识别系列︱paddlehub的开源语音识别模型测试&#xff08;二&#xff09; 语音识别系列︱paddlespeech的开源语音识别模型测试&#xff08;…

1. JVM类加载机制

1. JVM类加载机制图解 下面我们来详细分析一下这个图解 1.1 其中loadClass()方法的调用的类加载的过程有如下几步 加载->验证->准备->解析->初始化->使用->卸载 加载&#xff1a;在硬盘上查找并通过IO读入字节码文件&#xff0c;当使用到这类的时候才会加…