String经典问题

NSIS教程(8): 基于第三方界面库的安装包界面 前面的几篇文章介绍了NSIS的传统界面的安装包和现代界面的安装包的制作方法,也提到了NSIS支持自定义页面(即使用page custom)的特性,自定义页面需要用户自己创建对话框、控件、添加控件响应等等,虽然NSIS提供了nsDialogs.nsh来支持这些功能,但使用起来还是不太方便(需要专门了解这个插件诸多用法),而且不够灵活,所以本文介绍一种终极的自定义界面的安装包解决方案,即完全使用第三方 阅读详情
String经典问题(==和equals区别,new String为什么创建了两个对象)
2008年11月12日 09:58

// ==与equals的区别:
// ==:
// 1、比较的是操作符两端的操作数是否是同一个对象
// 2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。
// 3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为TRUE,如:
// int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆
// equals:
// 1、比较的是两个对象的内容是否一样

/*
* String s="abce"是一种非常特殊的形式,和new 有本质的区别.
*
* 它是java中唯一不需要new 就可以产生对象的途径.
*
* 以 String s="abce";形式赋值在java中叫直接量,它是在常量池中而不是象new 一样放在压缩堆中.
* 这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有有没有一个值为"abcd"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象,如果没有,则在常量池中新创建一个"abcd",下一次如果有String
* s1 = "abcd";又会将s1指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.
*
* 而String s = new String("abcd");和其它任何对象一样.每调用一次就产生一个对象.只到它们调用
*/

public class Test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 为一个引用
String b = new String("ab"); // b为另一个引用,对象的内容一样
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 从常量池中查找
if (aa == bb) // true
   System.out.println("aa==bb");
if (a == b) // false
   System.out.println("a==b");
if (a.equals(b)) // true
   System.out.println("aEQb");
if (42 == 42.0) { // true
   System.out.println("true");
}
}
}

/*
* 也可以这么理解:
* String str = "hello"; 先在内存中找是不是有"hello"
* 这个对象,如果有,就让str指向那个"hello".如果内存里没有"hello",就创建一个新的对象保存"hello". String str=new
* String ("hello") 就是不管内存里是不是已经有"hello"这个对象,都新建一个对象保存"hello"
*/
/*
* String a = new String("ab");是在堆里面建立的对象 String,a和"ab"
* aa="ab";是查找栈里有没有"ab",如果有就用aa引用它,如果没有就把“ab”存进栈
*/

 

附加:

Java中没有指针,但存在“引用”的概念;下面从内存分配的角度,分析一下java中的变量。以下的程序都比较简单,各位慢慢看,
【程序一】
class main
{
public static void main(String[] args)
{
    String s1="Hello world1";
    String s2=s1;
    System.out.println("s1=" + s1);
    System.out.println("s2=" + s2);
    s2="abcdef";
    System.out.println("s1=" + s1);
    System.out.println("s2=" + s2);
}
}

程序输出结果如下:
---------- 运行 ----------
s1=Hello world1
s2=Hello world1
s1=Hello world1
s2=abcdef
Normal Termination
输出完成(耗时 1 秒)。

程序分析:
String s2=s1; 从java的角度理解,应该是s2和s1共同指向了"Hello world1" 字符串所占用的内存空间;
下面的赋值s2="abcdef";又将变量s2执行了"abcdef"字符串所占用的内存空间,此时s1,s2分别指向了不同的内存空间。

【程序二】
class main
{
public static void main(String[] args)
{
    String s="Hello world1";
    System.out.println("s=" + s);
    s="Hello world2";
    System.out.println("s=" + s);
    s="Hello world3";
    System.out.println("s=" + s);
}
}

程序输出结果如下:
---------- 运行 ----------
s=Hello world1
s=Hello world2
s=Hello world3
Normal Termination
输出完成(耗时 0 秒)。

程序分析:
这例程序和上例不同之处是只使用了一个变量s。
String s="Hello world1"; 定义了一个字符串的引用s,并将其指向"Hello world1"字符串所占用的内存空间;
s="Hello world2"; 使s指向了"Hello world2" 字符串所占用的内存空间;
这是"Hello world1"所占用的空间没有变量使用,会被jvm的垃圾回收机制回收。
s="Hello world3"; 也是同样的道理。

总结:
定义java变量的时候,实际上只是产生了一个指向该类型的引用(它也占用内存空间),对这个“引用”进行赋值,是将其指向某个内存空间;多次对“引用”进行赋值,jvm会产生多个内存空间,同时回收以前不用的内存空间。
有鉴于此,可知,java在使用内存方面是毫不吝惜的,变量定义与赋值时,会尽可能多的产生内存空间,不用的内存空间交给jvm的垃圾回收机制。

【转】

