1.String的两种实例化方式

String str="hello";//直接赋值的方式:
String str=new String("hello");//实例化的方式:

 两种实例化方式的比较

public class Test{
public static void main(String args[]){
String str1="hello";
String str2=new String("hello");
String str3=str2;//引用传递,str3直接指向st2的堆内存地址
String str4="hello";
//String类对象==比较,比较的是地址,而不是内容
System.out.println(str1==str2);//false
System.out.println(str1==str3);//false
System.out.println(str3==str2);//true
System.out.println(str1==str4);//true
}
}

内存分析图:

构造方法实例化方式的内存图:String str = new String("hello");

  字符串对象池的概念:

    在字符串中,如果采用直接赋值的方式(String str="hello")进行对象的实例化,则会将匿名对象“hello”放入对象池,每当下一次对不同的对象进行直接赋值的时候会直接利             用池中原有的匿名对象,这样,所有直接赋值的String对象,如果利用相同的“hello”,则String对象==返回true;

案例:对象手工入池

public class TestDemo {
public static void main(String args[]){
String str =new String("hello").intern();//对匿名对象"hello"进行手工入池操作
String str1="hello";
System.out.println(str==str1);//true
}
}

两种实例化方式的区别

  1.直接赋值(String str = "hello"):只开辟一块堆内存空间,并且会自动入池,不会产生垃圾;

  2.构造方法(String str=  new String("hello");):会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收,而且不能够自动入池,需要通过public  String intern();方法进行手工入池;

  在开发的过程中不会采用构造方法进行字符串的实例化;

避免空指向

   == 和·public boolean equals()比较字符串的区别;

    ==在对字符串比较的时候,对比的是内存地址,而equals比较的是字符串内容,在开发的过程中,equals()通过接受参数,可以避免空指向;

String str = null;
if(str.equals("hello")){//此时会出现空指向异常
  ...
}
if("hello".equals(str)){//此时equals会处理null值,可以避免空指向异常
  ...
}

4.String类对象一旦声明则不可以改变;而改变的只是地址,原来的字符串还是存在的,并且产生垃圾

public class TestDemo {
public static void main(String args[]){
String str="hello world";
str="hello";
System.out.println(str);
}
}

最新文章

  1. Starting MySQL... ERROR! The server quit without updating PID file 解决办法
  2. azure存储压测的问题(农码主观意识太强被坑了)
  3. ajax使用post提交中文
  4. android内存泄露小谈
  5. 解决IE6下浮动层固定定位的经典方法
  6. 武汉科技大学ACM:1001: 谁不爱打牌
  7. 下拉菜单中的Option对象
  8. Android开源资料大集合_架构&UI
  9. 《实验数据的结构化程序设计》 2.4.4Calendar个人意见,寻求指引
  10. 在C#环境中动态调用IronPython脚本(一)
  11. 浅谈Android中的组播(多播)
  12. Bandit Wargame Level18 Writeup(interactive shell and .bashrc )
  13. iOS中 UIWebView加载网络数据 技术分享
  14. Java如何在运行时识别类型信息?
  15. Docker发布程序那些事
  16. Linux环境下部署开源版“禅道”方法
  17. 【转载】app测试的过程和重点关注内容
  18. Android为TV端助力 转载弩的博客
  19. Java可视操作界面例子
  20. 使用Postfix和Dovecot收发电子邮件

热门文章

  1. Algorithm --> KMP算法
  2. WPF学习笔记2
  3. Ubuntu16.0.4的磁盘管理
  4. 使用ADO.NET查询和操作数据
  5. RabbitMQ封装实战
  6. bug终结者 团队作业第六、七周
  7. 学号:201621123032 《Java程序设计》第11周学习总结
  8. MongoDb进阶实践之三 MongoDB查询命令详述
  9. 算法题丨3Sum
  10. Linux实战案例(5)关闭Centos的防火墙