Java 聊聊CharSequence及其子类

别再只用MD5存密码了!聊聊Java中更安全的替代方案(附SHA-256/BCrypt代码示例) 本文探讨了Java中密码存储的安全升级方案,从已被破解的MD5算法转向更安全的BCrypt和SHA-256。通过详细代码示例和性能分析,帮助开发者理解现代密码存储的最佳实践,包括盐值生成、工作因子设置及迁移策略,确保系统安全性和合规性。 阅读详情

CharSequence

CharSequence是char值的可读序列。 该界面提供统一的,只读访问许多不同类型的char序列。 

实现类

其中最重要的也是最常用的就是 String、StringBuilder和StringBuffer。这三字子类都是用来处理字符串的,但是他们之间还有有一定差别的。

String

从源码上来看是实现了 Serializable 序列化接口、Comparable 可比较接口和CharSequence 字符序列接口,String 底层是用的  final char 数组进行存储的,所以字符串一旦确定不可改变。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    private final char value[];
    ......
}

因为字符串比较常用,所以对其进行了优化,可以直接用 "..."来表示字符串。
在 JVM 堆中有一个字符串常量池,每创建一个字符串时都会判断字符串常量池中有没有这个字符串,如果有的话直接将地址指向字符串常量池中的地址,如果没有的话在字符串常量池中新增一个字符串,然后在指向新增的字符串地址。

所以在进行大量的字符串操作时不推荐使用 String ,因为字符串常量池中会有很多无用的字符串,造成空间浪费和GC频繁

Stirng 也没有进行锁机制,所以多线程中是不安全的,慎用。

简单小测试

String str1 = "abc";
String str2 = "abc";
String str3 = new String("abc");
String str4 = "ab"+"c";
String str5 = new String("ab")+new String("c");;
System.out.println("1."+(str1 == str2)); //true or false
System.out.println("2."+(str1 == str3));//true or false
System.out.println("3."+(str1 == str3.intern())); //true or false
System.out.println("4."+(str1 == str4)); //true or false
System.out.println("5."+(str1 == str5)); //true or false

1. str1 和 str2 都是使用直接创建,所以str1 在字符串常量池中,str2 检测常量池中有"abc",所以直接指向常量池的字符串,所以答案是 true

2. str1指向常量池,str3 使用 new 关键字创建一个对象,所以答案是 false

3. String.intern()方法:当调用intern方法时,如果池已经包含与equals(Object)方法确定的相当于此String对象的字符串,则返回来自池的字符串。 否则,此String对象将添加到池中,并返回对此String对象的引用。 所以答案是 true

4. 该行代码重点说明一下,jvm对其有优化处理,也就是在编译阶段就会将这两个字符串常量进行拼接,所以和第一个的答案一样 true

5. 因为 new String 后会在堆中生成一个对象,而 str1 指向字符串常量,所以答案为 fasle

StringBuilder

从源码上来看是继承了 AbstractStringBuilder抽象类,实现了Serializable 序列化接口和CharSequence 字符序列接口。而AbstractStringBuilder底层维护了一个 char数组,这个数组不会放入字符串常量池中。

public final class StringBuilder
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence{
    ....
}

添加字符串的时候会

所以StringBuilder进行字符串操作的时候速度最快,在单线程中推荐使用,但是在多线程环境中要慎用。

StringBuffer

从源码上来看好像和 StringBuilder 差不多,就多了一个缓存。

 public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, CharSequence{

    /**
     * transient:在序列化是以transient修饰的变量不会被序列化。
     * 该属性在调用ToString时记录下最近一次value值,而在修改这个value时,会将这个置为null
     */
    private transient char[] toStringCache;
    ....

}

但是你在往下翻的时候会发现大量的 synchronized 的关键字。

所以 StringBuffer 和 StringBuilder 最大的区别就是线程安全。但是使用的是 synchronized 关键字,多线程中只允许一个线程进入,保证安全了,但是效率又下降了。

Android恶意软件Rafel-Rat技术剖析:从权限滥用、C&C通信到勒索模块实现 在移动安全领域,Android恶意软件常通过滥用系统合法API实现远程控制与数据窃取。其核心原理在于利用Android的权限机制与服务框架,通过诱导用户授予敏感权限,在后台建立持久化服务并与命令与控制服务器通信。这类技术的工程实践价值在于揭示了移动平台安全模型的潜在弱点,尤其在权限滥用、后台保活和跨应用数据访问方面。在实际应用场景中,攻击者常组合使用设备管理员权限、通知监听服务和内容解析器,实现对短信、联系人、验证码等敏感信息的窃取,甚至升级为锁屏勒索。本文以Rafel-Rat为例,深入解析其利用前台服务维 阅读详情