【100%通过率】华为od机试C卷【出差 / 员工派遣】C++ 实现 某公司部门需要派遣员工去国外做项目。现在,代号为 x 的国家和代号为 y 的国家分别需要 cntx 名和 cnty 名员工部门每个员工有一个员工号 (1,2,3,......),工号连续,从 1开始。部长派遣员工的规则: 阅读详情

相关推荐

GPU算力租用平台推荐

阿里云作为中国领先的云计算服务提供商,提供了丰富的GPU云服务器实例,包括NVIDIA Tesla V100、A100等多种高性能GPU型号。阿里云GPU云服务器适用于深度学习、科学计算、图形渲染等多种场景,能够满足不同用户的计算需求。

hong161688的博客 8170

int和Integer的区别与String,StringBuffer与StringBuilder的区别

int和Integer的区别 1、Integer是int的包装类,int则是java的一种基本数据类型 2、Integer变量必须实例化后才能使用,而int变量不需要 3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值 4、Integer的默认值是null,int的默认值是0 延伸: 关于Integer和int的比较 1、由...

qq_42920440的博客 1243

不到200块!手把手教你用ZYNQ7010和AD9363攒一台自己的开源SDR硬件(附BOM清单)

本文详细介绍了如何用不到200元的预算,基于ZYNQ7010 FPGA和AD9363射频芯片打造一台功能完备的开源SDR硬件平台。从核心组件选型、PCB设计到焊接调试,提供全流程实战指南,特别适合预算有限的硬件爱好者和创客群体探索无线通信世界。

weixin_26854829的博客 479

String经典问题(==和equals区别,new String为什么创建了两个对象)

// ==与equals的区别:// ==:// 1、比较的是操作符两端的操作数是否是同一个对象// 2、两边的操作数必须是同一类型的(可以是父子类之间)才能编译通过。// 3、比较的是地址,如果是具体的阿拉伯数字的比较,值相等则为TRUE,如:// int a=10 与 long b=10L 与 double c=10.0都是相同的(为true),因为他们都指向地址为10的堆// equals:

fanzhenhua的专栏 4065

一文讲透3GPP TS 36.104发射链路相关指标

3GPP是制定移动通信标准的国际组织,其36.104规范对LTE基站射频性能提出详细要求。规范主要涵盖七方面:1)基站输出功率分类标准;2)LTE信道带宽计算方法;3)TD-LTE特有的发射机关断功率及时延要求;4)信号质量指标(频率误差和EVM)及其影响因素;5)邻道泄漏比(ACLR)的45dBc标准;6)带内频谱辐射模板(OBUE)的噪声限制;7)9kHz-12.75GHz频段的带外杂散辐射要求。这些技术要求保障了LTE基站的射频性能和网络质量。

weixin_49761275的博客 4526

PIV实验流场流速云图(MALAB contour函数用法)

