新手上路,初学java,关于String的对象

C++速成指南:从零到实战的现代C++核心学习路径 C++作为一门支持面向对象、泛型编程和底层内存操作的系统级编程语言,其核心价值在于提供对硬件资源的精细控制和高性能计算能力。理解其内存管理机制、RAII(资源获取即初始化)原则以及标准模板库(STL)的运用,是掌握现代C++开发的关键。这些技术特性使得C++在高性能服务器、游戏引擎、嵌入式系统等场景中具有不可替代的优势。本文聚焦于C++ Crash Course的设计理念,通过项目驱动的学习路径,帮助开发者快速攻克指针、智能指针、STL容器等核心概念,并构建从环境配置到实战项目的完整技能栈。 阅读详情

http://sarin.iteye.com/blog/603684/,感觉写的很好

先来看一个例子,代码如下:

Java代码  收藏代码
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         String str = "abc";  
  4.         String str1 = "abc";  
  5.         String str2 = new String("abc");  
  6.         System.out.println(str == str1);  
  7.         System.out.println(str1 == "abc");  
  8.         System.out.println(str2 == "abc");  
  9.         System.out.println(str1 == str2);  
  10.         System.out.println(str1.equals(str2));  
  11.         System.out.println(str1 == str2.intern());  
  12.         System.out.println(str2 == str2.intern());  
  13.         System.out.println(str1.hashCode() == str2.hashCode());  
  14.     }  
  15. }  

    如果您能对这8个输出结果直接判断出来,下面的分析就不用看了。但是我想还是有很多人对这个String对象这个问题只是表面的理解,下面就来分析一下Java语言String类和对象及其运行机制的问题。
    做个基础的说明,堆(heap)内存和栈(Stack)内存的问题。堆和栈的数据结构这里就不解释了。Java语言使用内存的时候,栈内存主要保存以下内容:基本数据类型和对象的引用,而堆内存存储对象,栈内存的速度要快于堆内存。总结成一句话就是:引用在栈而对象在堆。
    Java中的比较有两种,是==和equals()方法,equals()是Object类的方法,定义在Object类中的equals()方法是如下实现的:
Java代码  收藏代码
  1.     public boolean equals(Object obj){  
  2.         return (this==obj);  
  3. }  

    String类重写了equals()方法,改变了这些类型对象相等的原则,即判断对象是否相等依据的原则为判断二者的内容是否相等。
    了解以上内容后我们来说说String,String类的本质是字符数组char[],其次String类是final的,是不可被继承的,这点可能被大多数人忽略,再次String是特殊的封装类型,使用String时可以直接赋值,也可以用new来创建对象,但是这二者的实现机制是不同的。还有一个String池的概念,Java运行时维护一个String池,池中的String对象不可重复,没有创建,有则作罢。String池不属于堆和栈,而是属于常量池。下面分析上方代码的真正含义
Java代码  收藏代码
  1. String str = "abc";  
  2. String str1= "abc";  

    第一句的真正含义是在String池中创建一个对象”abc”,然后引用时str指向池中的对象”abc”。第二句执行时,因为”abc”已经存在于String池了,所以不再创建,则str==str1返回true就明白了。str1==”abc”肯定正确了,在String池中只有一个”abc”,而str和str1都指向池中的”abc”,就是这个道理。
Java代码  收藏代码
  1. String str2 = new String("abc");  

    这个是Java SE的热点问题,众所周知,单独这句话创建了2个String对象,而基于上面两句,只在栈内存创建str2引用,在堆内存上创建一个String对象,内容是”abc”,而str2指向堆内存对象的首地址。
    下面就是str2==”abc”的问题了,显然不对,”abc”是位于String池中的对象,而str2指向的是堆内存的String对象,==判断的是地址,肯定不等了。
    str1.equals(str2),这个是对的,前面说过,String类的equals重写了Object类的equals()方法,实际就是判断内容是否相同了。
    下面说下intern()方法,在JavaDoc文档中,这样描述了intern()方法:返回字符串对象的规范化表示形式。怎么理解这句话?实际上过程是这样进行的:该方法现在String池中查找是否存在一个对象,存在了就返回String池中对象的引用。
    那么本例中String池存在”abc”,则调用intern()方法时返回的是池中”abc”对象引用,那么和str/str1都是等同的,和str2就不同了,因为str2指向的是堆内存。
    hashCode()方法是返回字符串内容的哈希码,既然内容相同,哈希码必然相同,那他们就相等了,这个容易理解。
