一、Object类
- 基本特性
Object类位于java.lang包中,是Java所有类的根类。这意味着每个类要么直接继承Object类,要么间接继承它。- 由于它是所有类的父类,
Object类型的引用可以存储任何类型的对象,这是多态的一种体现。例如,我们可以创建一个Object类型的数组,然后在其中存储不同类型的对象。 - 因为
Object类中的方法具有一定的通用性,所以在访问权限允许的情况下,所有类都可以使用这些方法。
- 常用方法
getClass()方法:- 该方法返回引用中实际存储的对象类型。在运行时,它可以帮助我们确定对象的具体类型,这在处理多态场景或者在需要对对象类型进行动态检查的情况下非常有用。
hashCode()方法:- 此方法返回对象的哈希码值。不同的对象通常会返回不同的哈希码值,但需要注意的是,这并不是绝对的。在一些特殊情况下,例如两个不同的对象可能会有相同的哈希码值。在自定义类中,如果重写了
equals()方法,通常也需要重写hashCode()方法,以确保相等的对象具有相同的哈希码值。
- 此方法返回对象的哈希码值。不同的对象通常会返回不同的哈希码值,但需要注意的是,这并不是绝对的。在一些特殊情况下,例如两个不同的对象可能会有相同的哈希码值。在自定义类中,如果重写了
equals(Object obj)方法:- 这个方法用于判断两个对象的内容是否相等。默认情况下,它比较的是对象的引用(即内存地址)。在自定义类中,如果想要根据对象的属性值来判断相等性,就需要重写
equals()方法。例如,对于表示人的Person类,可能需要根据姓名和年龄等属性来判断两个Person对象是否相等,而不是简单地比较引用。
- 这个方法用于判断两个对象的内容是否相等。默认情况下,它比较的是对象的引用(即内存地址)。在自定义类中,如果想要根据对象的属性值来判断相等性,就需要重写
toString()方法:- 该方法返回对象的字符串形式。在实际开发中,当我们想要将对象以一种易于阅读的方式表示时,通常会重写
toString()方法。例如,对于一个表示点坐标的Point类,重写toString()方法可以返回形如(x,y)的字符串,其中x和y是点的坐标值。
- 该方法返回对象的字符串形式。在实际开发中,当我们想要将对象以一种易于阅读的方式表示时,通常会重写
二、包装类
- 概念与类型
- 包装类是基本数据类型对应的类,它们都位于
java.lang包中。每个基本数据类型都有一个对应的包装类,如byte对应Byte,short对应Short,int对应Integer,long对应Long,float对应Float,double对应Double,char对应Character,boolean对应Boolean。
- 包装类是基本数据类型对应的类,它们都位于
- 数据类型转换
- 基本数据类型到包装类型:
- 可以使用构造函数或者
valueOf()方法将基本数据类型转换为包装类型。例如,将int转换为Integer,可以使用new Integer(a)或者Integer.valueOf(a)。需要注意的是,Integer.valueOf()方法在i >= - 128 && i <= 127的范围内会返回缓存中的对象,而不是新创建一个对象。
- 可以使用构造函数或者
- 包装类型到基本数据类型:
- 通过包装类的
xxxValue()方法可以将包装类型转换回基本数据类型。例如,Integer类的intValue()方法可以将Integer对象转换为int类型。
- 通过包装类的
- 基本数据类型与字符串之间的转换:
- 基本数据类型到字符串:可以直接将基本数据类型与空字符串相加来转换为字符串,如
int a2 = 89; String str1=a2+""。但需要注意这种方式与进行数学运算时的区别,例如a2 + 1会进行数学加法得到90,而str1+1会将1作为字符串连接到str1后面得到891。 - 字符串到基本数据类型:使用
parseXXX()方法将字符串转换为基本数据类型,如Integer.parseInt("87")可以将字符串"87"转换为int类型。但是,如果字符串中包含非数字内容(如Integer.parseInt("87a")),则会抛出java.lang.NumberFormatException异常。
- 基本数据类型到字符串:可以直接将基本数据类型与空字符串相加来转换为字符串,如
- 基本数据类型到包装类型:
- 自动装箱和自动拆箱
- 在Java中,基本数据类型和包装类型之间可以直接相互转换,这就是自动装箱和自动拆箱的功能。例如,可以直接将
int类型的值赋给Integer类型的变量(自动装箱),也可以直接将Integer类型的对象赋给int类型的变量(自动拆箱)。
- 在Java中,基本数据类型和包装类型之间可以直接相互转换,这就是自动装箱和自动拆箱的功能。例如,可以直接将
- 包装类的优势
- 包装类可以区分有效数据和无效数据,例如
0和null。这在一些场景下,如在表示可能为空的数值或者在数据处理中需要区分有效和无效的数值情况时非常有用。
- 包装类可以区分有效数据和无效数据,例如
三、String类
- 字符串创建方式
- 直接赋值:如
String str1 = "hello";这种方式在串池中创建字符串对象。如果串池中已经存在相同的字符串对象,就不会再创建新的对象,而是直接使用已存在的对象。 - 使用
new关键字:如String str2 = new String("world");这种方式首先在堆空间中创建一个字符串对象,然后查看字符串串池中是否存在该对象,如果存在则无需再次创建,不存在则再次创建。字符串是由一个或多个字符组成的,用双引号引起来,底层是通过字符数组char[] value进行存储的,字符具有下标,默认从0开始。
- 直接赋值:如
- 常用方法
- 根据下标获取字符:
- 使用
charAt()方法可以根据指定的下标获取字符串中的字符。需要注意指定的下标范围要合理,否则会抛出java.lang.StringIndexOutOfBoundsException异常。
- 使用
- 获取字符串长度:
- 通过
length()方法可以获取字符串的长度。
- 通过
- 遍历字符串:
- 可以使用循环结合
charAt()方法来遍历字符串,例如for(int i = 0; i < str.length(); i++){System.out.println(str.charAt(i));}。
- 可以使用循环结合
- 查找字符或字符串:
indexOf()方法可以获取指定字符或字符串在当前字符串中出现的第一个字符的下标,如果不存在则返回 - 1。contains()方法可以判断指定字符串是否在当前字符串中存在。
- 大小写转换:
- 使用
toLowerCase()方法可以将字符串中的大写字母转换为小写字母,toUpperCase()方法则可以将小写字母转换为大写字母。
- 使用
- 判断开头和结尾:
startsWith()方法用于判断字符串是否以指定的字符串开头,endsWith()方法用于判断是否以指定的字符串结尾。
- 去除前后空格:
- 对于包含前后空格的字符串,可以使用
trim()方法去除前后空格。
- 对于包含前后空格的字符串,可以使用
- 字符串比较:
- 使用
==比较的是字符串对象的引用,而equals()方法用于判断字符串内容是否相等。equalsIgnoreCase()方法在判断字符串内容是否相等时会忽略大小写。
- 使用
- 字符串分割:
- 使用
split()方法可以根据指定的分隔符将字符串分割成字符串数组。
- 使用
- 字符统计:
- 可以通过循环遍历字符串,结合字符的范围判断(如
if(c >='A' && c<='Z'))来统计字符串中特定字符(如大写字母)的个数。
- 可以通过循环遍历字符串,结合字符的范围判断(如
- 根据下标获取字符:
- 不可变性
- String字符串是常量,一旦创建就不可改变。字符串字面值存储在串池中,可以被共享。这一特性使得字符串在多线程环境下使用时具有一定的安全性,但在需要频繁修改字符串内容的情况下可能会影响性能。
- 可变长的字符串
StringBuffer:- 这是可变长的字符串类,在JDK1.0就存在,它是线程安全的,但由于加了锁等机制,运行效率相对较慢。
StringBuilder:- 也是可变长的字符串类,在JDK5.0引入,它是线程不安全的,但运行效率快。在单线程环境下,如果需要频繁修改字符串内容,使用
StringBuilder会比String和StringBuffer具有更好的性能。
- 也是可变长的字符串类,在JDK5.0引入,它是线程不安全的,但运行效率快。在单线程环境下,如果需要频繁修改字符串内容,使用
2169






