字符串就是String类的对象;

字符串的创建方式 :

  1. 1.字面量赋值(直接赋值 比较常用)<br /> String str = "字符串内容"; <br /> 2.new对象赋值 <br /> String str = new String("字符串里面的内容") //每new一个就新开辟一个空间<br /> 两种方式的区别:<br /> new对象赋值时 每new一次就会创建一个新的字符串对象//每new一个新开辟一个空间<br /> 直接赋值 涉及到共享设计模式 <br /> 讲共享设计模式之前 先理解"=="比较是否可以用于对象类型比较<br /> <br /> 之前我们使用"=="比较基本数据类型 相等为True 不相等则false<br /> 但是通过两个Person对象发现 无论属性值是否相等都返回false<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1653372578824-a7478fa7-1c0c-4d83-a882-f224e6b107d0.png#clientId=ue90685da-3592-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=197&id=ufad0c553&margin=%5Bobject%20Object%5D&name=image.png&originHeight=246&originWidth=506&originalType=binary&ratio=1&rotation=0&showTitle=false&size=20693&status=done&style=none&taskId=u7f6bf3bf-2c27-4bcf-94f7-08595e54c62&title=&width=404.8)<br /> 因为"=="是比较 变量栈内存中的值;<br /> 基本数据类型 栈内存存储的变量的值 可以比较<br /> 但是对象在栈内存中存储的是地址<br /> 如果地址不一样 那么"=="比较返回的就是false<br /> 不管堆内存中的属性值是否一样<br /> 所以"=="不适用于对象比较是否平等<br />![字符串new的赋值方式.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1653373883670-c85333f5-da1c-4183-a6b2-c54b4a291db2.png#clientId=ue90685da-3592-4&crop=0.1699&crop=0.0042&crop=0.8987&crop=1&from=paste&height=287&id=ua4425d81&margin=%5Bobject%20Object%5D&name=%E5%AD%97%E7%AC%A6%E4%B8%B2new%E7%9A%84%E8%B5%8B%E5%80%BC%E6%96%B9%E5%BC%8F.png&originHeight=493&originWidth=1328&originalType=binary&ratio=1&rotation=0&showTitle=false&size=21170&status=done&style=none&taskId=u99612165-c190-4def-9d3c-36aef145fbf&title=&width=774)

字符串的共享设计模式 :

   如果字符串都是使用new对象创建出来的<br />       那么每new一次 都会开辟一个独立空间<br />         相互之间  就算是字符串内容一样<br />       "=="比较也会返回false  因为地址不一样<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1653373783764-379e78f3-33c9-4f42-b264-eab94d1300dd.png#clientId=ue90685da-3592-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=118&id=u048fbdde&margin=%5Bobject%20Object%5D&name=image.png&originHeight=148&originWidth=458&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13362&status=done&style=none&taskId=ue09cb1dd-052a-414f-bd8d-44ac351020c&title=&width=366.4)<br />      如果字符串同为直接赋值的情况下;<br />      系统考虑到  字符串内容都是固定的<br />      多个字符串如果内容一样 反复开辟空间<br />      太过于浪费<br />     所以如果字符串是直接赋值 那么第一个直接赋值的字符串<br />      会开辟一个空间     第二个如果和前面直接赋值的字符串内容一样<br />     则不在单独开辟空间   而是直接把地址共享    为了节省内存<br />        一但地址共享 那么"=="比较就会返回true   因为地址相同<br />图解 :<br />![字符串直接赋值的共享设计模式.png](https://cdn.nlark.com/yuque/0/2022/png/28889470/1653373838792-de0a4fce-90df-4513-8c3c-ef107961d112.png#clientId=ue90685da-3592-4&crop=0.0779&crop=0&crop=0.8971&crop=1&from=paste&height=323&id=u3fce51f4&margin=%5Bobject%20Object%5D&name=%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9B%B4%E6%8E%A5%E8%B5%8B%E5%80%BC%E7%9A%84%E5%85%B1%E4%BA%AB%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.png&originHeight=493&originWidth=1328&originalType=binary&ratio=1&rotation=0&showTitle=false&size=21147&status=done&style=none&taskId=u6657b43b-c981-4d13-959c-39a416d91b0&title=&width=870)<br />那么字符串比较 使用"=="可以嘛?<br />    不可以!!!!!!

符串官方提供了一个方法 专门比较堆内存中 字符串的值是否相等的方法:
字符串.equals(其他字符串) 返回true表示相等
不管new对象赋值还是 直接赋值 都能比较出来是否相等
实际开发 字符串比较使用 equals方法
image.png