再看下面的例子:
Java代码  收藏代码
  1. public class Test {  
  2.     private static String str = "abc";  
  3.     public static void main(String[] args) {  
  4.         String str1 = "a";  
  5.         String str2 = "bc";  
  6.         String combo = str1 + str2;  
  7.         System.out.println(str == combo);  
  8.         System.out.println(str == combo.intern());  
  9.     }  
  10. }  

    这个例子用来说明用+连接字符串时,实际上是在堆内容创建对象,那么combo指向的是堆内存存储”abc”字符串的空间首地址,显然str==combo是错误的,而str==combo.intern()是正确的,在String池中也存在”abc”,那就直接返回了,而str也是指向String池中的”abc”对象的。此例说明任何重新修改String都是重新分配内存空间,这就使得String对象之间互不干扰。也就是String中的内容一旦生成不可改变,直至生成新的对象。
    同时问题也来了,使用+连接字符串每次都生成新的对象,而且是在堆内存上进行,而堆内存速度比较慢(相对而言),那么再大量连接字符串时直接+是不可取的,当然需要一种效率高的方法。Java提供的StringBuffer和StringBuilder就是解决这个问题的。区别是前者是线程安全的而后者是非线程安全的,StringBuilder在JDK1.5之后才有。不保证安全的StringBuilder有比StringBuffer更高的效率。
    自JDK1.5之后,Java虚拟机执行字符串的+操作时,内部实现也是StringBuilder,之前采用StringBuffer实现。
    欢迎交流,希望对使用者有用。
Android动态分析实战:Frida Hook环境搭建与核心API详解 动态代码插桩是移动安全分析和逆向工程中的关键技术,它允许开发者在应用运行时监控和修改其行为,而无需访问源代码。其核心原理是通过向目标进程注入脚本运行时,拦截函数调用、读写内存数据,从而实现对应用逻辑的动态分析和干预。这项技术在安全研究、漏洞挖掘、协议分析和功能调试等领域具有极高价值,尤其适用于Android和iOS平台的移动应用分析。Frida作为当前主流的动态插桩框架,凭借其跨平台、脚本化驱动和强大的内存操作能力,已成为移动安全领域的标准工具。本文聚焦于Frida在Android平台上的实战应用,详细解析 阅读详情

相关推荐

安卓逆向工程实战指南:从APK结构到动态调试与脱壳

逆向工程是一种通过分析已编译程序来理解其内部结构、运行逻辑与安全机制的技术。其核心原理在于将二进制代码或字节码转换为可读形式,从而揭示软件的设计思路与数据流。这项技术的价值在于,它不仅是移动安全领域进行漏洞挖掘、恶意软件分析和隐私审计的基石,也为开发者提供了验证自身代码防护效果、学习优秀架构设计的途径。在实际应用场景中,安卓应用(APK)作为主要分析对象,其内部包含关键的DEX字节码、资源文件和原生库。掌握静态分析工具链(如JADX)与动态调试框架(如Frida),能够有效应对代码混淆与加固等挑战,实现对应

weixin_34239592的博客 425

new String

java new String()的对象问题

qq_51166736的博客 8626

Android逆向实战:从静态分析到动态调试,破解加密与验证的核心思路

在移动安全与软件分析领域,逆向工程是一种通过分析已编译程序来理解其内部逻辑与数据流的技术。其核心原理在于结合静态分析与动态调试,前者如同查阅地图,提供代码结构与逻辑的全局视野;后者则如同实地侦察,能在程序运行时捕获关键数据与执行路径。这项技术的核心价值在于,它使开发者能够深入理解第三方应用的运行机制,用于安全评估、竞品分析、协议研究或解决特定集成问题。在实际应用场景中,无论是分析网络接口签名(sign)算法、定位UI交互逻辑,还是应对复杂的验证码(如点选验证码),逆向工程都提供了系统性的方法论。本文将以An

weixin_33882452的博客 321

Java数组参数接参缩写(String... b)和new String[]{} 创建对象数组

【代码】Java数组参数接参缩写(String... b)和new String[]{} 创建对象数组。

beiback的博客 2353

SomeIP协议解析:汽车SOA通信核心原理与实战指南

