1。这个类的实例可以直接赋值,为什么如此,虚拟机对他进行了特殊处理有string pool
2。让我们可以收入理解==与equals
3。还有特殊的intern方法
String s1=new String("aaa");
String s2=new String("aaa");
System.out.println(s1==s2);
String s3="aaa";
String s4="aaa";
System.out.println(s3==s4);
System.out.println(s1==s4);
String s5="hello";
String s6="hell";
String s7="o";
System.out.println(s5==s6+s7);
System.out.println(s5=="hell"+"o");
System.out.println(s3.equals(s4));
测试结果:
false
true
false
false
true
true
原因如下:
==怎么用
原生数据类型,比较两边的值是否相等
对于引用,比较左右两边的引用是否指向同一个对象,或者说引用地址是否相同.
equals则不同
判断内容相等否,前面==只是里面第一个判断,如果等,他直接返回,不等就继续判断下面的
equals定义在Object里面,java每个类都会具有这个方法,但这个里面只是判断引用地址是否相等.
为什么具有作用呢?关键在于重写了....
Object里面本来也没什么属性之类的,怎么判断,不这样你要人家怎么样.
字符串是常量,一旦确定就不能改变 用+号是创建一个新的字符串引用指向它,而不是原有字符串的追加.
String pool(字符串池)
首先检查字符串池里面有没有这个,将已经存在的返回赋值给它,不存在则在池中创建一个,然后赋值给它.
String s1="aaa";
Stirng s2="aaa";
s==s2 true
如果是new则不一样
首先看string pool里面是否有
没-->>在pool里面创建,然后在堆中创建一个对象,然后将堆中的地址放回来,赋值给它
有-->>不在创建,直接在堆中创建,然后将堆中的地址直接赋值给它
String ss1=(String)str;
String ss2=ss1.intern();
System.out.println(ss2==ss1);
System.out.println(ss2=="zilei");
结果如下
false
true
原因:
这个方法返回的是字符串池中与他相等的那个字符串的地址.
首先equals方法对比,我们看jdk源码就知道,Object类的equals方法跟==没有任何区别,虽然我们都在说equals是比较内容相不相等,可惜在这个顶层类中,jkd没有实现什么
测试如下
Object o1=new Object();
Object o2=new Object();
System.out.println(o1==o2);
System.out.println(o1.equals(o2));
为什么等于false不是内容相等吗
源代码 return (this == obj);说明一切
但我们通常用到的String则不一样,这是String类重写了这个方法
我们自己创建一个类,如果不重写这个方法就还是==跟equals没什么区别,Object里面的方法,我们用到的类直接或者间接继承了它,然后自然也有了这些方法,比如toString(),Object里面只是打印出地址而已,String类实例调用就打印出了字符串,这是它重写了
继承中的转型问题
不向下转型不能调用子类中的方法.只能调用父类中的,但是在运行中,如果子类重写了这个方法,则调用子类的
Object str=new String("zilei");
//调用的是子类的
System.out.println(str.equals("zilei"));
如果要使用子类的方法必须String str1=(String)str;强制转换
此时可以调用子类的方法.
没有向上转型,直接强制转换
Object str=new Object();
String str1=(String)str
肯定不行,发生类型转换异常.
分享到:
相关推荐
1. **构造函数**:构造函数是类的一个特殊函数,用于初始化新创建的对象。对于`string`类,我们可以定义一个默认构造函数,接受空字符串,以及一个接受C风格字符串指针的构造函数,将指针内容复制到自定义`string`...
在C++编程语言中,`String`类是一个非常基础且重要的数据类型,它用于处理字符串。C++标准库提供了一个名为`std::string`的类,但在此案例中,我们讨论的是一个自定义的`String`类。创建自己的`String`类通常是学习...
在C++编程语言中,`std::string` 类是用于处理字符串的重要工具,它提供了丰富的功能,如创建、修改、操作和查询字符串。本篇文章将深入解析`std::string`类的一些关键知识点,特别是根据标题描述提及的拷贝构造函数...
在C++编程中,`String`类是一种常用的用于表示和操作字符串的数据结构。虽然C++标准库中已经提供了`...在实际项目中,除非有特殊需求,通常推荐使用已有的`std::string`,因为它已经优化了性能,且提供了丰富的功能。
在C++中,`std::string`类是用于处理字符串的高效且方便的工具,它提供了许多内置功能,如插入、删除、查找、比较等。然而,在某些情况下,程序员...在实际开发中,除非有特殊需求,通常建议优先使用`std::string`。
在C++编程语言中,`std::string`是标准库中的一个强大且灵活的字符串类。...不过,除非有特殊理由,通常建议优先使用标准库提供的`std::string`,因为它经过了广泛的测试和优化,具有良好的兼容性和性能。
赋值运算符(=)**:`std::string`类中已经有一个默认的赋值运算符,但如果你希望在复制字符串时执行特殊操作(例如深拷贝),你可以重写这个运算符。例如: ```cpp class MyString : public std::string { public: ...
5. **与Cocos2d-x的集成**:由于是专为Cocos2d-x设计的,这个`String`类可能考虑了游戏开发的特殊需求,如与Cocos2d-x的文本组件或其他游戏特定功能的兼容性。 在实际使用中,这个封装的`String`类可以帮助开发者更...
C# String 类型:特殊的引用类型 C# String 类型是一个特殊的引用类型,它的实例是只读的。这意味着 String 类型的变量在被赋值时,实际上是重新创建了一个字符串,而不是修改原来的字符串。这点与其他引用类型不同...
尽管如此,`String` 类拥有其独特之处,比如它是不可变的(final),这保证了字符串一旦创建便不能更改其内容。 **常量池(Constant Pool)**:在 Java 编译阶段确定的数据集合,存储在 `.class` 文件中。它包含了类...
标准库中的`std::string`类为开发者提供了高效且易用的字符串操作功能,但在某些特定场景下,可能需要实现一个自定义的字符串类来满足特殊需求或者深入理解字符串类内部的工作原理。本文将详细介绍一个简单的自定义`...
Java 中的 String 类是一个特殊的类,它是一个 immutable 类,也就是说,一旦创建了 String 对象,它的值就不能被改变。String 类的 immutable 性质是通过 final 关键字实现的。 二、String 对象的创建 Java 中有...
在这个“C++实现的String字符串类”中,我们将探讨类的设计、重载操作符、内存管理以及类的组合。 首先,一个自定义的`String`类通常会包含以下几个核心部分: 1. **数据成员**:存储字符串的实际字符序列,通常是...
JNI处理String[]等特殊类型的数据,别处绝对中不到的
在Android开发中,String Resources是用于管理应用内所有文本内容的重要工具。它允许开发者在一个集中的地方定义字符串,便于维护、本地化以及动态格式化。本文将深入探讨Android String Resources的使用,包括国际...
在Java编程语言中,`String`类是使用最频繁的类之一,它代表不可变的字符序列。本文将深入探讨`String`类的基本概念、特性、常见操作以及与其他数据类型的关系,帮助你更好地理解和运用这一核心类。 首先,`String`...
string是C++、java、VB等编程语言中的字符串,字符串是一个特殊的对象,属于引用类型。 在java、C#中,String类对象创建后,字符串一旦初始化就不能更改,因为string类中所有字符串都是常量,数据是无法更改,由于...
本篇文章将详细讲解`String`和`Date`工具类中涉及的知识点,以及如何在实际开发中有效地运用它们。 首先,我们来看`String`工具类。在Java中,`String`对象是不可变的,这意味着一旦创建,就不能改变其内容。因此,...
在C#编程语言中,`String`类是一个非常核心且常用的部分,它代表不可变的字符序列。在深入探讨`String`类之前,先要理解C#与SQL Server数据库技术的结合,因为这两个领域的知识是现代软件开发中的基础。`String`类在...