ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

API之Object、String

2022-08-08 00:05:06  阅读:147  来源: 互联网

标签:返回 obj String int Object 对象 API 字符串


常用类(API)

  • api:Application Program Interface,应用程序编程接口,可看做使用说明书

  • JavaAPI:指的是JDK中提供的各种功能的java类

  • 第一步:查看类的描述信息(类的关系体系+所在包、特征、特性、常用方法、特殊说明、操作实例)

  • 第二步:在程序当中引入该类,查看(类的属性、构造方法、静态方法、抽象方法、成员方法、弃用方法);

  • 第三步:使用具体的某个属性和某个API方法;

  • 第四步:程序测试功能;

 

Object类

(查看源码,ctrl+鼠标左键或者光标置于方法名,ctrl+b等)

  • 所有类的直接或间接父类,位于继承树的最顶层;

  • 任何类,如没有写extends显示继承某个类,都默认直接继承Object类,否则为间接继承;

  • Object类中定义的方法,是所有对象都具备的方法;

  • Object类型可以存储任何对象:

    • 作为参数,可接受任何对象;

    • 作为返回值,可返回任何对象;


equals()方法

public boolean equals (Object  obj){}

object方法中的equals方法默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等;

  • ==与equals的对比:

    ==是一个比较运算符,既可以判断基本类型,比较值是否相等;又可以判断引用类型:比较地址,即比较是不是同一个对象;

    equals只能判断引用类型,比较地址,等同于“==”判断引用类型;

  • String类重写equals方法过程:this.equals(obj);(this为String类型的字符串)判断内容是否相等

  1. 比较两个引用是否指向同一个对象;是,返回true;

  2. 判断obj是否String类或者String的子类;不是,返回false;

  3. obj转换为String类型,比较this.length == obj.length,相等进入下一步,不等,结束返回false;

  4. 将this和obj转换为两个字符数组,遍历两个字符数组,利用==对每个字符元素进行比较,任一不同,返回false;全部相等,返回true;

  • Integer重写equals方法:this.equals(obj);(this为Integer类型)判断值是否相等

  1. 判断obj是否Integer类或者Integer的子类;不是,返回false;

  2. 判断this == ((Integer)obj).intValue();相等返回true;不等返回false;


hashCode()方法

public int hashCode(){}

返回该对象的哈希码值;

  1. 提高具有哈希结构容器的效率;

  2. 两个引用,如果指向同一个对象,则哈希值相同;

  3. 两个引用,如果指向不同对象,则哈希值不一样;

  4. 哈希值主要根据地址号来的,不能完全将哈希值等价于地址;(根据对象的地址或字符串或数字使用hash算法计算出来的int类型的数值;)

  5. 在集合中hashCode如果需要的话,也会重写;


toString()方法

public String toString(){}

默认返回:全类名+@+哈希值的十六进制;字符串类型;(分析源码)

子类往往重写toString方法,一般返回对象的属性信息,也可以自行修改重写的方法;

当直接输出一个对象时,toString方法会被默认调用;sout(a);默认输出a.toString

getClass()方法

返回引用中存储的实际对象类型,返回值是Class;

应用:通常用于判断两个引用中实际存储对象类型是否一致;

Class c1 = 对象1名.getClass();
Class c2 = 对象2名.getClass();
c1 == c2 ;

与instanceof区别:

getClass判断两个引用中实际存储对象类型是否一致;

x instanceof y;判断x是否为y类或y子类的实例对象;


clone()方法

创建并返回此对象的副本;克隆的对象和原对象的内存地址完全独立;

此对象的类必须实现接口Cloneable,否则抛出CloneNotSupportedException

  • 深度克隆与浅克隆

深克隆:

浅克隆:

Java原型模式(prototype)波波烤鸭的博客-CSDN博客java原型


finalize()方法

当垃圾收集确定不再有对该对象的引用时,对象被判定为垃圾对象,由JVM自动调用该对象的finalize方法,进入回收队列;

程序员可以重写该对象的finalize方法,写自己的业务逻辑代码;不重写就默认调用object类的finalize;

垃圾对象:没有有效引用指向此对象时,为垃圾对象;

垃圾回收:由GC销毁垃圾对象,释放数据存储空间;

自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象;由系统(即有自己的GC算法)决定什么时候回收

手动回收机制:使用System.gc();主动触发垃圾回收机制;

-实际开发几乎不会运用finalize

面试题:介绍一下final 、 finally 和 finalize三者的区别

final:最终的,不能被修改

finally:

finalize:垃圾回收方法

objects工具类

