`
snoopy7713
  • 浏览: 1130849 次
  • 性别: Icon_minigender_2
  • 来自: 火星郊区
博客专栏
Group-logo
OSGi
浏览量:0
社区版块
存档分类
最新评论

String s =new String()分析堆与栈,是先定义S,还是先new string()

    博客分类:
  • java
 
阅读更多
先定义S

1. String str1 = "abc"; 
  System.out.println(str1 == "abc"); 

步骤: 
1) 栈中开辟一块空间存放引用str1, 
2) String池中开辟一块空间,存放String常量"abc", 
3) 引用str1指向池中String常量"abc", 
4) str1所指代的地址即常量"abc"所在地址,输出为true 

2. String str2 = new String("abc"); 
  System.out.println(str2 == "abc"); 

步骤: 
1) 栈中开辟一块空间存放引用str2, 
2) 堆中开辟一块空间存放一个新建的String对象"abc", 
3) 引用str2指向堆中的新建的String对象"abc", 
4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,输出为false 

3. String str3 = new String("abc"); 
  System.out.println(str3 == str2); 

步骤: 
1) 栈中开辟一块空间存放引用str3, 
2) 堆中开辟一块新空间存放另外一个(不同于str2所指)新建的String对象, 
3) 引用str3指向另外新建的那个String对象 
4) str3和str2指向堆中不同的String对象,地址也不相同,输出为false 

4. String str4 = "a" + "b"; 
  System.out.println(str4 == "ab"); 

步骤: 
1) 栈中开辟一块空间存放引用str4, 
2) 根据编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的String常量"ab", 
3) 引用str4指向池中常量"ab", 
4) str4所指即池中常量"ab",输出为true 

5. final String s = "a"; 
  String str5 = s + "b"; 
  System.out.println(str5 == "ab"); 

步骤: 
同4 

6. String s1 = "a"; 
  String s2 = "b"; 
  String str6 = s1 + s2; 
  System.out.println(str6 == "ab"); 

步骤: 
1) 栈中开辟一块中间存放引用s1,s1指向池中String常量"a", 
2) 栈中开辟一块中间存放引用s2,s2指向池中String常量"b", 
3) 栈中开辟一块中间存放引用str5, 
4) s1 + s2通过StringBuilder的最后一步toString()方法还原一个新的String对象"ab",因此堆中开辟一块空间存放此对象, 
5) 引用str6指向堆中(s1 + s2)所还原的新String对象, 
6) str6指向的对象在堆中,而常量"ab"在池中,输出为false 

7. String str7 = "abc".substring(0, 2); 
  
步骤: 
1) 栈中开辟一块空间存放引用str7, 
2) substring()方法还原一个新的String对象"ab"(不同于str6所指),堆中开辟一块空间存放此对象, 
3) 引用str7指向堆中的新String对象, 

8. String str8 = "abc".toUpperCase(); 
  
步骤: 
1) 栈中开辟一块空间存放引用str6, 
2) toUpperCase()方法还原一个新的String对象"ABC",池中并未开辟新的空间存放String常量"ABC", 
3) 引用str8指向堆中的新String对象
分享到:
评论

相关推荐

    String a="hello" String b="hello" a==b 返回true的问题分析

    //这种用new关键字定义的字符串,是在堆中分配空间的。而分配空间就是由new去完成的,由new去决定分配多大空间,并对空间初始化为字符串"hello world" 返回其在堆上的地址。 通过上面的原理,可以做如下实验: ...

    Java中的堆和栈[定义].pdf

    堆是一个运行时数据区,用于存放由 new 创建的对象和数组。Java 虚拟机的自动垃圾回收器负责管理堆中的内存,垃圾回收器会自动收走不再使用的数据。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,...

    java中int_char_string三种类型的相互转换

    Java 中 int、char、String 三种类型的相互转换详解 Java 作为一种静态类型语言,对变量的类型定义非常严格。然而,在实际开发中,我们经常需要在不同的类型之间进行转换以满足不同的需求。其中,int、char、String...

    java中堆和栈的区别.pdf

    Java中堆和栈的区别 Java是一种面向对象的编程语言,它的内存管理机制是自动化的,程序员不需要手动地分配和释放内存。Java中堆和栈是两个重要的概念,它们都是Java用于在RAM中存放数据的地方。 栈(Stack)是一块...

    c# object, dynamic, var的区别用例

    string info2 = dyn.param + new Program() + 1; // 正确。但.param不能智能感知。 // 编译通过是因为与dynamic相关的所有类型操作,编译器全部放行。 // 很显然,运行时必然通过“自动反射”进行检查。 string ...

    Java程序设计基础:String类的常用方法(一.pptx

    String类的常用方法(一) 目录 课程导入 掌握获取字符串长度的方法 掌握字符串连接、截取子串的方法 方法定义:public int length() 获取字符串的长度 例如: String message = “Welcome to Java”; System.out....

    java多态作业

    //MouseMotionListener的方法 public void mouseDragged(MouseEvent e){ String s=number+++""+"The mouse Dragged:x="+ e.getX()+"y="+e.getY()+"\n"; tf.append(s); } //MouseMotionListener的方法 ...

    230426-048shopDemo(以泛型方式定义的递归方法构建树型结构数据的2种实现方法)

    string idProperty = "Id", string parentIdProperty = "ParentId", string childrenProperty = "ChildrenCollection") { List<T> _childrenList = new List(); if (parentId == null || parentId == 0) { _...

    java实现的文件复制

    public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); System.out.print("DOS: >"); String command = sc.nextLine(); //split()方法按照...

    asp.net连接数据库

    string str=texuser.Text.ToString(); DataSet Dataset1 = new DataSet(); SqlConnection objConnect;//打开数据库连接 SqlDataAdapter objCommand= new SqlDataAdapter();//数据库命令 string strConnect;//...

    读取Excel.jsx

    通用性强,简单易懂var s = new String(); //利用构造函数定义一个字符串变量 //s=1 //行号 if(doc.layers[0].kind==LayerKind.TEXT)s=doc.layers[0].textItem.contents; var Alie=excel.Range("A"+s); var Blie=...

    复杂邮件程序完整Java源码,支持添加附件,图片,HTML格式文本,支持远程WebService调用

    void sendMail(String sender,String password,String addressee,String subject,String text,Map<String,File> enclosures,Map<String,RecipientType> copyToSends) throws Exception; /** * sendMail 发送...

    vc++6.0中动态数组实现(例如string类对象数组等)[文].pdf

    string *psa = new string[10]; // array of 10 empty strings int *pia = new int[10]; // array of 10 uninitialized ints ``` 这两个 new 表达式都分配了含有 10 个对象的数组,其中第一个数组是 string 类型,第...

    HttpClient以及获取页面内容应用

    ParserFeedback的代码很简单,是针对调试和跟踪分析过程的,一般不需要改变。而使用Lexer???? 3.3.2HtmlPaser使用Node对象保存各节点信息 (1)访问各个节点的方法 Node getParent ():取得父节点 NodeList ...

    Java2023年最新免费面试题及答案附答案汇总.md 免费下载,不需要积分

    String str="i"与 String str=new String("i")一样吗 用过ConcurrentHashMap,讲一下他和HashTable的不同之处 线程的基本状态以及状态之间的关系 线程池中 submit() 和 execute() 方法有什么区别

    Android天气预报实验报告

    //将GPS定位的城市与提供能查天气的城市进行匹配 StringBuilder matchCity = new StringBuilder(city); matchCity.append("."); matchCity.append(towns); //找到省份 ...

    多线程火车售票

    SaleTickets s = new SaleTickets(); //:窗口实例!! Thread t1 = new Thread(s); Thread t2 = new Thread(s); Thread t3 = new Thread(s); Thread t4 = new Thread(s); t1.start(); t2.start(); t3....

    C#教务系统

    public String getconn() //定义一个连接字符串的方法 { connstr = @"data source=.\SQLEXPRESS;initial catalog=sscggl;integrated security=true;"; return connstr; } public bool excutesql(string sql) /...

    JAVA虚拟机内存分配与回收机制[文].pdf

    JAVA虚拟机的内存分配与回收机制是JAVA语言的核心机制之一,栈和堆是JAVA用于在RAM中存放数据的地方,JAVA自动管理栈和堆,程序员不能直接地设置栈或堆。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小...

Global site tag (gtag.js) - Google Analytics