Java基础之String中equals,声明方式,等大总结
无论你是一个编程新手还是老手,提到String你肯定感觉特别熟悉,因为String类我们在学习java基础的时候就已经学过,但是String类型有我们想象的那么简单吗?其实不然,String类型的知识点还是比较多的。今天就和大家来一起讨论一下,关于String的一些容易让人疑惑的地方,废话不多说进入正题。。。如有谬误请批评指正,如果有疑问请留言。我会在第一时间修改或回答
通过本篇博客你将学到以下知识
①==和equals的区别,String a="abc"和String a=new String("abc")的堆内存和栈内存的变化
②String a="abc"和String a=new String("abc")两种声明方式的区别
④String对象的值是不能修改的,为啥可以重新赋值,并且改变
⑤String a;和String a = null,String a =""的区别
- public class StringDemo {
- public static void main(String[] args) {
- String str1 = "hello";
- String str2 = new String("hello");
- String str3 = str2;
- System.out.println("str1==str2:"+(str1==str2));
- System.out.println("str1==str2:"+(str1==str3));
- System.out.println("str1==str2:"+(str2==str3));
- }
- }
打印结果如下
- public class StringDemo {
- public static void main(String[] args) {
- String str1 = "hello";
- String str2 = new String("hello");
- String str3 = str2;
- System.out.println("str1 equals str2:"+(str1.equals(str2)));
- System.out.println("str1 equals str2:"+(str1.equals(str3)));
- System.out.println("str1 equals str2:"+(str2.equals(str3)));
- }
- }
因为equals方法的作用是将内容进行比较,所以此处的返回结果都为true。
str1="hello";实际上就是把一个在堆内存中开辟好的堆内存空间的使用权给了str1对象,而使用这种方法还有另外一个好处,就是如果一个字符串已经被一个名称所引用,则以后再有相同的字符串声明时,就不会再重新开辟空间,而继续使用已经开辟好的堆内存,啥意思?我们通过一个例子来进行说明,这个例子的代码如下
- public class StringDemo {
- public static void main(String[] args) {
- String str1 = "hello";
- String str2 = "hello";
- String str3 = "hello";
- System.out.println("str1==str2:" + (str1 == str2));
- System.out.println("str1==str3:" + (str1 == str3));
- System.out.println("str2==str3:" + (str2 == str3));
- }
- }
咦,这是啥子情况啊?上面我们刚得出结论"=="在String中比较的是地址值,为什么打印结果都是true呢?其实这是java中一种共享设计,这种设计思路是,在java中形成一个对象池,在这个池中保存多个对象,新实例化的对象如果已经在池中定义了则不再重新定义,而从池中取出继续使用。String采用了这种设计,在Java运行环境中有一个字符串池,由String类维护。执行语句String str1="hello"时,首先查看字符串池中是否存在字符串"hello",如果存在则直接将"hello"赋给str1,如果不存在则先在字符串池中新建一个字符串"hello",然后再将其赋给str1。执行语句String str=new String("hello")时,不管字符串池中是否存在字符串"hello",直接新建一个字符串"hello"(注意:新建的字符串"hello"不是在字符串池中),然后将其付给str。前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。String str = new String()创建了一个空字符串,与String
str=new String("")相同。
- public class StringDemo {
- public static void main(String[] args) {
- String str="hello";
- str=str+" world!";
- System.out.println("str="+str);
- }
- }
打印结果
- public class StringDemo {
- public static void main(String[] args) {
- String str1 = "hello";
- String str2 = null;
- System.out.println(str1.equals(str2));
- }
- }
- public class StringDemo {
- public static void main(String[] args) {
- String str1 = "hello";
- String str2 = null;
- System.out.println(str2.equals(str1));
- }
- }
和上面的代码唯一不同的是上面是str1.equals(str2),这里是str2.equals(str1),我们看看打印结果会是啥样。
- /**
- * Compares this string to the specified object. The result is {@code
- * true} if and only if the argument is not {@code null} and is a {@code
- * String} object that represents the same sequence of characters as this
- * object.
- *
- * @param anObject
- * The object to compare this {@code String} against
- *
- * @return {@code true} if the given object represents a {@code String}
- * equivalent to this string, {@code false} otherwise
- *
- * @see #compareTo(String)
- * @see #equalsIgnoreCase(String)
- */
- public boolean equals(Object anObject) {
- //判断是否是和自己比较
- if (this == anObject) {
- return true;
- }
- //判断传过来的anObject是否是String类型的实例
- if (anObject instanceof String) {
- String anotherString = (String) anObject;
- int n = value.length;
- if (n == anotherString.value.length) {
- char v1[] = value;
- char v2[] = anotherString.value;
- int i = 0;
- //逐个字符进行比较
- while (n-- != 0) {
- if (v1[i] != v2[i])
- return false;
- i++;
- }
- return true;
- }
- }
- return false;
- }
str2=null,此时str2并不是String类型的实例,不信你可以去验证,因为String str2=null,申明一个String类型的str2,同时在内存里申请了一个地址,但是该地址不指向任何引用地址,所以在执行这个判断时直接跳出if语句返回false。所以就不会报空指针啦啦啦。。。
String a = null ;申明一个string类型的 a,同时在内存里申请了一个地址,但是该地址不指向任何引用地址;
String a = "" ;申明一个string类型的 a,既在内存里申请了地址,该地址又指向一个引用该字符串的引用地址;
string a=null,String b="hello"; system.out.println(a+b);输出nullhello;
s1=new String("s1")时创建了两个对象,而接着执行String s2=new String("s1")时,("s1")也会被作为常量读入,但是由于String池中已经有了"s1"所以这一次不会在String池中创建对象了,而执行new时是必须要创建对象的,所以执行String s2=new String("s1");时创建了一个对象。看下面两段代码:
String s2 = new String("s1"); //创建一个对象,并且以后每执行一次创建一个对象,一个引用
String s4 = "xyz"; //不创建对象,只是创建一个新的引用
Java基础之String中equals,声明方式,等大总结的更多相关文章
- java基础解析系列(十一)---equals、==和hashcode方法
java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系 ...
- Java基础之String、StringBuffer、StringBuilder浅析
Java基础之String.StringBuffer.StringBuilder浅析 一.前言: 位于java.lang包下的String.StringBuilder.StringBuffer一般都是 ...
- Java 字符串比较,String 中的一些方法 == 和 equals 的详解
"==" 是比较的是两个对象的内存地址,而equals方法默认情况下是比较两个对象的内存地址. 1.String str = "hello" 生成的字符串,首 ...
- java基础63 JavaScript中的Number、Math、String、Date对象(网页知识)
本文知识点(目录): 1.Number对象 2.Math对象 3.String对象 4.Date对象 (日历例子) 1.Number对象 1.1.Number对象的创建方式 方式1: ...
- 【Java基础】String 相关知识点总结
String 相关知识点总结 字符串的不可变性 概述 String 被声明为 final,因此它不可继承 在 Java8 中,String 内部使用 char 数组存储数据 public final ...
- Java基础:hashCode与equals个人学习记录
摘要: 本文主要记录本人对hashCode和对equals两个知识点的学习过程. 从学生时期初学java,就知道hashCode和equals这两个方法,工作中equals方法使用也是特别频繁,要说e ...
- Spring基础——IOC九种bean声明方式
Spring简介 Spring不是服务于开发web项目的功能,或业务.而是服务于项目的开发,方便各层间的解耦调用,方便对类的批量管理,是提高软件开发效率,降低后期维护成本的框架. Spring的核心思 ...
- Java 基础之 String 类
String String 被声明为 final,因此不能被继承.(Integer 等包装类也不能被继承) 在 java8 中,String 内部使用 char 数组 来存储数据 public fin ...
- String基础: String两种创建对象方式的比较
字符串常量 在一般的语言中常量一旦声明则不可改变,在java中的字符串常量是以匿名对象来表示的 javaz中字符串两种定义方法: String strA= new String("hello ...
随机推荐
- C语言中Linux环境下编译与链接
编写一个简单的 hello.c 文件,以此为例. 1.编译并链接一个完全包含于一个源文件的C程序. gcc hello.c gcc -Wall hello.c gcc -o hello hello.c ...
- Beta冲刺——总结
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 团队GitHub地 ...
- fist-第一天随笔
这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzzcxy/2018SE1 这个作业要求在哪里 https://edu.cnblogs.com/campus/fz ...
- 跟我一起学Redis之Redis持久化必知必会
前言 Redis是出了名的速度快,那是因为在内存中进行数据存储和操作:如果仅仅是在内存中进行数据存储,那就会导致以下问题: 数据随进程退出而消失:当服务器断电或Redis Server进程退出时,内存 ...
- Day2 【Scrum 冲刺博客】
每日会议总结 昨天已完成的工作 方晓莹(PIPIYing) 新增人员管理页面的开发 静态页面的进一步完善 方子茵(Laa-L) 完成车辆查询接口 黄芯悦(Sheaxx) 新增社区通知页面 新增社区活动 ...
- python+eclipse 引用 import requests报错解决。
用pip install requests命令执行安装下 再重启eclipse就好了. 用pip install requests命令执行安装下 再重启eclipse就好了. 用pip install ...
- 【WC2014】紫荆花之恋(替罪羊重构点分树 & 平衡树)
Description 若带点权.边权的树上一对 \((u, v)\) 为 friend,那么需要满足 \(\text{dist}(u, v) \le r_u + r_v\),其中 \(r_x\) 为 ...
- 关于微信NFC功能开发的链接总结
特此申明:若有侵权,请联系我,我会第一时间删除 一. 小程序开发一般流程: 首先调用 wx.getHCEState(OBJECT), 判断设备是否支持NFC,(ios,android兼容性处理) 调用 ...
- Pytest 学习(二十五)- 解决pytest参数化测试标题都一样问题
前言 使用参数化测试化后,allure的报告如下显示: 源代码如下: # -*- coding: utf-8 -*- # @Time : 2020/12/13 17:27 # @Author : lo ...
- 用rundeck启动tomcat报错
报错如下Neither the JAVA_HOME nor the JRE_HOME environment variable is defined09:28:50 At least one of t ...