博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
String类
阅读量:6817 次
发布时间:2019-06-26

本文共 1087 字,大约阅读时间需要 3 分钟。

Java中String是一个特殊的包装类数据有两种创建形式:

  1. String s = "abc";
  2. String s = new String("abc");    

    第一种先在栈中创建一个对String类的对象引用变量s,然后去查找"abc"是否被保存在字符串常量池中,如果没有则在栈中创建三个char型的值'a'、'b'、'c',然后在堆中创建一个String对象object,它的值是刚才在栈中创建的三个char型值组成的数组{'a'、'b'、'c'},接着这个String对象object被存放进字符串常量池,最后将s指向这个对象的地址,如果"abc"已经被保存在字符串常量池中,则在字符串常量池中找到值为"abc"的对象object,然后将s指向这个对象的地址。

    第一种特点:JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。

    第二种可以分解成两步1、String object = "abc"; 2、String s = new String(object); 第一步参考第一种创建方式,而第二步由于"abc"已经被创建并保存到字符串常量池中,因此jvm只会在堆中新创建一个String对象,它的值共享栈中已有的三个char型值。

    第二种特点:一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象。

    在讲字符串比较前,必须要了解==和equals的区别:

因为java所有类都继承于Object基类,而Object中equals用==来实现,所以equals和==是一样的,都是比较对象地址,java api里的类大部分都重写了equals方法,包括基本数据类型的封装类、String类等。对于String类==用于比较两个String对象的地址,equals则用于比较两个String对象的内容(值)。

 

 

关于String的不可变设计:

    String是不可改变类(记:基本类型的包装类都是不可改变的)的典型代表,也是Immutable设计模式的典型应用,String变量一旦初始化后就不能更改,禁止改变对象的状态,从而增加共享对象的坚固性、减少对象访问的错误,同时还避免了在多线程共享时进行同步的需要。

    Immutable模式的实现主要有以下两个要点:

    1.除了构造函数之外,不应该有其它任何函数(至少是任何public函数)修改任何成员变量。

    2.任何使成员变量获得新值的函数都应该将新的值保存在新的对象中,而保持原来的对象不被修改。

转载于:https://www.cnblogs.com/chenwei123/p/5561845.html

你可能感兴趣的文章
Spring Boot中使用WebSocket总结(三):使用消息队列实现分布式WebSocket
查看>>
世界上最贵的几幅画(纯属扯淡)
查看>>
iOS 面向协议封装全屏旋转功能
查看>>
js难点精解-----原型和原型链的关系和应用
查看>>
Framework 源码解析知识梳理(6) ContentProvider 源码解析
查看>>
函数式编程 - 玩转高阶回调函数
查看>>
从零实现Vue的组件库(五)- Breadcrumb 实现
查看>>
狙杀页面卡顿 —— Performance 指北
查看>>
客户端C++与前端js交互
查看>>
即时通讯框架T-io之WebSocket协议再之HelloWorld
查看>>
支付宝首页刷新的实现方案
查看>>
从实现后台商品属性代码说起,聊聊相关的思维!JS、模拟数据、桥梁
查看>>
zookeeper 高可用集群搭建
查看>>
JavaScript基础——深入学习async/await
查看>>
node中的精髓Stream(流)
查看>>
使用 ES-Hadoop 将 Spark Streaming 流数据写入 ES
查看>>
NativeScript-Vue,了解一下?
查看>>
Spark ML 特征转换及处理算子实战技巧-Spark商业ML实战
查看>>
ios时间那点事 NSCalendar NSDateComponents
查看>>
限流原理解读之guava中的RateLimiter
查看>>