在JDK7版本,java引入了java.util.objects工具类,用于封装一些平时使用拼读很高或者容易出错的操作;

  1. Objects()构造方法

    private Objects() { 
    throw new AssertionError("No java.util.Objects instances for you!");
    }

    该方法为私有方法,其实现为抛出一个异常;目的是为了避免对象的构造,即使通过反射机制也做不到!

  2. equals()

    有别于object.equals(),这个方法可以避免空指针异常。

    public static boolean equals(Object a, Object b) {
       return (a == b) || (a != null && a.equals(b));
    }
  3. deepEquals()

    object.equals()用于比较两个对象的引用是否相同,而deepEquals()扩展成了可以支持数组。

    public static boolean deepEquals(Object a, Object b) {
       if (a == b) return true;
       else if (a == null || b == null) return false;
       else return Arrays.deepEquals0(a, b);
    }
  4. hashCode(Object o)

    object.hashCode(),只是对象为null时,返回的哈希值为0;

    public static int hashCode(Object o) { 
       return o != null ? o.hashCode() : 0; }
  5. hash()

    生成对象的哈希值,包括数组;

    public static int hash(Object... values) { 
       return Arrays.hashCode(values);
    }
  6. toString()

    额外多了空指针判断

    public static String toString(Object o) { 
       return String.valueOf(o);
    }
    public static String toString(Object o, String nullDefault) {
       return (o != null) ? o.toString() : nullDefault;
    }
  7. compare()

    用于比较两个对象

    public static <T> int compare(T a, T b, Comparator<? super T> c) {
       return (a == b) ? 0 : c.compare(a, b);
    }
  8. requireNonNull()

    在对象为空指针时,抛出特定message的空指针异常。

    public static <T> T requireNonNull(T obj) { 
       if (obj == null)
           throw new NullPointerException();
       return obj;
    }
    public static <T> T requireNonNull(T obj, String message) {
       if (obj == null)
           throw new NullPointerException(message);
       return obj;
    }
    public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
       if (obj == null)
           throw new NullPointerException(messageSupplier.get());
       return obj;
    }
  9. isNull()和nonNull()

    这两个方法用于判断对象为null和对象不为null。通常情况下,我们不会之间使用者两个方法,而是使用比较操作符==和!=。这两个方法主要用在jdk8开始支持的流计算里面。

    public static boolean isNull(Object obj) { 
       return obj == null;
    }
    public static boolean nonNull(Object obj) {
       return obj != null;
    }

     

String类

String类型

public final class String String类型有final修饰,不允许再有子类

String类代表字符串,Java程序中的所有字符串字面值都被实现为此类的实例;

  • 字符串是常量,它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为String对象是不可变的,所以可以共享;

  • String类型特点:
    1. 如果发现在方法区中没有对应字符串,会自动开辟空间存储新的字符串

    2. 字符串一旦创建,不能被修改;

    3. 字符串虽然不能被修改,但可以共享;

    4. 如果字符串频繁拼接,都会在方法区开辟空间,内存空间消耗极大,所以频繁拼接字符串不建议使用String类,改用StringBuffer或者StringBuilder

main{
   String name = "张三" ;
   name += "666" ;
   sout("name:"+name) ;
}

main{
   String name = "张三" ;
   name += "666" ;
   sout("name:"+name) ;
   String name2 = "张三" ;
}

 

String构造方法(构造器)

String类型是引用类型,必然对应构造方法,String类型有相当多

String name2 = new String();//空字符
String name3 = new String("san");//字符串构造方法
char [] c1 = {'s','a','n'};
String name4 = new String(c1);//字符串数组构造方法
byte [] b1 = "san".getBytetes();
//使用平台的默认字符集将字符串编码为byte序列,并存储到一个新的byte数组中
String name5 = new String(b1);//字符串数组构造
String name6 = new String(c1,1,2);//从c1数组中的第一个元素开始取两个;数组元素下标从0开始;注意取元素个数避免下标越界;name = am;

  • 通过构造器获取的String类型和通过字符串字面值获取的String类型的区别:

main{
   String name1 = new String("zhang");
   String name2 = "zhang" ;
   sout(name1 == name2);//false
   sout(name1.equals(name2));//true
}

 

String类常用方法

  • 常用的基础操作方法

char charAt(int index);//返回指定索引处的char值

int length();//返回此字符串的长度

  • 返回索引值,(字符、字符串不存在返回-1)

  • 正向索引

int .intdexof(int ch);//返回ch字符在此字符串中第一次出现处的索引

int .intdexof(String str);//返回str字符串第一次出现在字符串内的索引

int .intdexof(int ch , int fromIndex);//返回指定字符(ch)第一次出现的字符串内的索引,从指定的索引(fromIndex)开始搜索

int intdexof(String str , int fromIndex);//返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。

  • 返向索引

int lastdexof(int ch);//返回指定字符在此字符串中最后一次出现的索引

