java基础18 String字符串和Object类(以及“equals” 和 “==”的解析)
一、String字符串
问:笔试题:new String("abc")创建了几个对象?
答:两个对象,一个对象是 位于堆内存,一个对象位于字符串常量池
class Demo17 {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
String str4 = new String("hello");
String str5 = new String("hello");
System.out.println("str1==str2? "+(str1==str2)+" ++++++");//true
System.out.println("str2==str3? "+(str2==str3)+" ------");//false
System.out.println("str3==str4? "+(str3==str4)+" ======");//false
System.out.println("str3.equals(str4)? "+(str3.equals(str4))+" ******");//true
System.out.println("str3.equals(str5)? "+(str3.equals(str5))+" ######");//true
System.out.println("str1.equals(str3)? "+(str1.equals(str3))+" &&&&&&");//true
System.out.println("str2.equals(str3)? "+(str2.equals(str3))+" >>>>>>");//true
}
}
结果图:

解析:

1、String str = "hello";这种方式创建字符串时,jvm首先会检查字符串常量池中是否存在该字符串对象;
如果存在,那么就不会在字符串常量池中创建了,直接返回字符串常量池的地址;
如果不存在,那么就会在字符串常量池中先创建该字符串对象,并返回该字符串的地址。
注意:如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等; 比如:String str = 8;和 String str1 = 8;问:(str1==str2)? str和str1比较的是他们的值,而不是地址。
2、String str = new String("hello");这种方式创建字符串对象时,jvm还是首先去检查字符串常量池中是否存在该字符串对象;
如果存在,就不会在字符串常量池中创建了,会在堆内存中创建,并且返回字符串常量池的地址(而不是堆内存的地址)。
如果不存在,那么就先在字符串常量池中创建该字符串对象,然后再到堆内存中创建一份该字符串对象,并把字符串常量池中的该字符串内容拷贝到堆内存中,然后再返回堆内存中该字符串对象的地址。
class Demo18 {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
String str4 = new String("hello");
String str5 = new String("hello");
System.out.println("str3哈希码:"+str3.hashCode());
System.out.println("str4哈希码:"+str4.hashCode());
System.out.println("str5哈希码:"+str5.hashCode());
System.out.println("str3对象:"+str3.toString()+" ======");
System.out.println("str4对象:"+str4.toString()+" ======");
System.out.println("str5对象:"+str5.toString()+" ======");
}
}
结果图:

结论:
1)对于==:
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
2)对于equals方法:
注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
1.1、字符串截取函数
格式:

1.2、大小写转换函数
格式:


举例:
package com.dhb.code; //题目:Mrhaibin,使用截取函数或大写、小写转换函数任意修改
public class Demo2 {
public static void main(String[] args) {
String str = "Mrhaibin"; String str1 = str.toUpperCase();
System.out.println(str1);//运行结果:MRHAIBIN 说明:把所有字母转换成大写字母
String str2 = str.toLowerCase();
System.out.println(str2);//返回结果:mrhaibin 说明:把所有字母转换成小写字母 String str3 = str.substring(1);
System.out.println(str3);//运行结果:rhaibin 说明:从数组下标1(包含1)开始截取,即第二位"r"开始截取后面所有
String str4 = str.substring(2);
System.out.println(str4);//运行结果:haibin 说明:从数组下标2(包含2)开始截取,即第三位"h"开始截取后面所有
String str5 = str.substring(3);
System.out.println(str5);//运行结果:aibin 说明:从数组下标3(包含3)开始截取,即第四位"a"开始截取后面所有 String str6 = str.substring(1,2);
System.out.println(str6);//运行结果:r 说明:从数组下标1(包含1)开始截取,截取(endIndex-beginIndex)个字符,即:2-1=1,截取一个字符
String str7 = str.substring(1,4);
System.out.println(str7);//运行结果:rha 说明:从数组下标1(包含1)开始截取,截取(endIndex-beginIndex)个字符,即:4-1=3,截取三个字符
String str8 = str.substring(2,4);
System.out.println(str8);//运行结果:ha 说明:从数组下标2(包含2)开始截取,截取(endIndex-beginIndex)个字符,即:4-2=2,截取两个字符
String str9 = str.substring(2,6);
System.out.println(str9);//运行结果:haib 说明:从数组下标2(包含2)开始截取,截取(endIndex-beginIndex)个字符,即:6-2=4,截取四个字符 // 截取第一位,并且变为小写字母 截取第二位及后面所有字母
String s = str.substring(0,1).toLowerCase()+str.substring(1);
System.out.println(s);//运行结果:mrhaibin
// 截取第一位,并且转换成大写字母 截取第二位 截取第三位,并且转换成大写字母 截取第四位及后面所有字母,并且全转换成小写字母
String s1 = str.substring(0,1).toUpperCase()+str.substring(1,2)+str.substring(2,3).toUpperCase()+str.substring(3).toLowerCase();
System.out.println(s1);//运行结果:MrHaibin
}
}
//题目:获取G盘下(G:\Java教程\day22\视频\Demo1.java)的文件名:Demo1.java
package com.dhb.code; public class Demo1 {
public static void main(String[] args) {
// 由于\是转义字符,所以写的时候不能直接这么写 G:\Java教程\day22\视频\Demo1.java,会报错;真确写法:\"
getFile("G:\"Java教程\"day22\"视频\"Demo1.java");
}
private static void getFile(String file) {
int index = file.lastIndexOf("\"");//lastIndexOf(int ch, int fromIndex):返回指定字符的最后一次出现的字符串中的索引值
String str = file.substring(index+1);
System.out.println("文件名为:"+str);
}
} //文件名为:/Demo1.java
1.3、判断方法和转换方法
1.3.1、判断方法:
endsWith(String suffix) :测试此字符串是否以指定的后缀结束。
isEmpty() :判断字符串是否为空
contains(CharSequence s) :是否包含指定的字符串序列 应用:(百度)搜索
equals(Object anObject) :是否相等
equalsIgnoreCase(String anotherString):忽略大小写,判断是否相等
1.3.2、 转换方法:
toCharArray() :将此字符串转换为一个新的字符数组。
getBytes() :把字符串转换成字节数组
package com.dhb.code;
public class Demo4 {
public static void main(String[] args) {
//判断方法
String str="Demo.java";
//判断该字符串是否以指定的后缀结束
System.out.println(str.endsWith("ja"));//运行结果:false
System.out.println(str.endsWith("va"));//运行结果:true
System.out.println(str.endsWith("java"));//运行结果:true
System.out.println("判断该字符串是否为空:"+str.isEmpty());//运行结果:false
//判断该字符串是否包含指定的字符串序列
System.out.println(str.contains("mo"));//运行结果:true
System.out.println(str.contains("dm"));//运行结果:false
System.out.println(str.contains("jv"));//运行结果:false
System.out.println(str.contains("ja"));//运行结果:true
System.out.println(str.contains("va"));//运行结果:true
System.out.println(str.contains("java"));//运行结果:true
//判断是否相等
System.out.println(str.equals("De"));//运行结果:false
System.out.println(str.equals("Demo"));//运行结果:false
System.out.println(str.equals("Demo.java"));//运行结果:true
//将一个字符串与另一个字符串相比较,忽略大小写,判断是否相等。
System.out.println(str.equalsIgnoreCase("dEMo.JAvA"));//运行结果:true
System.out.println(str.equalsIgnoreCase("demo.java"));//运行结果:true
System.out.println(str.equalsIgnoreCase("DEMO.JAVA"));//运行结果:true
System.out.println(str.equalsIgnoreCase("Mo.JavA"));//运行结果:false
//转换方法
String str2="Demo4.java";
char[] arr = str2.toCharArray();
System.out.println(arr[]);//运行结果:m arr[2]:第三位字符 "m"; 把字符串转化为字符数组
byte[] arr2 = str2.getBytes();
System.out.println(arr2[]);//运行结果:97 arr2[7]:第八位字符 "a", ASCII码表;把字符串转换成字节数组
}
}
附:ascii码表