相关推荐

解析Java中1000个常用类:CharSequence类,你学会了吗?

CharSequence 是一个接口,定义了一组用于读取字符序列的方法。它是字符序列的抽象表示,位于 java.lang 包中。CharSequence 接口提供了一种统一的方式来处理不同类型的字符序列,例如字符串、字符缓冲区等。CharSequence 接口是 Java 中一个强大的工具,为字符序列的操作提供了统一的接口。通过实现 CharSequence 接口,Java 提供了灵活而一致的方式来处理不同类型的字符序列,简化了编程任务。

良月柒 742

Java学习之CharSequence(字符序列)接口

1、在 Java 语言中 直接使用 “” 引起来的多个字符就是 字符串 (character strings) 2、在 Java 源代码中 直接使用 “” 引起来的字符串 都是 java.lang.String 的实例 3、String 类 是个 不可变类 将来创建的 每个 String 实例 都是不可变的对象【Strings are constant】CharSequence类和String类都可以定义字符串,但是String定义的字符串只能读,CharSequence定义的字符串是可读可写的;

qq_43842093的博客 5857

Nvivo12新手避坑指南:从安装到编码的完整流程(附实战案例)

本文为Nvivo12新手提供了从软件安装、初始设置到数据导入和编码分析的完整避坑指南。通过一个“校园欺凌现象的学生访谈研究”实战案例,详细拆解了处理中文文本、创建项目结构、执行手动编码及高级查询等关键步骤,帮助研究者避开常见错误,快速上手并高效完成质性数据分析。

resnet7explorer的博客 318

CharSequence详情介绍

CharSequence是一个描述字符串结构的接口,在这个接口里面一般发现有三种常用的子类: Stirng类 public final class String extends Object implements Serializable, Comparable&lt;String&gt;, CharSequence StringBuffer类 public final class St...

taojin12的博客 6万+

PCL点云库入门(第6讲)——PCL库中Eigen数学工具库的基本使用(持续更新)

Eigen库是一个高性能的C++模板库,专注于线性代数、矩阵和向量运算,以及相关的数值分析和算法。在Eigen库中,所有的矩阵和向量均被视为矩阵模板类的实例。向量可以被看作是特殊形式的矩阵,具体表现为只包含1行或1列。

qq_36812406的博客 1753

多天线技术:5G波束成形&空间复用&空时编码

以提升信号的可靠性。然而,在20世纪90年代中期,研究者们惊讶地发现,多天线技术不仅仅提供分集增益,还可以开启一些单天线系统无法实现的新机遇。,我们可以将信道矩阵 ( H ) 视为一个满秩矩阵,则理论上可以建立min(𝑁𝑇,𝑁𝑅)个独立的数据流,形成一个。波束成形是5G物理层的核心技术,其本质是利用多个天线来增强特定方向上的信号,同时抑制干扰方向的信号。:物理波束成形 = 🔦 类似手电筒的聚焦光束,虚拟波束成形 = 🌊 类似水波的相干叠加。随着 5G 和 6G 时代的到来,多天线技术的作用愈发重

weixin_43199439的博客 1389

CharSequence入门学习

CharSequence入门学习

清尘 3691

EMI辐射发射超标案例

EMI辐射发射超标案例

让你爱上电路设计 8503

Java之CharSequence浅析

CharSequence是一个描述字符串的接口类,这个接口有三个常用的实现类String类、StringBuilder类、StringBuffer类

ldcaws的专栏 3351

手把手教你学Simulink--移动机器人多轮协同场景实例:基于Simulink的双轮差速PMSM轮毂电机协同驱动仿真

本文介绍了基于Simulink的双轮差速PMSM轮毂电机协同驱动仿真系统。针对移动机器人存在的电机参数不一致、负载分配不均等问题,提出主从同步+力矩补偿的协同控制策略。通过搭建包含运动学模型、PMSM电机模型和矢量控制器的仿真系统,实现了速度同步误差<0.005m/s、轨迹跟踪误差<0.8cm、能耗降低12.5%的优化效果。文章详细阐述了建模步骤、核心算法实现和性能验证,为移动机器人动力系统设计提供了实用参考方案。