int lastdexof(String str);//返回指定子串在字符串中最后一次出现的索引

int lastIndexof(int ch , int fromIndex);//返回指定字符的最后一次出现的字符串中的索引,从指定的索引开始向搜索。

int lastIndexof(String str , int fromIndex);//返回指定子字符串的最后一次出现的字符串中的索引,从指定索引开始后搜索。

  • 返回字符串

String substring(int beginIndex);//返回一个子字符串,从beginIndex处开始截取

String substring(int beginIndex, int endIndex);//返回一个子字符串,从beginIndex处开始截取到endIndex;注意:不包括第endIndex个

String toLowerCase();//将此String的所有字符都转换为小写;

String toUpperCase();//将此String的所有字符都转换为大写;

String concat();将指定字符串连接到此字符串的结尾;同str+"";

static String valueOf(char[] chs);返回char数组参数的字符串表示形式;

static String valueOf(int i);返回i参数的字符串标识形式;

byte[] getBytes();将字符串转化为字节数组;

char[] toCharArray();将字符串转化为字符数组;


面试题:length、length()、size()的区别:

  1. length:是数组的属性;

  2. length():是字符串或其他类的一个方法;

  3. size():是集合或者其他类的一个长度;


  • 返回值为boolean

boolea isEmpty();//当且仅当str.length()为0时,返回true;str.length()不为0,返回false;str为null,报错空指针;

boolea equals();//将此字符串与指定对象进行比较内容相同返回true。不同返回false;null也可进行比较;

boolea equalsIgnoreCase();作用同equals();忽略大小写比较;null也可进行比较;

boolea contains();此字符串包含指定的字符串,返回true;否则返回false;其一为空,报错空指针;

boolea startsWith();测试此字符串是否以指定的前缀开头;

boolea endWith();测试此字符串是否以指定的后缀结尾;


  • 其他方法

String replace(char old , char new);字符替换;

String replaceString old , String new);字符串替换;

String trim();返回一个字符串,删除此字符串的任何前导和尾随空格;

int compareTo(str1 str2);按字典顺序比较两个字符串,返回的值为str1-str2第一个不同字符的Unicode差值

int compareToIgnoreCase(str1 str2);按字典顺序比较两个字符串,忽略大小写,返回的值为str1-str2第一个不同字符的Unicode差值

String [] split(str);将此字符串以str为界限分割,str消除,返回String类型数组;

String [] split(str , int);将此字符串以str为界限分割为int部分,str消除,返回String类型数组;

StringBuffer和StringBuilder

String在频繁拼接字符串时,会不断开辟空间,造成内存浪费,这种情况下使用StringBuffer和StringBuilder来解决问题


  • StringBuffer

线程安全的可变序列,一个类似于String的字符串缓冲区,但不能修改;是一个容器,在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。

  1. 构造方法

  • StringBuffer sb = new StringBuffer();创建一个默认容量为16的空字符数组;

  • StringBuffer sb = new StringBuffer(char);创建一个容量为char的unicode值的空字符数组;

  • StringBuffer sb = new StringBuffer(str);创建一个字符串长度+16的字符数组,含有str字符串;

  • StringBuffer sb = new StringBuffer(int);创建一个长度为int的空字符数组;

  1. StringBuffer方法

  • sb.appe(a);将a附加到sb字符序列尾部;

  • sb.inser(int , a);在sb字符序列的int处插入a;

  • sb.verse();返回sb字符序列倒序的一个字符序列

  • sb.delete(int);删除sb字符序列中的下标int元素;

  • sb.delete(1, 4);删除sb字符序列的下标1-9的元素(不包括9);

  • sb.replac(2,5,str);将sb字符序列中的下标2-5(不包括5)元素替换为str字符串;

  • sb.substring(3);截取sb序列下标3至结尾的元素,返回为一个新字符串

  • sb.substring(3,8);截取sb序列下标3-8(不包括5)元素,返回为一个新字符串


  • StringBuilder

一个可变的字符序列,此api同StringBuffer,但不保证同步(线程不安全);该类被用作简易替换StringBuffer在使用由单个线程字符串缓冲区的地方;即:效率更高,但不安全;


面试题:String、StringBuffer、StringBuilder的区别

String:线程不安全,一旦在方法全创建就不会被更改,可以给多个引用共享,但频繁拼接时,浪费资源,效率低

StringBuffer、StringBuilder可以改变字符串的长度和内容,是一个字符串缓冲区,频繁拼接时不会开辟新空间

StringBuffer:线程安全,效率较低

StringBuilder:线程不安全,效率高

标签:返回,obj,String,int,Object,对象,API,字符串
来源: https://www.cnblogs.com/xuduoduo92/p/16560264.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有