zoukankan      html  css  js  c++  java
  • java基础18 String字符串和Object类(以及“equals” 和 “==”的解析)

    一、String字符串

    问:笔试题:new String("abc")创建了几个对象?
    答:两个对象,一个对象是 位于堆内存,一个对象位于字符串常量池

     1 class Demo17 {
     2     public static void main(String[] args) {
     3         String str1 = "hello";
     4         String str2 = "hello";
     5         String str3 = new String("hello");
     6         String str4 = new String("hello");
     7         String str5 = new String("hello");
     8         System.out.println("str1==str2? "+(str1==str2)+" ++++++");//true
     9         System.out.println("str2==str3? "+(str2==str3)+" ------");//false
    10         System.out.println("str3==str4? "+(str3==str4)+" ======");//false
    11         System.out.println("str3.equals(str4)? "+(str3.equals(str4))+" ******");//true
    12         System.out.println("str3.equals(str5)? "+(str3.equals(str5))+" ######");//true
    13         System.out.println("str1.equals(str3)? "+(str1.equals(str3))+" &&&&&&");//true
    14         System.out.println("str2.equals(str3)? "+(str2.equals(str3))+" >>>>>>");//true
    15     }
    16 }

    结果图:

    解析:

        1、String str = "hello";这种方式创建字符串时,jvm首先会检查字符串常量池中是否存在该字符串对象;

         如果存在,那么就不会在字符串常量池中创建了,直接返回字符串常量池的地址;

         如果不存在,那么就会在字符串常量池中先创建该字符串对象,并返回该字符串的地址。

    注意:如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;  比如:String str = 8;和 String str1 = 8;问:(str1==str2)?   str和str1比较的是他们的值,而不是地址。

        2、String str = new String("hello");这种方式创建字符串对象时,jvm还是首先去检查字符串常量池中是否存在该字符串对象;

         如果存在,就不会在字符串常量池中创建了,会在堆内存中创建,并且返回字符串常量池的地址(而不是堆内存的地址)。

             如果不存在,那么就先在字符串常量池中创建该字符串对象,然后再到堆内存中创建一份该字符串对象,并把字符串常量池中的该字符串内容拷贝到堆内存中,然后再返回堆内存中该字符串对象的地址。

     1 class Demo18 {
     2     public static void main(String[] args) {
    3 String str1 = "hello";
     4      String str2 = "hello";
    5 String str3 = new String("hello"); 6 String str4 = new String("hello"); 7 String str5 = new String("hello"); 8 9 System.out.println("str3哈希码:"+str3.hashCode()); 10 System.out.println("str4哈希码:"+str4.hashCode()); 11 System.out.println("str5哈希码:"+str5.hashCode()); 12 System.out.println("str3对象:"+str3.toString()+" ======"); 13 System.out.println("str4对象:"+str4.toString()+" ======"); 14 System.out.println("str5对象:"+str5.toString()+" ======"); 15 } 16 }

    结果图:

    结论:

    1)对于==:
        如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
        如果作用于引用类型的变量,则比较的是所指向的对象的地址

    2)对于equals方法:
        注意:equals方法不能作用于基本数据类型的变量
        如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
        诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

    equals” 和 “==”的解析

    1.1、字符串截取函数

    格式:

    1.2、大小写转换函数

    格式:

    举例:

     1 package com.dhb.code;
     2 
     3 //题目:Mrhaibin,使用截取函数或大写、小写转换函数任意修改
     4 public class Demo2 {
     5     public static void main(String[] args) {
     6         String str = "Mrhaibin";
     7         
     8         String str1 = str.toUpperCase();
     9         System.out.println(str1);//运行结果:MRHAIBIN  说明:把所有字母转换成大写字母
    10         String str2 = str.toLowerCase();
    11         System.out.println(str2);//返回结果:mrhaibin  说明:把所有字母转换成小写字母
    12         
    13         String str3 = str.substring(1);
    14         System.out.println(str3);//运行结果:rhaibin  说明:从数组下标1(包含1)开始截取,即第二位"r"开始截取后面所有
    15         String str4 = str.substring(2);
    16         System.out.println(str4);//运行结果:haibin  说明:从数组下标2(包含2)开始截取,即第三位"h"开始截取后面所有
    17         String str5 = str.substring(3);
    18         System.out.println(str5);//运行结果:aibin  说明:从数组下标3(包含3)开始截取,即第四位"a"开始截取后面所有
    19         
    20         String str6 = str.substring(1,2);
    21         System.out.println(str6);//运行结果:r  说明:从数组下标1(包含1)开始截取,截取(endIndex-beginIndex)个字符,即:2-1=1,截取一个字符
    22         String str7 = str.substring(1,4);
    23         System.out.println(str7);//运行结果:rha  说明:从数组下标1(包含1)开始截取,截取(endIndex-beginIndex)个字符,即:4-1=3,截取三个字符
    24         String str8 = str.substring(2,4);
    25         System.out.println(str8);//运行结果:ha  说明:从数组下标2(包含2)开始截取,截取(endIndex-beginIndex)个字符,即:4-2=2,截取两个字符
    26         String str9 = str.substring(2,6);
    27         System.out.println(str9);//运行结果:haib  说明:从数组下标2(包含2)开始截取,截取(endIndex-beginIndex)个字符,即:6-2=4,截取四个字符
    28         
    29         //          截取第一位,并且变为小写字母        截取第二位及后面所有字母
    30         String s = str.substring(0,1).toLowerCase()+str.substring(1);
    31         System.out.println(s);//运行结果:mrhaibin
    32         //           截取第一位,并且转换成大写字母         截取第二位         截取第三位,并且转换成大写字母      截取第四位及后面所有字母,并且全转换成小写字母  
    33         String s1 = str.substring(0,1).toUpperCase()+str.substring(1,2)+str.substring(2,3).toUpperCase()+str.substring(3).toLowerCase();
    34         System.out.println(s1);//运行结果:MrHaibin
    35     }
    36 }
     1 //题目:获取G盘下(G:Java教程day22视频Demo1.java)的文件名:Demo1.java
     2 package com.dhb.code;
     3 
     4 public class Demo1 {
     5     public static void main(String[] args) {
     6         // 由于是转义字符,所以写的时候不能直接这么写 G:Java教程day22视频Demo1.java,会报错;真确写法:"
     7         getFile("G:"Java教程"day22"视频"Demo1.java");
     8     }
     9     private static void getFile(String file) {
    10         int index = file.lastIndexOf(""");//lastIndexOf(int ch, int fromIndex):返回指定字符的最后一次出现的字符串中的索引值   
    11         String str = file.substring(index+1);
    12         System.out.println("文件名为:"+str);
    13     }
    14 }
    15 
    16 
    17 //文件名为:/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() :把字符串转换成字节数组

     1 package com.dhb.code;
     2 
     3 public class Demo4 {
     4     public static void main(String[] args) {
     5         //判断方法
     6         String str="Demo.java";
     7         //判断该字符串是否以指定的后缀结束
     8         System.out.println(str.endsWith("ja"));//运行结果:false
     9         System.out.println(str.endsWith("va"));//运行结果:true
    10         System.out.println(str.endsWith("java"));//运行结果:true
    11         
    12         System.out.println("判断该字符串是否为空:"+str.isEmpty());//运行结果:false
    13         
    14         //判断该字符串是否包含指定的字符串序列
    15         System.out.println(str.contains("mo"));//运行结果:true
    16         System.out.println(str.contains("dm"));//运行结果:false
    17         System.out.println(str.contains("jv"));//运行结果:false
    18         System.out.println(str.contains("ja"));//运行结果:true
    19         System.out.println(str.contains("va"));//运行结果:true
    20         System.out.println(str.contains("java"));//运行结果:true
    21         
    22         //判断是否相等
    23         System.out.println(str.equals("De"));//运行结果:false
    24         System.out.println(str.equals("Demo"));//运行结果:false
    25         System.out.println(str.equals("Demo.java"));//运行结果:true
    26         
    27         //将一个字符串与另一个字符串相比较,忽略大小写,判断是否相等。
    28         System.out.println(str.equalsIgnoreCase("dEMo.JAvA"));//运行结果:true
    29         System.out.println(str.equalsIgnoreCase("demo.java"));//运行结果:true
    30         System.out.println(str.equalsIgnoreCase("DEMO.JAVA"));//运行结果:true
    31         System.out.println(str.equalsIgnoreCase("Mo.JavA"));//运行结果:false
    32         
    33         //转换方法
    34         String str2="Demo4.java";
    35         char[] arr = str2.toCharArray();
    36         System.out.println(arr[2]);//运行结果:m  arr[2]:第三位字符 "m"; 把字符串转化为字符数组
    37         
    38         byte[] arr2 = str2.getBytes();
    39         System.out.println(arr2[7]);//运行结果:97   arr2[7]:第八位字符 "a", ASCII码表;把字符串转换成字节数组
    40     }
    41 }

    附:ascii码表

    1.4、其他 方法

        replace(char oldChar, char newChar) :替换指定字符串
        split(String regex) :切割(根据指定字符进行切割)
        trim() :去除前后空白

     1 package com.dhb.code;
     2 
     3 import java.util.Arrays;
     4 /*其他:
     5  * replace(char oldChar, char newChar) :替换指定字符串
     6  * split(String regex) :切割
     7  * trim() :去除前后空白
     8  * */
     9 public class Demo5 {
    10     public static void main(String[] args) {
    11         String str = "明天开始要放假";
    12         System.out.println(str.replace("","")); //运行结果:明天开始不放假     replace( , )函数:替换指定字符串
    13         
    14         String str1 = "2018-04-28";
    15         String[] arr = str1.split("-");
    16         System.out.println(Arrays.toString(arr)); //运行结果:[2018, 04, 28]     即:把2018-04-28切割出来,得到2018  04  28
    17         
    18         String str2 = "    大家    上午好!        ";
    19         System.out.println(str2.trim()); //运行结果:大家    上午好!    作用:前面和后面的空格全部去掉,但中间的不能删除掉
    20         System.out.println(str2.replace(" ",""));//运行结果:大家上午好!    去除(替换)掉所有的空格。包括前后和中间左右的空格
    21         System.out.println(str2.replaceAll(" +",""));//同上
    22     }
    23 }

      除去所有空格的其他方法

    二、Object类

        Object类是所有类的终极父类,任何一个类都继承Object类的

    java是面向对象的语言,核心思想:找适合的对象做适合的事情
            方式一:自定义类,通过自定义类来创建对象.
            方式二:sun公司提供了很多类给我使用,我们只需要认识这些类,我们就可以通过这些类创建对象.

    toString:返回该对象的字符串表示。返回字符串用于描述该对象
         疑问:toString有何作用?   答:重写toString子后,我们就可以直接输出一个新对象.


         equals(Object obj) 用于比较两个对象的内存地址,判断两个对象是否为同一个对象. 
         hashCode():  返回该对象的哈希码值。

    2、查看源码的方式

        方式一:按住 ctrl键,单击需要看的源码
        方式二:把光标移到你需要查看代码处F3

    看源代码最忌讳的一点:不要每行代码都弄懂是什么意思,能看懂大概,猜出意思足以.

     1 public class Person{
     2     
     3     int id;
     4     String name;
     5     
     6     public Person(int id,String name) {
     7         this.id=id;
     8         this.name=name;
     9     }
    10     //目前我们需要直接输出一个对象的时候,输出的格式:编号:110   姓名:狗娃 这个格式.目前Object
    11     //toString方法无法满足子类的需求,那么这时候就应该从写object类的toString进行从写.
    12     @Override
    13     public String toString() {
    14         return "编号:"+this.id+"姓名+"+this.name;
    15     }
    16     //为啥要从写呢:object的equals方法默认比较的是两个对象的内存地址,我们目前需要比较的是两个对象的身份证,所有object类的equals方法不符合我们现在的需求
    17     @Override
    18     public boolean equals(Object obj) {
    19         Person p=(Person)obj;
    20         return this.id==p.id;
    21     }
    22     public Person() {
    23         
    24     }
    25     public static void main(String[] args) {
    26         Person p=new Person(110,"狗娃");
    27         Person p1=new Person(110,"二狗子");
    28         System.out.println(p.hashCode()); //运行结果是一串数字、字母之类的字符串
    29         System.out.println(p);//输出结果:编号:110 姓名:狗娃;因为上面重写了toString()方法;   如果不重写toString()方法,输出p.toString(),结果为:com.bw.objects.Person@7ea06d25  完整类名+@+对象的地址(哈希码)     
    30         
    31     }
    32 }

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:http://www.cnblogs.com/dshore123/p/8947289.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    找不到vc_runtimeMinimum_x86.msi!
    ubuntu开启coredump
    log4j2项目打成jar包运行日志无法打印
    linux 下使用 tc 模拟网络延迟和丢包
    Spring MVC
    typora实现图片上传
    java异常和调优
    java线程
    java三大特征
    webstorm如何更换主题以及更换主题后字体缩放问题
  • 原文地址:https://www.cnblogs.com/dshore123/p/8947289.html
Copyright © 2011-2022 走看看