1.4、其他 方法
replace(char oldChar, char newChar) :替换指定字符串
split(String regex) :切割(根据指定字符进行切割)
trim() :去除前后空白
package com.dhb.code; import java.util.Arrays;
/*其他:
* replace(char oldChar, char newChar) :替换指定字符串
* split(String regex) :切割
* trim() :去除前后空白
* */
public class Demo5 {
public static void main(String[] args) {
String str = "明天开始要放假";
System.out.println(str.replace("要","不")); //运行结果:明天开始不放假 replace( , )函数:替换指定字符串 String str1 = "2018-04-28";
String[] arr = str1.split("-");
System.out.println(Arrays.toString(arr)); //运行结果:[2018, 04, 28] 即:把2018-04-28切割出来,得到2018 04 28 String str2 = " 大家 上午好! ";
System.out.println(str2.trim()); //运行结果:大家 上午好! 作用:前面和后面的空格全部去掉,但中间的不能删除掉
System.out.println(str2.replace(" ",""));//运行结果:大家上午好! 去除(替换)掉所有的空格。包括前后和中间左右的空格
System.out.println(str2.replaceAll(" +",""));//同上
}
}
二、Object类
Object类是所有类的终极父类,任何一个类都继承Object类的
java是面向对象的语言,核心思想:找适合的对象做适合的事情
方式一:自定义类,通过自定义类来创建对象.
方式二:sun公司提供了很多类给我使用,我们只需要认识这些类,我们就可以通过这些类创建对象.
toString:返回该对象的字符串表示。返回字符串用于描述该对象
疑问:toString有何作用? 答:重写toString子后,我们就可以直接输出一个新对象.
equals(Object obj) 用于比较两个对象的内存地址,判断两个对象是否为同一个对象.
hashCode(): 返回该对象的哈希码值。
2、查看源码的方式
方式一:按住 ctrl键,单击需要看的源码
方式二:把光标移到你需要查看代码处F3
看源代码最忌讳的一点:不要每行代码都弄懂是什么意思,能看懂大概,猜出意思足以.
public class Person{
int id;
String name;
public Person(int id,String name) {
this.id=id;
this.name=name;
}
//目前我们需要直接输出一个对象的时候,输出的格式:编号:110 姓名:狗娃 这个格式.目前Object
//toString方法无法满足子类的需求,那么这时候就应该从写object类的toString进行从写.
@Override
public String toString() {
return "编号:"+this.id+"姓名+"+this.name;
}
//为啥要从写呢:object的equals方法默认比较的是两个对象的内存地址,我们目前需要比较的是两个对象的身份证,所有object类的equals方法不符合我们现在的需求
@Override
public boolean equals(Object obj) {
Person p=(Person)obj;
return this.id==p.id;
}
public Person() {
}
public static void main(String[] args) {
Person p=new Person(110,"狗娃");
Person p1=new Person(110,"二狗子");
System.out.println(p.hashCode()); //运行结果是一串数字、字母之类的字符串
System.out.println(p);//输出结果:编号:110 姓名:狗娃;因为上面重写了toString()方法; 如果不重写toString()方法,输出p.toString(),结果为:com.bw.objects.Person@7ea06d25 完整类名+@+对象的地址(哈希码)
}
}
|
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:http://www.cnblogs.com/dshore123/p/8947289.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
java基础18 String字符串和Object类(以及“equals” 和 “==”的解析)的更多相关文章
- JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类
JAVA之旅(九)--Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 天天被一些琐事骚扰,学习还得继续 一.Object类 Obj ...
- 【转载】JAVA基础复习与总结<三> Object类的常用方法
Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承于某个类,那么它默认继承Object类.这里主要总结Object类中的三个常用方法:toString().equ ...
- Java基础知识强化27:Object类之toString()方法
1. Object类的toString()方法: public String toString():返回该对象的字符串表示 2. 案例演示: (1)Student类: package cn.itc ...
- Java基础知识强化26:Object类之hashCode()方法、getClass()方法
1. Object类的hashCode()方法,如下: public int hashCode():返回该对象的哈希码值,这个值和地址值有关,但是不是实际地址值(哈希码值是根据实际地址值转化过来的 ...
- Java基础-处理json字符串解析案例
Java基础-处理json字符串解析案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 作为一名开发人员,想必大家或多或少都有接触到XML文件,XML全称为“extensible ...
- Java基础复习笔记系列 五 常用类
Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...
- 【Java基础】【11Eclipse使用&Object类型】
11.01_Java开发工具(常见开发工具介绍)(了解) A:操作系统自带的记事本软件 B:高级记事本软件 C:集成开发环境 IDE (Integrated Development Environme ...
- Java Object类及其equals方法
基本概念: Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入: Object类是所有Java类的祖先.每个类都使用 Object 作为超 ...
- Java基础之String、StringBuffer、StringBuilder浅析
Java基础之String.StringBuffer.StringBuilder浅析 一.前言: 位于java.lang包下的String.StringBuilder.StringBuffer一般都是 ...
随机推荐
- 关于未来IT职业教育的思考
回首过去20年的IT教育,从基本的办公软件(应用软件)到基础设施培训(网络.ps.3d等)再到软件开发(java等),可以说是见证了中国计算机发展的整个阶段,随着时代的变迁,计算机从最初的普及阶段到深 ...
- android studio 怎么做屏幕适配?
一.关于布局适配建议1.不要使用绝对布局2.尽量使用match_parent 而不是fill_parent .3.能够使用权重的地方尽量使用权重(android:layout_weight)4.如果是 ...
- dev代码拷贝中文乱码的解决方案
.c / .cpp文件用记事本打开,再拷贝
- windows10下R配置Rstdio,怎么处理
首先要确保电脑上只有一个R程序,然后官网下载Rstdio安装包. 配置:选择Rstdio配置界面的第三项,然后关联到R的安装文件夹下的BIN文件夹即可. 但是,直接打开Rstdio的话,界面会一片空白 ...
- poj 3294 后缀数组 多字符串中不小于 k 个字符串中的最长子串
Life Forms Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 16223 Accepted: 4763 Descr ...
- Service Fabric Placement and Load Balancing
作者:潘罡 (Van Pan)@ Microsoft 什么是PLB (Placement and Load Balancing) 介绍FM的上文中,我们提到了PLB. 这个组件和FM协同工作,为FM提 ...
- python的函数介绍 位置参数 关键字参数 默认参数 参数组 *args **kwargs
1.数学意义的函数与python中的函数 数学意义的函数 y = 2*3+1 x =3 y =7 x是自变量,y是因变量 2.python中定义函数的方法 一个函数往往都是为了完成一个特定的功能而存在 ...
- Redis 3.2.8集群+Sentinel部署
Redis3.2.8集群搭建 采用官方推荐的三主三从分片方案,本例中所有节点部署在一台主机上. 软件安装: tar zxvf redis-3.2.8.tar.gz cd redis-3.2.8 ma ...
- Cloudstack介绍(一)
云计算的出现 基本上,云计算只是一种把 IT 资源当作服务来提供的手段.几乎所有 IT 资源都可以作为云服务来提供:应用程序.计算能力.存储容量.联网.编程工具,以至于通信服务和协作工具. 云计算最早 ...
- P2831 愤怒的小鸟
P2831 愤怒的小鸟 从 \((0, 0)\) 发射一只鸟, 轨迹满足抛物线, 问最少几只鸟可以打完 \(n <= 18\) 只猪 错误日志: 处理抛物线数组没有初始化 Solution 数据 ...