在分布式系统和嵌入式通信领域,服务导向架构(SOA)通过将功能模块化为可复用的服务,实现了系统组件间的松耦合与高效协作。其核心原理在于定义标准的服务接口与动态发现机制,从而提升系统的灵活性、可扩展性和可维护性。这一技术价值在汽车电子和物联网等对实时性、可靠性要求极高的场景中尤为凸显,推动了从传统信号交互到服务化交互的范式转变。具体到汽车行业,基于IP的可扩展服务导向中间件(SomeIP)正是SOA理念在车载网络中的关键落地实践。它作为车内“微服务”的通信框架,通过定义服务接口、支持请求/响应、事件、字段等多

weixin_30493401的博客 347

Java垂直爬虫实战:优快云博客定向采集方案

垂直爬虫是一种面向特定网站结构深度定制的网页抓取技术,其核心在于精准识别目标站点的DOM特征与反爬机制。相比通用批量爬虫,它通过CSS选择器绑定、登录态维持、HTML实体转义还原等手段,实现高稳定性与低维护成本。Java凭借JVM内存可控性、Jsoup健壮解析能力及企业级集成优势,成为生产环境垂直爬虫的优选语言。本文聚焦优快云个人博客这一典型场景,提供开箱即用的Maven工程ZIP包,涵盖Cookie管理、动态渲染处理、分页逻辑与反爬绕过策略,适用于Java工程师快速落地技术博客数据采集、内容归档与知识库

weixin_34327223的博客 325

new String[]{}是什么意思?

