Java基础05

目录

一、引入

插入方法currentTimeMillis()的介绍

二、详细介绍

1.String

2.StringBuilder

①StringBuilder与String的区别

②StringBuilder的常用方法

3.StringBuffer

拓展(缓冲区)

三、对比

1.⭐String,StringBuffer,StringBuilder三种有什么区别(概括):⭐

详细介绍版本:

①不可变性‌:

②线程安全性‌:

③‌性能‌:

④‌使用场景‌:

四、扩展

1.内存页⭐

2.⭐弱类型语言⭐


一、引入

在介绍String,StringBuffer,StringBuilder这三种之前,先通过一段代码来引进初步概念:

一下提供了两种字符串拼接的方法,一种只是原始String拼接,另一种则是借助可变的字符序列StringBuilder的append()方法实现字符串拼接,并计算两者运算之间时间差距。

public static void main(String[] aa) {long starttime=System.currentTimeMillis();String str="";for(int i=0;i<100;i++){str+="a";//原始字符串拼接方法①}StringBuilder str2=new StringBuilder();for(int i=0;i<100;i++){str2.append("a");//append()方法拼接的速度远远大于上面的原始拼接②}System.out.println(str);System.out.println(str2);long endtime=System.currentTimeMillis();long timeall=endtime-starttime;System.out.println("总计花费时间:"+(timeall));}

【注:上述计算时间差应用的方法是currentTimeMillis()】

插入方法currentTimeMillis()的介绍

currentTimeMillis()是‌Java中的一个静态方法,属于System类;该方法返回自1970年1月1日午夜(协调世界时)以来经过的毫秒数(注意返回类型是long类型的)。

所以可以用于以下场景:

  • 时间戳‌:currentTimeMillis()返回的时间戳常用于生成时间相关的数据,例如记录日志时间、生成时间戳等。
  • ‌性能测试‌:通过在代码执行前后调用currentTimeMillis(),可以测量代码段的执行时间。例如,测量一段代码的执行时间,可以在代码执行前后分别调用currentTimeMillis(),然后计算两者之差。
  • ‌线程控制‌:在多线程编程中,currentTimeMillis()可以用来控制线程的休眠时间,或者用于控制屏幕刷新的频率等。
  • ‌生成唯一文件名‌:通过结合当前时间生成文件名,可以确保文件名的唯一性,避免重名。

基于上述时间戳的功能,在这段代码中,记录开始时间与结束时间求得时间差。

回归正传,上述代码的运行①和②时间差中,①String花费的时间远远超过②StringBuilder,接下来开始介绍其中的缘由。

二、详细介绍

1.String

String是Java中表示文本的类,它是不可变的,这意味着一旦创建了String对象,就不能更改它的内容。

2.StringBuilder

StringBuilder‌是一个可变的字符序列,提供了一系列方法来构建和修改字符串,而不需要创建新的字符串对象,从而提高了字符串操作的效率。在Java中,当需要在循环中构建字符串时,使用StringBuilder可以显著提高性能,因为它避免了在每次循环中创建新的字符串对象。(打破了String类型每次更改都需要申请新的空间的问题)

①StringBuilder与String的区别

  • ‌性能‌:StringBuilder在单线程环境下比String更高效,因为它允许在原有字符串的基础上进行修改,避免了创建新的字符串对象。
  • ‌线程安全‌:StringBuilder不是线程安全的,而String和StringBuffer是线程安全的。如果多个线程需要访问同一个StringBuilder对象,可能会导致数据不一致。

②StringBuilder的常用方法

  • ‌append()‌:将指定的字符串添加到StringBuilder对象的末尾【引入中所用】。
  • ‌insert()‌:在指定位置插入字符串。
  • ‌delete()‌:删除指定位置的字符。
  • ‌reverse()‌:反转StringBuilder中的字符序列。
  • ‌capacity()‌:设置或获取StringBuilder的容量。

3.StringBuffer

StringBuffer是StringBuilder类的前身,是一个字符缓冲区,用于存储和操作字符串。与String类不同,StringBuffer的对象是可以扩充和修改的,它使用缓冲区来存储字符串数据‌。这意味着,当需要频繁修改字符串内容时,使用StringBuffer会更加高效。

StringBuffer通过使用缓冲区来存储字符串数据。与String类不同,StringBuffer的内容是可以改变的。在StringBuffer中,可以使用append()方法进行字符串的连接操作,这使得它非常适合用于需要频繁修改字符串内容的场景。

拓展(缓冲区)

Buffer:一般名字类里带Buffer的,就是缓冲区,速度和节省空间的能力都很优秀,并不局限于StringBuffer。

三、对比

1.⭐String,StringBuffer,StringBuilder三种有什么区别(概括):⭐

  • StringBuffer,StringBuilder速度远远高于String;
  • StringBuilder多线程并发操作不安全和StringBuffer多线程并发操作下安全;
  • StringBuffer里面加了锁,速度稍微慢一点点;

详细介绍版本:

①不可变性‌:
  • ‌String‌:String对象是不可变的,一旦创建就不能被修改。任何对字符串的操作都会生成一个新的String对象‌。
  • ‌StringBuffer‌和‌StringBuilder‌:这两个类都是可变的,可以在原始字符串上进行修改,无需创建新的对象‌。
②线程安全性‌:
  • ‌String‌:是线程安全的,因为它的方法在内部使用了同步机制,适用于多线程环境‌。
  • ‌StringBuffer‌:也是线程安全的,适用于多线程环境‌。
  • ‌StringBuilder‌:不是线程安全的,适用于单线程环境‌。
③‌性能‌:
  • String‌:由于每次操作都会生成新的对象,执行速度较慢,且内存使用效率较低‌。
  • ‌StringBuffer‌:执行效率较慢,但线程安全‌。
  • ‌StringBuilder‌:执行效率较高,但线程不安全‌。
④‌使用场景‌:
  • ‌String‌:适用于少量的字符串操作或在单线程环境中使用。
  • ‌StringBuffer‌:适用于多线程环境中的字符串操作,虽然效率较低,但保证了线程安全。
  • ‌StringBuilder‌:适用于单线程环境中的大量字符串操作,因为其执行效率较高。

四、扩展

1.内存页⭐

CPU与内存交换数据太过频繁,但是同一时间只能通过如下一条线路进行交换,为了解决这种问题提高效率,引进了内存页。

‌内存页的大小由特性决定:内存页越大,读取的次数就越少,即读取速度就越快,同时内存页越大,浪费的空间就越多,为了中和读取速度和空间浪费这两种关系,最终选定4KB为一个内存页的存储空间。(每个内存页占据4KB)

为此,操作系统所能调度的最小分配单元是4KB。

每个内存页对外只有一个总地址,即如下箭头所指的开头位置(即:每个内存页只能属于一个变量,不能属于其他变量,唯独填入数组的情况下,一个内存页可以好几个同类型的变量使用,所以数组的使用可以节省内存)

即:如下

所以,int a=9;看似只需要32bit的内存,实际上会被分配4KB的内存。

2.⭐弱类型语言⭐

e.g Python,php,js等不区分数组类型,但是弱类型语言最终是要被转化成C语言的,因为C语言是区分类型的,转化过程中还是需要分类的,十分消耗内存页,消耗内存十分大。

5.有了以上概念,就可以接着分析String,由于String的不可变特性,导致每次操作都会去申请新的空间,对内存的消耗十分巨大。

改善方法:更改本地、缓冲区(Buffer)

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

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

相关文章

033_Structure_Static_In_Matlab求解结构静力学问题两套方法

结构静力学问题 静力学问现在是已经很简单的问题&#xff0c;在材料各向同性的情况下&#xff0c;对于弹性固体材料&#xff0c;很容易通过有限元求解。特别是线弹性问题&#xff0c;方程的矩阵形式可以很容易的写出&#xff08;准确得说是很容易通过有限元表达&#xff09;&a…

Zabbix Agent端安装部署

文章目录 1. 功能概述2. 版本说明3. Agent安装说明4. Agent2安装说明 Zabbix Agent是Zabbix监控系统中的一个重要组件&#xff0c;它部署在被监控的目标主机上&#xff0c;负责收集主机的各类数据&#xff08;如性能指标、日志信息等&#xff09;&#xff0c;并将这些数据发送到…

C#/WinForm 鼠标穿透自定义区域截图(后续实现录屏)

效果 窗体截图录屏 git地址&#xff1a;https://gitee.com/feng-cai/screenshot-recording

Golang文件操作

1.文件介绍&#xff1a;文件是数据源&#xff0c;主要作用是保存数据 2.文件在程序中是以流的形式来操作的 对文件的操作主要用File(os包)结构体来实现 文件的基本操作 1&#xff09;打开一个文件进行读操作&#xff1a; os.Open(name string)(*File,error) 2&#xff09;关…

8. 数据结构——邻接表、邻接矩阵的基本操作

一、邻接表 1. 内容 2. 实现代码(直接可以复制使用) //邻接表的相关操作 #include<bits/stdc.h> #define MVnum 100 #define OK 1 #define ERROR -1 using namespace std;typedef int Status; typedef char VerTexType; //假设顶点的数据类型为char typedef int ArcT…

【问题记录】当机器人存在多个串口需要绑定时udevadm的作用

一、正常绑定 输入sudo udevadm info -a /dev/ttyUSBx | grep KERNELS 命令 会出现KERNELS的编号&#xff0c;记录编号。 修改规则文件/etc/udev/rules.d/99-usb.rules 添加以下命令 KERNEL"ttyUSB*", KERNELS"2-1.2:1.0", MODE:"0666", GROU…

快消品行业数字化转型:定制开发 S2B2C 商城小程序的主战场选择与突破

摘要&#xff1a;在快消品行业数字化转型的背景下&#xff0c;企业内部各部门虽积极尝试数字化但效果欠佳&#xff0c;核心问题在于数字化规模小难以实现企业整体转型&#xff0c;快消品龙头企业更为突出。定制开发 21 链动模式 S2B2C 商城小程序为解决这一问题提供了新途径。该…

Windows、Linux系统上进行CPU和内存压力测试

CPU和内存压力测试 1. Linux环境 Linux环境下&#xff0c;我们可以用 stress 工具进行内存、CPU等的压力测试。 【1】. stress工具说明 [kalamikysrv1 ~]$ stress --help stress imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-…

STM32使用串口下载程序

STM32使用串口下载程序 FluMcu软件下载地址 单片机在线编程网 STM32 MCU启动模式配置(Boot Configuration) 单片机复位后&#xff0c;SYSCLK的第4个上升沿&#xff0c;BOOT引脚上的值将锁存&#xff0c;用户可以通过设置BOOT0和BOOT1引脚的值&#xff0c;来选择复位后的启动…

每天五分钟深度学习pytoroch:基于pytorch搭建逻辑回归算法模型

本文重点 前面我们学习了线性回归模型的搭建,无论是基于pytorch还是不基于pytorch,以上的模型都是回归模型,本文我们将使用pytorch搭建逻辑回归模型,逻辑回归模型是一个经典的分类问题。 模型搭建 class LogisticRegression(nn.Module) : def __init__(self) :super (Lo…

Mybatis-18.动态SQL-sqlinclude

一.sql&include 为什么需要<sql>和<include>标签&#xff1f; 这是因为这些代码是重复的&#xff0c;能够消除重复会提高代码的可读性和效率。 那我们就可以使用<sql>标签对这些片段进行一个抽取。然后在原来抽取的地方再将这个<sql>片段引用进来。…

探索开源MiniMind项目:让大语言模型不再神秘(1)

简介&#xff1a; 声明&#xff1a;本人非此项目作者&#xff0c;仅仅是探索项目&#xff0c;分享项目。如有不妥&#xff0c;请联系我删除&#xff01; 原项目地址&#xff1a;GitHub - jingyaogong/minimind: 「大模型」3小时完全从0训练26M的小参数GPT&#xff0c;个人显卡即…

HTML 基础标签——文本内容标签 <ul>、<ol>、<blockquote> 、<code> 等标签的用法详解

文章目录 1. 标题标签2. 段落标签3. 文本格式化标签4. 列表标签4.1 无序列表 `<ul>`4.2 有序列表 `<ol>`5. 引用标签5.1 块引用 `<blockquote>`5.2 行内引用 `<q>`5.3 作品引用 `<cite>`6. 代码和预格式文本标签6.1 代码标签 `<code>`6.2 …

qt QMenuBar详解

1、概述 QMenuBar是Qt框架中用于创建菜单栏的类&#xff0c;它继承自QWidget。QMenuBar通常位于QMainWindow对象的标题栏下方&#xff0c;用于组织和管理多个QMenu&#xff08;菜单&#xff09;和QAction&#xff08;动作&#xff09;。菜单栏提供了一个水平排列的容器&#x…

GenAI 生态系统现状:不止大语言模型和向量数据库

自 20 个月前 ChatGPT 革命性的推出以来&#xff0c;生成式人工智能&#xff08;GenAI&#xff09;领域经历了显著的发展和创新。最初&#xff0c;大语言模型&#xff08;LLMs&#xff09;和向量数据库吸引了最多的关注。然而&#xff0c;GenAI 生态系统远不止这两个部分&#…

聪明的你能从千门八将108局学到什么,对你的未来人生有哪些深远的影响?

千门八将108局&#xff1a;智慧的启迪与人生指引 在古老智慧的宝库中&#xff0c;千门八将108局犹如璀璨星辰&#xff0c;闪耀着神秘而深邃的光芒。那些认真钻研过这些局的人&#xff0c;仿佛经历了一场穿越时空的智慧洗礼&#xff0c;从中收获了无价的人生财富。 一、从千门八…

GraphQL 与 Elasticsearch 相遇:使用 Hasura DDN 构建可扩展、支持 AI 的应用程序

作者&#xff1a;来自 Elastic Praveen Durairaju GraphQL 提供了一种高效且灵活的数据查询方式。本博客将解释 Hasura DDN 如何与 Elasticsearch 配合使用&#xff0c;以实现高性能和元数据驱动的数据访问。 此示例的代码和设置可在此 GitHub 存储库 - elasticsearch-subgraph…

根据问题现象、用户操作场景及日志打印去排查C++软件问题,必要时尝试去复现问题

目录 1、概述 2、通过现有信息无法定位问题时&#xff0c;则需要尝试去复现问题 3、非崩溃问题与崩溃问题的一般排查思路 3.1、非崩溃问题的排查思路 3.2、崩溃问题的排查思路 4、难以复现问题的可能原因总结 4.1、问题难以复现&#xff0c;可能和某种特殊的业务场景或操…

11-Dockerfile

11-Dockerfile Dockerfile Dockerfile是用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需的指令和参数构成的脚本。 构建步骤&#xff1a; 编写Dockerfile文件docker build命令构建镜像docker run依据镜像运行容器实例 构建过程 Dockerfile编写&#xff1a…

CMS getshell

进入前台 漏洞为前台任意用户密码修改和前台用户文件上传然后getshell 1. 弱口令进入前台用户admin123/admin123 2. 进入会员用户后点击内容中心 点击发布文章 存在文件上传&#xff0c;发现后缀和MIME类型都是白名单 但是在原文件的基础上继续添加随意后缀&#xff0c;发现成功…