C/C++教程

API之Object、String

本文主要是介绍API之Object、String,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

常用类(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:线程不安全,效率高

这篇关于API之Object、String的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!