new String[]{}是什么意思? 举报|  分享| 2013-08-09 13:58匿名 | 浏览 4227 次  编程语言 请问: new String[]{}是什么意思? 2013-08-09 22:22网友采纳 热心网友 创建一个string类型的数组对象比如: String a[] = new String[3]{"aa","bb"

evilcry2012的专栏 1万+

基于Python实现的捕鱼达人小游戏源代码+使用说明

摘要: 本文介绍了一款自制的捕鱼达人小游戏,使用Python3和Pygame模块开发。游戏包含完整的资源文件(图片、音效、字体)和源码结构(11个功能模块),实现了大炮移动射击、特殊子弹、炸弹、难度递增等核心玩法。安装需配置Python环境和Pygame模块,运行main.py即可启动游戏。游戏支持键盘控制(方向键移动、空格射击、1键放炸弹),默认时长600秒,包含开始菜单、游戏界面和结束界面。所有代码均有详细注释,项目已开源并提供下载链接。(150字)

2301_76484015的博客 666

初识String类

目录一、常用方法1.1 字符串构造【】1.2 String对象的比较1.3 字符串查找1.4 转化1.5 字符串替换1.6 字符串拆分1.7 字符串截取1.8 其他操作方法二、字符串的不可变性2.1字符串的不可变指向 2.2 字符串修改3.StringBuffer和StringBuilder三、面试题四、 String类oj 【注意】1. String 是引用类型,内部并不储存字符串本身,在String类的实现源码中,String类实例变量如下: 2. 在Java中 " " 引起来的也是String

weixin_70564024的博客 2698

微信小程序使用ucharts折线图,有负数显示0刻度线

当数据有负数和正数的时候默认不会显示0刻度线,不方便看出正负对比。

欢迎来到我的博客!在这里,我将分享我在前端开发方面的知识和经验。让我们一起探索前端开发的无限可能! 1579

慕课软件质量保证与测试(习题集)

慕课金陵科技学院.软件质量保证与测试.期末复习.习题汇总0 总目录1 绪论1.1 软件质量保证与测试的产生与发展1.2 软件缺陷,软件错误,软件故障1.3 软件质量保证与测试的意义,原则和挑战1.4 单元测试1.5 课后作业2 软件测试策略2.1 软件测试的模型,过程和生命周期2.2 软件测试的方法和技术2.3 单元测试2.4 课后作业3 黑盒测试3.1 黑盒测试概述3.2 等价类划分测试3.3 边界值测试3.4 错误推测法3.5 判定表驱动法3.6 因果图法3.7 场景法3.8 正交实验法3.9 单元测试

weixin_42473228的博客 5万+

Java之String详解(new String会创建几个对象问题)

如果串池中有,则并不会放入。返回已有的串池中的对象的地址如果没有,会把此对象复制一份,放入串池,并返回串池中的对象地址。

日常技术分享 6065

一个开源的AI数据分析工具,与数据对话,一键生成SQL、图表、表格、报告和智能商业分析。

Wren AI是一个开源的AI智能代理,让用户能够跟数据对话,实现从文本到SQL的转换,还能生成图表、电子表格、报告以及商业智能分析。它支持多种语言,能深入挖掘数据价值,提供智能数据探索功能,通过语义索引和精心设计的界面,让用户无需写代码即可获取洞察。Wren AI采用独特的架构,包含Wren UI、Wren AI Service和Wren Engine三大核心服务,可部署在本地或云端,助力团队高效、安全地解锁数据潜力。

AI_Charlotte的博客 4494

Object-Oriented 编程菜鸡上路(1)

Object-Oriented 编程菜鸡上路(1)   这次博客内容我想分为两个部分。第一部分是自己总结的初次接触java的一些语法、用法及思想,主要目的是帮助一些和我一样菜的菜鸟,减少一些初次接触java的理解时间,这部分当然是为后来人的。第二部分则是对作业的分析和感悟了,这一部分是写给自己的。 === 菜鸡上路 ===   感谢观看。如...

weixin_30951389的博客 224

postman响应体:“msg“: “请求缺失签名Sign“、 “msg“: “请求缺失时间戳“

请求标头有Sign、Timestamp,但是直接将网址复制到postman时,Headers没有自动生成这两个参数,所以运行时会报错。

m0_46862648的博客 1706

华为OD机试真题 新系统 9月16号 【统计特殊数字】

华为OD新系统机试真题【统计特殊数字】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【统计特殊数字】。

qq_45776114的博客 765

C++面向对象编程核心:从类设计到内存管理与多态机制

面向对象编程(OOP)是一种通过类和对象来模拟现实世界的编程范式,其核心在于封装、继承和多态三大特性。在C++中,OOP的实现紧密关联于内存管理机制,特别是对于带指针的类,需要手动实现深拷贝来管理动态分配的资源,避免内存泄漏和浅拷贝问题。理解栈与堆的区别、对象的生命周期以及虚函数表(vptr/vtbl)的工作原理,对于编写高效、安全的C++代码至关重要。这些技术广泛应用于游戏引擎、高性能计算和系统软件开发中,是掌握C++面向对象编程的基础。本文基于侯捷老师的课程,重点解析了类设计、内存管理和多态机制等核心概

weixin_30321709的博客 527

【AI编程干货】Vibe Coding 技巧(适用于AI编程IDE)

用 AI 写代码这件事门槛低,谁都能对着对话框输入几句话让它生成代码,但生成的东西能不能用、出了问题能不能兜住,这中间的差距比想象中大得多。 我从去年开始把 AI 编码工具作为主力开发手段,中间经历过项目失控、代码雪崩、反复返工,慢慢摸索出一套相对稳定的工作方式。这篇把核心的五个习惯拆开聊聊,都是实际项目里验证过的。

blues_C的博客 621

C++入门指南:从环境搭建到STL应用,掌握编程底层思维

编程语言是计算机科学的基础工具,其核心在于理解计算机如何执行指令和管理数据。C++作为一门接近底层的编译型语言,通过直接操作内存和CPU指令,能够帮助开发者建立对计算机系统原理的深刻认知。这种底层理解是学习高级语言特性的基础,例如Java的垃圾回收机制和Python的动态类型系统。在工程实践中,掌握C++意味着能够编写高性能、资源可控的应用程序,尤其在系统编程、游戏开发和嵌入式领域具有不可替代的价值。通过系统学习C++,开发者不仅能熟练使用标准模板库(STL)中的容器和算法,还能理解面向对象编程的封装、继承

weixin_34220179的博客 471

YOLOv11改进 | 融合改进篇 | 利用尺度统一检测头DynamicHead融合P2增加小目标检测层(让小目标无所遁形)

本文给大家带来的最新改进机制是针对性的改进,针对于小目标检测增加P2层针对于大目标检测增加P6层利用DynamicHead(原版本一比一复现,全网独一份,不同于网上魔改版本)进行检测,其中我们增加P2层其拥有更高的分辨率,这使得模型能够更好地捕捉到小尺寸目标的细节。我们增加P6层是一个较低分辨率但具有更大感受野的特征层。对于大尺寸目标,这意味着模型可以更有效地捕捉到整体的结构信息。在这些的基础上我们配合DynamicHead可以使模型根据不同尺寸的目标动态调整其检测策略,进一步提升模型的精度。

Snu77的博客 3948

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C++异常处理:throw机制深度解析与实战指南

异常处理是现代编程语言中处理运行时错误的核心机制,它通过分离正常逻辑与错误处理代码,提升程序的健壮性和可维护性。其基本原理是在程序执行遇到无法本地处理的错误时,通过抛出异常对象来中断当前控制流,并由调用栈上层的异常处理器捕获并处理。这一机制的技术价值在于支持跨函数、甚至跨多层的错误传播,使得错误处理逻辑更加集中和清晰。在C++中,异常处理与RAII(资源获取即初始化)模式紧密结合,确保在栈解旋过程中资源能被自动释放,是实现异常安全代码的关键。应用场景广泛,包括资源获取失败(如内存分配、文件操作)、违反前置条

weixin_30235225的博客 441

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android SQLite数据库开发实战:从零掌握原生数据库操作与调试技巧

数据库作为移动应用数据持久化的核心技术,其底层原理与实现是每位开发者必须掌握的基础。SQLite作为Android系统内置的轻量级关系型数据库引擎,以其零配置、无服务器、事务性ACID兼容的特性,成为本地存储场景下的首选方案。理解SQLite的工作原理,不仅能帮助开发者进行深度性能优化和复杂问题排查,更能为后续使用Room等ORM框架打下坚实基础。在Android开发实践中,通过SQLiteOpenHelper管理数据库生命周期、执行原生SQL语句实现CRUD操作,是处理轻量级数据存储、依赖敏感型项目的关键

weixin_33937913的博客 365

数学建模模型总结

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

从核心代码到ACM模式:编程思维从解题到实战的跃迁指南

在编程学习和面试准备中,理解不同的编程模式是构建扎实工程能力的基础。核心代码模式聚焦于算法逻辑的实现,屏蔽了输入输出等环境细节,适合初学者快速掌握数据结构与算法思想。然而,真实的软件开发要求工程师具备端到端的问题解决能力,这正是ACM模式(在线判题模式)所模拟的场景。该模式要求从标准输入读取并解析原始数据,经过核心逻辑处理,再格式化输出结果,完整覆盖了“输入-处理-输出”的软件核心链路。其价值在于培养对输入解析、输出格式化、程序健壮性和性能意识的综合把控,这些正是技术面试中考察沟通理解、细节把控和整体架构意

weixin_34133829的博客 489

深入解析FlatBuffers:高性能二进制序列化原理与实战

在分布式系统和游戏开发中,数据序列化是系统间通信的基石,其性能直接影响服务响应速度和用户体验。传统基于文本的序列化方式(如JSON)虽然易用,但在数据体积和解析速度上存在瓶颈。二进制序列化技术通过将数据结构转换为紧凑的字节流,实现了更高的传输效率和更快的解析速度,尤其适用于物联网、高频交易和实时游戏等对延迟敏感的场景。FlatBuffers作为一种创新的高性能二进制序列化库,其核心在于独特的扁平化缓冲区设计,实现了零解析开销和零拷贝访问,从而在数据读取性能上实现了数量级的提升。本文将从其设计原理出发,结合序

weixin_30652897的博客 377

Rust安全模型解析:所有权与借用如何拦截内存和并发错误

内存安全和线程安全是系统编程长期面临的挑战。传统语言中,空指针解引用、释放后使用、数据竞争等问题往往要等到运行时才暴露,甚至需要通过复杂的工具链和人工审查来排查。Rust通过编译器内置的所有权、借用和生命周期机制,在编译阶段就拦截了这类风险:每个值只有一个所有者,借用规则强制多读单写,引用有效期由编译器校验。这套静态检查不仅保证了接近C/C++的运行性能,更将错误反馈前置,显著提升了重构和迭代效率。无论是高性能后端服务、嵌入式开发,还是WebAssembly组件,Rust的安全语义都能帮助企业降低线上故障率

weixin_34008933的博客 399

C++哈希表深度解析:从核心原理到LeetCode实战与工程优化

哈希表是一种基于关键码直接访问数据的数据结构,其核心原理是通过哈希函数将键映射到固定范围的数组下标,从而实现近乎O(1)时间复杂度的查找、插入和删除操作。这种高效的数据组织方式,使其成为处理海量数据、实现高速缓存和构建字典集合等场景的关键技术。在工程实践中,哈希表通过解决哈希冲突(如链地址法)和动态调整负载因子来保持性能,广泛应用于数据库索引、编译器符号表、网络路由等底层系统。本文聚焦于C++中的哈希表实现,深入剖析std::unordered_map的内部机制,并结合LeetCode经典题目如“两数之和”

weixin_34175509的博客 378
上一篇: 新手上路,java不同进制转换的字符串
下一篇: How System.out.println() really works
Leafact
博客等级 码龄14年 20粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值