clear;clc; for k=1:5 str1=['filename1']; str2=['filename2']; str3=['filename3']; str=eval(['str',num2str(k)]); load(str); [m n]=size(y); y=flipud(y); v=-v; x=x-x(1,...

Nick_Cui的博客 3222

String 和integer的用==比较细节

看代码: public static void main(String[] g){   String a1="aa";   String a2="bb";   String a3=a1+a2;   String a5=a1+a2;   String a4="aa"+"bb";   String a6="aa"+"bb";   if(a3==a4){    System.out.p

闪电人 594

AI智能体项目管理框架agent-pm:从原理到实战的多智能体协作指南

在人工智能和自动化技术快速发展的今天,多智能体系统已成为实现复杂任务自动化的重要技术路径。其核心原理在于通过任务分解、角色分配和状态管理,让多个AI智能体像人类团队一样协同工作,从而突破单个模型的性能边界。这种架构的技术价值在于将软件工程中成熟的项目管理方法论引入AI领域,显著提升了自动化流程的可预测性、可观测性和可复用性。在实际应用场景中,多智能体协作框架能够高效处理从代码开发、文档撰写到数据分析等一系列任务,尤其适合需要多步骤、多专业协同的复杂项目。本文聚焦的agent-pm框架,正是这一领域的典型实践

weixin_42533910的博客 714

java学习笔记_进阶006

String字符串的存储原理 关于java 的jdk中内置的一个类:java.lang.String String表示字符串类型,属于引用数据类型,不属于基本数据类型 在java中随便使用双引号括起来的都是String对象 java中规定,双引号括起来的字符串,是不可变的,也就是说“abc”自出生到最终死亡,不可变,不能变成“abcd",也不能变成”ab" 在JDK当中双引号括起来的字符串,例如:“abc","def"都是直接存储在方法区的字符常量池当中的 垃圾回收器是不会释放常量的

m0_46650312的博客 134

Android dex, odex, oat, vdex, art文件介绍

下图可以简化将Java源转换为OAT的过程: .dex Dalvik虚拟机字节码文件 .vdex 其中包含APK的未压缩DEX代码,以及一些旨在加快验证速度的元数据 .odex .oat // JIT,Just-in-time,即时编译,边运行边编译; // AOT,Ahead Of Time,提前编译,指运行前编译。 其中包含APK中已经过AOT编译的方法代码。 原始DEX文件(例如classes.dex)被转换为另一个包含本机代码的文件。这个新文件通常具有.odex。.oat扩展名,并由ELF格式

he980725866的博客 3618

计算机技术发展5大阶段,现阶段计算机技术应用及发展

【摘要】现代计算机科学技术的发展和普及运用,为世界各国民众基础性生产生活实践活动的组织开展路径造成了深刻影响,本文围绕现阶段计算机技术应用及发展,择取两个具体方面,展开了简要分析。【关键词】计算机技术;应用;发展改革开放以来,计算机设备的广泛运用,促进了计算机科学技术的逐步发展成熟。计算机科学技术是具备新兴表现特征的尖端应用技术,其在现代工业生产和社会生活实践活动过程中的广泛引入运用,给世界各国基...

weixin_42126677的博客 2637

Java基础<十>---> String类

ASP.Net+Android+IOS开发、.Net培训、期待与您交流! 第一 String类 一、概述: 字符串是最常用的类型之一,所以为了使用方便java就给封装成了对象方便使用。String类型的一旦被初始化就不能再改变。 String s1 = "abc";//s1是一个类类型变量, "abc"是一个对象。//字符串最大特点:一旦被初始化就不可以被改变。 s1 = "kk";/

yangxin_540的专栏 1547

光电二极管探测器电流信号处理与指令输出系统

本文提出了一种基于Python的光电二极管电流信号处理系统设计方案。该系统能够实时采集、处理光电二极管输出的电流信号,并根据预设阈值输出控制指令。系统采用模块化架构,包含数据采集、信号处理、阈值检测、指令生成等核心模块。其中数据采集模块提供了模拟器实现和硬件接口框架,支持噪声模拟和脉冲信号生成。系统设计考虑了实时性、可靠性和可扩展性,适用于光强测量、光电检测等多种应用场景。

huanghm88的专栏 1180

【C++】经典string类问题

本文探讨了C++中string类的拷贝机制优化。首先分析了浅拷贝导致的内存重复释放问题,指出需要实现深拷贝来确保每个对象拥有独立内存。接着对比了传统写法与现代写法:传统写法直接实现拷贝构造和赋值运算符,而现代写法通过临时对象和swap成员函数优化性能。文章重点解析了swap机制,说明自定义swap成员函数可提升交换效率,并详细解释了std::swap的模板转发机制。最后介绍了引用计数和写时拷贝技术,通过共享资源减少拷贝开销,适用于读多写少的场景。这些优化技术体现了C++在资源管理和性能优化方面的重要思想。

2302_81312180的博客 1160

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

关于String的经典问题

<br />String s = new String("xyz") ;<br /><br />哈哈,要理解这个,就要知道string类的工作原理。 <br /><br />    你知道在java中除了8中基本类型外,其他的都是类对象以及其引用。所以 "xyz "在java中它是一个String对象.对于string类对象来说他的对象值是不能修改的,也就是具有不变性。 <br />      看: String s= "Hello "; <br />               s= "Java ";<b

zjturn的专栏 761

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java String 对象经典问题

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

weixin_44449185的博客 169

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

java String的经典问题(new String() ,String )

先来看一个例子,代码如下: 1.public class Test { 2. public static void main(String[] args) { 3. String str = "abc"; 4. String str1 = "abc"; 5. String str2 = new String("ab

niguang09的专栏 1万+

Java String对象的经典问题

先来看一个样例,代码例如以下: Java代码 publicclassTest{ publicstaticvoidmain(String[]args){ Stringstr="abc"; Stringstr1="abc"; S...

aoe41606的博客 67

Java String的经典问题

先来看一个例子,代码如下:  Java代码   public class Test {       public static void main(String[] args) {           String str = "abc";           String str1 = "abc";           String str2 = new Stri

rookieding的专栏 721

Java String对象的经典问题(new String())

http://sarin.iteye.com/blog/603684/ 先来看一个例子,代码如下: Java代码   public class Test {      public static void main(String[] args) {          String str = "abc";          String str1 = "abc";

杨文的专栏(南京Java讲师) 746

JAVA之String经典问题

先来看一个例子,代码如下: Java代码   public class Test {       public static void main(String[] args) {           String str = "abc";           String str1 = "abc";           String str2 = new String("

foxhlc的专栏 622

Java中String类的经典问题、错误认知以及归纳总结

Java中String类的经典问题、错误认知以及归纳总结。

qq_43726119的博客 1061
上一篇: Java--数组
下一篇: 网络硬盘共享
QGJava
博客等级 码龄16年 14粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值