MHD0815的博客 133

泛微OA提交流程到下一个节点

泛微OA后端接口强制流程归档

CXYCMY的博客 2249

从源代码的角度聊聊java中StringBuffer、StringBuilder、String中的字符串拼接

长久以来,我们被教导字符串的连接最好用StringBuffer、StringBuilder,但是我们却不知道这两者之间的区别.跟字符串相关的一些方法中总是有CharSequence、StringBuffer、StringBuilder、String,他们之间到底有什么联系呢? 1、从类的定义看CharSequence、StringBuffer、StringBuilder、String的关系

haihongazar的博客 355

QGis二次开发 —— 1、win10/win11搭建Vs2017-QGis3.40.12环境(附Vs2017环境效果,附全部问题解决方法)(附:Qt助手加入QGis接口说明文档)

QGis二次开发 —— 1、Windows10搭建Vs2017-QGis环境(附Vs2017环境效果)(附:Qt助手加入QGisA接口说明文档)

1362

聊聊 String 的常用方法

先看 String 的底层源码: public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char valu...

黑马程序员广州中心的专栏 104

openHarmony之AI Engine:万字讲解如何在应用、开发板上接入AI大模型调用

本文章介绍如何在 OpenHarmony 开发板上集成和部署各类 AI 大模型,实现终端直接聊天功能,并为语音助手、智能机器人等应用提供 AI 接口支持。

m0_67505153的博客 620

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

别再只用MD5存密码了!聊聊Java中更安全的替代方案(附代码对比)

本文深入探讨了Java中密码存储的安全升级方案,揭示了MD5等过时哈希算法的安全缺陷,并提供了向bcrypt、Argon2等现代算法迁移的实战指南。通过代码示例和算法对比,帮助开发者选择最适合的密码哈希方案,确保用户数据安全。

weixin_30681121的博客 525

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ANDROID技术进阶-AIDL

AIDL,即Android Interface Definition Language,Android接口定义语言。这门语言是为了实现进程间通信。每一个进程都有自己的一块独立的内存,都在自己的内存上存储自己的数据,执行自己的操作,而AIDL,就是两个进程之间沟通的桥梁。 AIDL的具体使用步骤: 1.在src文件夹下右键,选择新建aidl文件,这里新建了一个aidl文件;新建完以后,会在main文件下生成一个aidl的文件夹,aidl文件夹下的目录结构和java文件夹下的目录结构一样。Baidl文件中会

ws_daydayup的博客 2242

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

字节跳动·应届 Android 面试——String 为什么设计成不可变

关于String不可变的原因、new String("abc")创建对象数、intern在JDK7的变化等面试知识点,以及展示深度理解的重要性。摘要需简洁,≤150字。</think>面试官以String为“照妖镜”考察深度:不可变原因、new String("abc")对象数、JDK7 intern变化。深度解析涵盖常量池复用、安全、内存布局、版本差异,并给出高分答法,强调理解JVM内存与版本演进。

814

快手·Android 开发面试——StringBuilder 和 StringBuffer 选错一个

本文解析快手客户端面试中String拼接问题:String不可变,StringBuilder可变但线程不安全,StringBuffer安全却因锁开销慢;循环内用“+”会因反复创建StringBuilder导致O(n²)复制,编译器优化仅限单条语句;应预估容量减少扩容,多线程用ThreadLocal或StringJoiner。

323

SpringCloud 日志在压测中的二三事

文章目录一、如何拆分响应时间?二、如何启用 Access Logs?1、Nginx Ingress Access Log2、Reactor Netty Access Log3、SpringBoot Access Log三、如何提高日志性能?1、怎么配置异步日志? 一、如何拆分响应时间? 在性能分析中,响应时间的拆分通常是一个分析起点。因为在性能场景中,不管是什么原因,只要系统达到了瓶颈,再接着增加压力,肯定会导致响应时间的上升,直到超时为止。在判断了瓶颈之后,我们需要找到问题出现在什么地方。在压力工具上看

7DGroup,让技术更有价值! 1310
上一篇: 计算机网络 TCP三次握手四次挥手
下一篇: Java 聊聊反射机制和动态代理
楚瑞涛
博客等级 码龄9年 57粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值