一,“==”与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的理解与运用的更多相关文章

  1. java笔记之String的应用

    说来这String字符串也是运用广泛了,但是String的一些使用方法你是否能够了解清楚呢? 这是我这几天来整理的String笔记,其实这也是不全面的,要想深入了解,还得自己去oracle官网看JDK ...

  2. Java笔记:String类

    1.String类是不可变类,一旦一个String对象被创建以后,包含在这个对象中的字符序列式不可改变的,直至这个对象被销毁. String s1 = "java"; s1 = s ...

  3. java面试之String的理解(自我理解)

    1.String是基本数据类型吗? 不是,是对象,引用数据类型 2.String是可变吗? 不可变,String是final类型的. 3.怎样比较两个字符串的值相同,怎样比较两个字符串是否为同一对象? ...

  4. Java笔记 #04# 类的初始化顺序补充

    参考java中的类的初始化顺序详解 package org.sample; class Bread { Bread() { System.out.println("Bread()" ...

  5. Java笔记之String

    1. String s="a",t="b"; t.concat(s); 之后,t仍然是"b",而不是"ba",要使t是& ...

  6. Java:并发笔记-04

    Java:并发笔记-04 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 本章内容-3 线程状态转换 活跃性 Lock 3.10 重新理解线程状态转换 假设有线 ...

  7. java笔记--理解java类加载器以及ClassLoader类

    类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...

  8. JAVA自学笔记04

    JAVA自学笔记04 1.switch语句 1)格式:switch(表达式){ case 值1: 语句体1; break; case 值2: 语句体2; break; - default: 语句体n+ ...

  9. 深入理解Java中的String

    一.String类 想要了解一个类,最好的办法就是看这个类的实现源代码,来看一下String类的源码: public final class String implements java.io.Ser ...

随机推荐

  1. 201521123090《Java程序设计》第10周学习总结

    本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 书面作业 本次PTA作业题集异常.多线程 finally 题目4-2 1.1 截图你的提交结果(出现学号) 1.2 ...

  2. ACM退役记&&回忆录

    ACM退役记 2017.9.19星期二,"九一八事变"八十六年后的第二天,永远记住这个日子,刚好是我报名ACM到现在,刚好满一年,而今天正是我注册杭州电子科技大学OJ的时间(就是这 ...

  3. org.springframework.expression.spel.SpelEvaluationException: EL1011E: Method call: Attempted to call method test() on null context object

    前言 本文中提到的解决方案,源码地址在:springboot-thymeleaf,希望可以帮你解决问题. 至于为什么已经写了一篇文章thymeleaf模板引擎调用java类中的方法,又多此一举的单独整 ...

  4. 快速学会require的使用

    快速学会使用require.js 1.get start 先到官网下载requirejs到本地,官方同时提供Node版本r.js,我们只使用requirejs即可. 接下来在页面上写入 <scr ...

  5. angularjs之ui-bootstrap的Datepicker Popup实现双日期选择控件

    最开始使用ui-bootstrap的Datepicker Popup日期选择插件实现双日期选择时间范围时,在网上搜了一些通过JS去实现的方法,不过后来发现可以不必通过JS去处理,只需要使用其自身的属性 ...

  6. Https系列之四:https的SSL证书在Android端基于okhttp,Retrofit的使用

    Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http ...

  7. Invoke 用法

    转自:http://blog.sina.com.cn/s/blog_5a6f39cf0100s23x.html 在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法 ...

  8. axios 学习笔记

    官方文档地址:https://github.com/axios/axios axios 是一个基于 Promise 的HTTP库,可以用在浏览器和 node.js 中 特性: • 从浏览器发起 XML ...

  9. 第4章 同步控制 Synchronization ----Interlocked Variables

    同步机制的最简单类型是使用 interlocked 函数,对着标准的 32 位变量进行操作.这些函数并没有提供"等待"机能,它们只是保证对某个特定变量的存取操作是"一个一 ...

  10. mybatis 错误CGLIB is not available

    ### Error querying database. Cause: java.lang.IllegalStateException: Cannot enable lazy loading beca ...