java笔记04: String的理解与运用
一,“==”与equals()
运行以下代码,如何解释其输出结果?
public class StringPool {
public static void main(String args[])
{
String s0="Hello";
String s1="Hello";
String s2="He"+"llo";
System.out.println(s0==s1);//true
System.out.println(s0==s2);//true
System.out.println(new String("Hello")==new String("Hello"));//false
}
}
首先s0==s1
在Java执行时会维护一个String堆,对于一些可以共享的字符串对象,会先在堆中查找是否存在相同的String内容(字符相同),如果有就直接返回,不创建新对象。
s0中的值是引用的s1的值,自己并没有创建对象,所以比较后的结果是true。
同理,s2中的值也是引用S1的值,所以比较的结果也是true
new String("Hello")==new String("Hello")
同时在堆中new了两个对象,这两个对象的内容都是Hello,
但就好比a篮子和b篮子都装了一个苹果,a篮子装了苹果后和b篮子装了苹果后能判相等吗?
当然不行,假设苹果都是一样的,那苹果当然能和苹果相等,但是篮子却是不一样的
在Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。
编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。这种优化工作由Java编译器自动完成。
当直接使用new关键字创建字符串对象时,虽然值一致(都是“Hello”),但仍然是两个独立的对象。
Java中“==”的使用
1基本数据类型:比较的是内容;
2引用数据类型:比较的是对象地址;
再看以下代码
public static void main(String args[])
{
String s1="a";
String s2=s1;
System.out.println(s1==s2);//true
s1+="b";
System.out.println(s1==s2);//false
System.out.println(s1=="ab");//false
System.out.println(s1.equals("ab"));//true
}
分析:
给字串变量赋值意味着:两个变量(s1,s2)现在引用同一个字符串对象“a”!
String对象的内容是只读的,使用“+”修改s1变量的值,实际上是得到了一个新的字符串对象,其内容为“ab”,它与原先s1所引用的对象”a”无关,所以,s1==s2返回false;
代码中的“ab”字符串是一个常量,它所引用的字符串与s1所引用的“ab”对象无关。
String.equals()方法可以比较两个字符串的内容。
二,String,equals()方法
java中的String.equals()方法的实现代码:
equals()法是根类Object中的方法。源代码如下:
public boolean equals(Object obj)
{
return (this == obj);
} //可见默认的equals方法,直接调用==,比较对象地址。
//
//不同的子类,可以重写此方法,进行两个对象的equals的判断。
//String类源码中重写的equals()方法的实现代码如下: public boolean equals(Object anObject)
{
if(this==anObject) return true; 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;
//若比较过程中出现不等,则俩字符串不等,返回false
i++;
} return true;
//直至比较完两个字符串长度,跳出while循环
// 此时说明俩字符串相等,返回true }
} return false;
//两个字符串长度不一样,俩字符串不等,
//不必一个个比较内容,直接返回false
}
注:instanceof是Java、php的一个二元操作符(运算符),和==,>,<是
同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用
是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来
判断继承中的子类的实例是否为父类的实现。
从上面的代码可以得知:
(1) String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。
(2)如果不是同有一个对象,equals方法则继续挨个比较两个字符串对象内的字符,只有完全
相等才返回true,否则返回false。
三,整理String类的Length()、charAt()、 getChars()、replace()、 toUpperCase()、 toLowerCase()、trim()、toCharArray()使用说明罚款
Length():获取字串长度
charAt():获取指定位置的字符
getChars():获取从指定位置起的子串复制到字符数组中
replace():子串替换
toUpperCase()、 toLowerCase():大小写转换
trim():去除头尾空格
toCharArray():将字符串对象转换为字符数组
四,
String类的方法可以连续调用:
String str="abc";
String result=str.trim().toUpperCase().concat("defg");
请阅读JDK中String类上述方法的源码,模仿其编程方式,编写一个MyCounter类,它的方法也支持上述的“级联”调用特性,其调用示例为:
MyCounter counter1=new MyCounter(1);
MyCounter counter2=counter1.increase(100).decrease(2).increase(3);
public class MyCounter {
int i;
MyCounter(int n){
i=n;
}
public MyCounter increase(int n) {
this.i=this.i+n;
return this;
}
public MyCounter decrease(int n) {
this.i=this.i-n;
return this;
}
public static void main(String[] args) {
MyCounter counter1=new MyCounter(1);
MyCounter counter2=counter1.increase(100).decrease(2).increase(3);
System.out.println("counter2.i="+counter2.i);
}
}
java笔记04: String的理解与运用的更多相关文章
- java笔记之String的应用
说来这String字符串也是运用广泛了,但是String的一些使用方法你是否能够了解清楚呢? 这是我这几天来整理的String笔记,其实这也是不全面的,要想深入了解,还得自己去oracle官网看JDK ...
- Java笔记:String类
1.String类是不可变类,一旦一个String对象被创建以后,包含在这个对象中的字符序列式不可改变的,直至这个对象被销毁. String s1 = "java"; s1 = s ...
- java面试之String的理解(自我理解)
1.String是基本数据类型吗? 不是,是对象,引用数据类型 2.String是可变吗? 不可变,String是final类型的. 3.怎样比较两个字符串的值相同,怎样比较两个字符串是否为同一对象? ...
- Java笔记 #04# 类的初始化顺序补充
参考java中的类的初始化顺序详解 package org.sample; class Bread { Bread() { System.out.println("Bread()" ...
- Java笔记之String
1. String s="a",t="b"; t.concat(s); 之后,t仍然是"b",而不是"ba",要使t是& ...
- Java:并发笔记-04
Java:并发笔记-04 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 本章内容-3 线程状态转换 活跃性 Lock 3.10 重新理解线程状态转换 假设有线 ...
- java笔记--理解java类加载器以及ClassLoader类
类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...
- JAVA自学笔记04
JAVA自学笔记04 1.switch语句 1)格式:switch(表达式){ case 值1: 语句体1; break; case 值2: 语句体2; break; - default: 语句体n+ ...
- 深入理解Java中的String
一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class String implements java.io.Ser ...
随机推荐
- java数据类型与二进制
在java中 Int 类型的变量占 4个字节 Long 类型的变量占8个字节 一个程序就是一个世界,变量是这个程序的基本单位. Java基本数据类型 1. 整数类型 2. ...
- 火狐html5拖拽 弹出新页面解决办法
今天做项目时,需要实现一个拖拽排序的功能,遂想到了html5的拖拽,便开始查资料,写代码.功夫不复有心人,通过网上资料作参考,排序功能成功实现.谷歌浏览器测试,拖拽平滑,无问题.火狐浏览器测试时,却无 ...
- C#设计模式(6)-原型模式
引言 上一篇介绍了设计模式中的抽象工厂模式-C#设计模式(3)-建造者模式,本篇将介绍原型模式: 点击这里查看全部设计模式系列文章导航 原型模式简介 原型模式:用原型实例指定创建对象的种类,并且通过拷 ...
- 【实验吧】Reverse400
在网上下载,pyinstxtractor.py,对Reverse400.exe进行反汇编 得到其源代码为 $ cat Revesre03 data = \ "\x1c\x7a\x16\x77 ...
- CSS公用
*{font-size: 100px;} body,span,h1,h2,h3,h4,h5,h6,li,ul,p,em,strong,ol,form,pre,input,article,header, ...
- 新旧apache HttpClient 获取httpClient方法
在apache httpclient 4.3版本中对很多旧的类进行了deprecated标注,通常比较常用的就是下面两个类了. DefaultHttpClient -> CloseableHtt ...
- MySql join on 和 where
原文:http://www.cnblogs.com/Jessy/p/3525419.html left join :左连接,返回左表中所有的记录以及右表中连接字段相等的记录. right join : ...
- sdk&jdk&jre
1. jre and jdkJRE(Java Runtime Enviroment)是Java的运行环境.面向Java程序的使用者,而不是开发者.如果你仅下载并安装了JRE,那么你的系统只能运行Jav ...
- getField()和select()方法的区别
在ThinkPHP中,查询数据库是必不可少的操作. 那么,getField()方法和select()方法都是查询的方法,到底有什么不同呢? 案例来说明: A.select()方法 例子1 $acces ...
- ThinkPHP5高阶实战教程
tp5项目:https://www.kancloud.cn/mikkle/thinkphp5_study/396283