Java 常用类库及String类详解

Java常用类库不要求有很多思想上的东西,要求对其有很熟练的使用能力。常用类库就好比在生活中手艺人手中的工具,作为一个Java程序员我们也必须熟练掌握这些工具。


一、java.util.Objects

JDK7版本添加的一个工具类。Objects此类包含static实用程序方法,用于操作对象或在操作前检查某些条件。 这些实用程序包括nullnull方法,用于计算对象的哈希代码,返回对象的字符串,比较两个对象,以及检查索引或子范围值是否超出范围。

常用的方法:

变量和类型方法描述
static intcheckIndex​(int index, int length)检查 index是否在 0 (含)到 length (不包括)范围内。
static <T> intcompare​(T a, T b, Comparator<? super T> c)如果参数相同则返回0,否则返回 c.compare(a, b) 。
static booleanequals​(Object a, Object b)返回 true如果参数相等,彼此 false其他。
static inthash​(Object… values)为一系列输入值生成哈希码。
static inthashCode​(Object o)返回非的哈希码 null参数,0为 null的论点。
static booleanisNull​(Object obj)返回 true如果提供的参考是 null ,否则返回 false 。
static booleannonNull​(Object obj)返回 true如果提供的参考是非 null否则返回 false 。
static <T> TrequireNonNull​(T obj)检查指定的对象引用是否不是 null 。
static <T> TrequireNonNull​(T obj, String message)检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。
static StringtoString​(Object o)返回调用的结果 toString对于非 null参数, "null"为 null的说法。
static StringtoString​(Object o, String nullDefault)如果第一个参数不是 null ,则返回在第一个参数上调用 toString的结果,否则返回第二个参数。
/**
 * Objects工具类
 */
public class Demo1Objects {
    public static void main(String[] args) {
        Person p1 = null;
        Person p2 = new Person();
        // 发生空指针异常,null不能调用方法
        //Syem.out.println(p1.equals(p2));
        // 使用Objects工具类不会发生异常
        System.out.println(Objects.equals(p1, p2));

        // 判断参数是否是空,为空返回true
        System.out.println(Objects.isNull(p1));

        // 判断参数是否是空,为空则返回空指针异常类
        System.out.println(Objects.requireNonNull(p1));
    }
}

运行结果:

false
true
Exception in thread "main" java.lang.NullPointerException
	at java.base/java.util.Objects.requireNonNull(Objects.java:221)
	at Demo1Objects.main(Demo1Objects.java:19)

二、java.lang.Math

类Math包含用于执行基本数字运算的方法,例如基本指数,对数,平方根和三角函数。

常用的方法:

变量和类型方法描述
static doubleabs​(double a)返回 double值的绝对值。
static floatabs​(float a)返回 float值的绝对值。
static intabs​(int a)返回 int值的绝对值。
static longabs​(long a)返回 long值的绝对值。
static intaddExact​(int x, int y)返回其参数的总和,如果结果溢出 int则抛出异常。
static doubleceil​(double a)返回大于或等于参数且等于数学整数的最小值(最接近负无穷大) double 。
static doublefloor​(double a)返回小于或等于参数且等于数学整数的最大值(最接近正无穷大) double 。
static doublemax​(double a, double b)返回两个 double值中较大的 double 。
static floatmax​(float a, float b)返回两个 float值中较大的 float 。
static intmax​(int a, int b)返回两个 int值中较大的 int。
static longmax​(long a, long b)返回两个 long值中较大的 long 。
static doublemin​(double a, double b)返回两个 double值中较小的 double 。
static floatmin​(float a, float b)返回两个 float值中较小的 float 。
static intmin​(int a, int b)返回两个 int值中较小的 int。
static longmin​(long a, long b)返回两个 long 值中较小的 long。
static doublerandom()返回带有正号的 double值,大于或等于 0.0且小于 1.0 。
static longround​(double a)返回与参数最接近的 long ,并将关系四舍五入为正无穷大。
static intround​(float a)返回与参数最接近的 int ,并将关系四舍五入为正无穷大。
/**
 * Math
 */
public class Demo2Math {
    public static void main(String[] args) {
        // 求绝对值
        System.out.println("-100求绝对值:"+Math.abs(-100));
        // 求两数之间较小的值
        System.out.println("100,200求两数之间较小的值:"+Math.min(100,200));
        // 求两数之间较大的值
        System.out.println("100,200求两数之间较大的值:"+Math.max(100,200));
        // 四舍五入
        System.out.println("5.5四舍五入正数:"+Math.round(5.5));
        System.out.println("-5.5四舍五入负数:"+Math.round(-5.5));   // 四舍五入变成-5
        System.out.println("-5.51四舍五入负数:"+Math.round(-5.51));  // 四舍五入变成-6
        // 返回小于等于参数的最大整数(地板)
        System.out.println("3.5取地板正数:"+Math.floor(3.5));
        System.out.println("-3.5取地板负数:"+Math.floor(-3.5));
        // 返回大于等于参数的最小整数(天花板)
        System.out.println("3.5取天花板正数:"+Math.ceil(3.5));
        System.out.println("-3.5取天花板负数:"+Math.ceil(-3.5));

    }

运行结果:

	-100求绝对值:100
	100,200求两数之间较小的值:100
	100,200求两数之间较大的值:200
	5.5四舍五入正数:6
	-5.5四舍五入负数:-5
	-5.51四舍五入负数:-6
	3.5取地板正数:3.0
	-3.5取地板负数:-4.0
	3.5取天花板正数:4.0
	-3.5取天花板负数:-3.0

三、java.util.Arrays

该类包含用于操作数组的各种方法(例如排序和搜索)。 此类还包含一个静态工厂,允许将数组视为列表。
如果指定的数组引用为null,则此类中的方法都抛出NullPointerException ,除非另有说明。

常用的方法:

变量和类型方法描述
static <T> ListasList​(T… a)返回由指定数组支持的固定大小的列表。
static intbinarySearch​(Object[] a, Object key)使用二进制搜索算法在指定的数组中搜索指定的对象。
static intbinarySearch​(Object[] a, int fromIndex, int toIndex, Object key)使用二进制搜索算法搜索指定对象的指定数组范围。
static <T> intbinarySearch​(T[] a, T key, Comparator<? super T> c)使用二进制搜索算法在指定的数组中搜索指定的对象。
static <T> intbinarySearch​(T[] a, int fromIndex, int toIndex, T key, Comparator<? super T> c)使用二进制搜索算法搜索指定对象的指定数组范围。
static <T> T[]copyOf​(T[] original, int newLength)使用空值复制指定的数组,截断或填充(如有必要),以使副本具有指定的长度。
static <T,​U>T[]copyOf​(U[] original, int newLength, 类<? extends T[]> newType)使用空值复制指定的数组,截断或填充(如有必要),以使副本具有指定的长度。
static booleanequals​(int[] a, int[] a2)如果两个指定的int数组彼此 相等 ,则返回 true 。
static voidfill​(Object[] a, Object val)将指定的Object引用分配给指定的Objects数组的每个元素。
static inthashCode​(Object[] a)根据指定数组的内容返回哈希码。
static intmismatch​(Object[] a, Object[] b)查找并返回两个 Object数组之间第一个不匹配的索引,否则如果未找到不匹配则返回-1。
static intmismatch​(Object[] a, int aFromIndex, int aToIndex, Object[] b, int bFromIndex, int bToIndex)查找并返回指定范围内两个 Object数组之间第一个不匹配的相对索引,否则如果未找到不匹配则返回-1。
static voidsort​(Object[] a)根据元素的自然排序 ,将指定的对象数组按升序排序。
static voidsort​(Object[] a, int fromIndex, int toIndex)根据元素的自然排序 ,将指定对象数组的指定范围按升序排序。
static StringtoString​(Object[] a)返回指定数组内容的字符串表示形式。
/**
 * Arrays工具类
 */
public class Demo3Arrays {
    public static void main(String[] args) {
        int[] arr = {8,9,1,3,4,2,5,6,7};
        // 打印数组的内存地址
        System.out.println("数组的内存地址:"+arr);
        // 输出数组的内容 [1, 2, 3]
        System.out.println("排序前");
        System.out.println(Arrays.toString(arr));
        // 数组排序(正序,从小到大)
        Arrays.sort(arr);
        System.out.println("排序后");
        System.out.println(Arrays.toString(arr));
        // 二分查找指定参数的下标(没有返回-1)
        System.out.println("二分查找指定参数的下标4");
        System.out.println(Arrays.binarySearch(arr,4));
        // 数组扩容(输入数组,新的长度)
        System.out.println("原本的长度");
        System.out.println(arr.length); // 原本的长度
        arr = Arrays.copyOf(arr, 15);
        System.out.println("扩容后的长度");
        System.out.println(arr.length); // 扩容后的长度

    }
}

运行结果:

数组的内存地址:[I@6cd8737
排序前
[8, 9, 1, 3, 4, 2, 5, 6, 7]
排序后
[1, 2, 3, 4, 5, 6, 7, 8, 9]
二分查找指定参数的下标4
3
原本的长度
9
扩容后的长度
15

四、java.math.BigDecimal

BigDecimal类提供算术,比如操作,舍入,比较,散列和格式转换的操作。 该toString()方法提供的规范表示BigDecimal

常用构造方法:

构造器描述
BigDecimal​(String val)将 BigDecimal的字符串表示 BigDecimal转换为 BigDecimal 。
BigDecimal​(String val, MathContext mc)将 BigDecimal的字符串表示 BigDecimal转换为 BigDecimal ,接受与 BigDecimal(String)构造函数相同的字符串,并根据上下文设置进行舍入。
BigDecimal​(int val)将 int翻译成 BigDecimal 。
BigDecimal​(int val, MathContext mc)将 int转换为 BigDecimal ,并根据上下文设置进行舍入。

常用的方法:

变量和类型方法描述
BigDecimalabs()返回 BigDecimal其值是此的绝对值 BigDecimal ,其标为 this.scale() 。
BigDecimaladd​(BigDecimal augend)返回 BigDecimal其值为 (this + augend) ,其比例为 max(this.scale(), augend.scale()) 。
BigDecimaldivide​(BigDecimal divisor)返回BigDecimal其值为(this / divisor) ,其首选比例为(this.scale() - divisor.scale()) ; 如果无法表示准确的商(因为它具有非终止的十进制扩展),则抛出ArithmeticException 。
doubledoubleValue()将 BigDecimal转换为 double 。
intintValue()将 BigDecimal转换为 int。
longlongValue()将 BigDecimal转换为 long。
floatfloat()将 BigDecimal转换为 float。
BigDecimalmultiply​(BigDecimal multiplicand)返回 BigDecimal其值为 (this × multiplicand) ,其比例为 (this.scale() + multiplicand.scale()) 。
BigDecimalsubtract​(BigDecimal subtrahend)返回 BigDecimal其值为 (this - subtrahend) ,其比例为 max(this.scale(), subtrahend.scale()) 。
/**
 * BigDecimal
 */
public class Demo4BigDecimal {
    public static void main(String[] args) {
        // double类型和float类型运算会失去精度
        System.out.println(0.1+0.2);
        BigDecimal b1 = new BigDecimal("0.1"); // 传入的是String类型
        BigDecimal b2 = new BigDecimal("0.2");
        // b1,b2本身没有任何改变,等同于 b1+b2
        BigDecimal b3 = b1.add(b2); // 加法运算
        System.out.println(b1.subtract(b2)); // 减法运算
        System.out.println(b1.multiply(b2)); // 乘法运算
        System.out.println(b1.divide(b2));   // 除法运算

        double d = b3.doubleValue();   // 变成double类型
        int i = b3.intValue(); // 变成int类型


    }
}

运行结果:

0.30000000000000004
-0.1
0.02
0.5

五、java.util.Date

Date类表示特定的时刻,精度为毫秒。 (1秒=1000毫秒)

常用构造方法:

构造器描述
Date()分配 Date对象并对其进行初始化,使其表示分配时间,测量 Date到毫秒。
Date​(long date)分配 Date对象并初始化它以表示自标准基准时间(称为“纪元”)以来的指定毫秒数,即1970年1月1日00:00:00 GMT。

常用的方法:

变量和类型方法描述
booleanafter​(Date when)测试此日期是否在指定日期之后。
booleanbefore​(Date when)测试此日期是否在指定日期之前。
Objectclone()返回此对象的副本。
intcompareTo​(Date anotherDate)用于两个相同数据类型的比较,两个不同类型的数据不能用此方法来比较。
booleanequals​(Object obj)比较两个相等的日期。
static Datefrom​(Instant instant)从 Instant对象获得 Date的实例。
inthashCode()返回此对象的哈希码值。
longgetTime()返回自此 Date对象表示的1970年1月1日00:00:00 GMT以来的毫秒数。
voidsetTime​(long time)将此 Date对象设置为表示格林尼治标准时间1970年1月1日00:00:00之后的 time毫秒的时间点。
InstanttoInstant()将此 Date对象转换为 Instant 。
StringtoString()将此 Date对象转换为以下形式的 String 。
/**
 * Date类表示特定的时刻,精度为毫秒。
 */
public class Demo5Date {
    public static void main(String[] args) {
        // 创建一个当前时间的Date
        Date date = new Date();
        // 打印Date类的toString方法
        System.out.println("当前日期:"+date);
        // 计算当前日期减一天
        long time = date.getTime()-(24*60*60*1000);
        Date date2 = new Date(time);
        System.out.println("当前日期减一天:"+date2);

    }
}

运行结果:

当前日期:Sun Dec 27 15:00:47 CST 2020
当前日期减一天:Sat Dec 26 15:00:47 CST 2020

六、java.text.DateFormat

DateFormat是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化和分析日期或时间。 日期/时间格式化子类(例如SimpleDateFormat )允许格式化(即,日期→文本),解析(文本“日期”)和规范化。 日期表示为Date对象或自1970年1月1日00:00:00 GMT以来的毫秒数。

java.text.SimpleDateFormat

DateFormat是一个抽象类不能直接使用,想要使用需要使用它的子类SimpleDateFormat
SimpleDateFormat是一个用于以区域设置敏感的方式格式化和解析日期的具体类。 它允许格式化(日期→文本),解析(文本→日期)和规范化。

常用构造方法:

构造器描述
SimpleDateFormat()构造一个 SimpleDateFormat使用默认模式和日期格式符号默认 FORMAT区域设置。
SimpleDateFormat​(String pattern)构造一个 SimpleDateFormat使用给定的模式和默认的默认日期格式符号 FORMAT区域设置。
SimpleDateFormat​(String pattern, DateFormatSymbols formatSymbols)使用给定的模式和日期格式符号构造 SimpleDateFormat 。
SimpleDateFormat​(String pattern, Locale locale)使用给定模式和给定语言环境的默认日期格式符号构造 SimpleDateFormat 。

常用的方法:

变量和类型方法描述
booleanequals​(Object obj)比较给定对象与此 SimpleDateFormat是否相等。
StringBufferformat​(Date date, StringBuffer toAppendTo, FieldPosition pos)将给定的 Date为日期/时间字符串,并将结果附加到给定的 StringBuffer 。
Dateparse​(String text, ParsePosition pos)解析字符串中的文本以生成 Date 。
StringtoPattern()返回描述此日期格式的模式字符串。
/**
 * DateFormat
 */
public class Demo6DateFormat {
    public static void main(String[] args) throws ParseException {
        /**
         * y:年
         * M:月
         * d:日
         * H:时
         * m:分
         * s:秒
         */
        SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        // format:将Date对象转换成字符串("yyyy年MM月dd日 HH:mm:ss")
        String text = format.format(new Date());
        System.out.println(text);
        // parse:将("yyyy年MM月dd日 HH:mm:ss")日期字符串,转换为date对象
        Date parse = format.parse("2022年11月11日 16:45:36");
        // 今天离2022年11月11日还有几天
        System.out.println((parse.getTime()-new Date().getTime())/1000/60/60/24);
    }
}

运行结果:

2020122716:40:02
684

七、java.util.Calendar

Calendar类是一个抽象类,可以为在某一特定时刻和一组之间的转换的方法calendar fields如YEARMONTHDAY_OF_MONTHHOUR ,等等,以及用于操纵该日历字段,如获取的日期下个星期。 瞬间可以用毫秒值表示,该值是1970年1月1日格林威治标准时间1970年1月1日00:00:00,000(格里高利)的Epoch的偏移量。
Calendar提供了一个类方法getInstance ,用于获取此类型的通用对象。 CalendargetInstance方法返回一个Calendar对象,其日历字段已使用当前日期和时间初始化:

 Calendar rightNow = Calendar.getInstance();

常用的字段汇总:

变量和类型字段描述
static intAMAM_PM字段的值,表示从午夜到正午之前的一天的时段。
static intAM_PMget和 set字段编号表示 HOUR是在中午之前还是之后。
static intDATEget和 set字段编号表示当月的日期。
static intDAY_OF_MONTHget和 set字段编号表示当月的日期。
static intDAY_OF_WEEK字段编号为 get和 set表示星期几。
static intDAY_OF_WEEK_IN_MONTHget和 set字段编号,表示当前月份中某一天的序号。
static intDAY_OF_YEARget和 set字段编号表示当年的日期编号。
static intFRIDAYDAY_OF_WEEK字段的值表示星期五。
static intHOURget和 set字段编号表示上午或下午的小时。
static intHOUR_OF_DAYget和 set字段编号表示当天的小时。
static intMILLISECONDget和 set字段编号表示秒内的毫秒数。
static intMINUTEget和 set字段编号表示小时内的分钟。
static intMONTHget和 set字段编号表示月份。
protected longtime此日历的当前设置时间,以1970年1月1日格林威治标准时间0:00:00之后的毫秒数表示。
static intWEEK_OF_MONTHget和 set字段编号, get set的周数。
static intWEEK_OF_YEARget和 set字段编号表示当前年份的周数。
static intYEAR字段编号为 get和 set表示年份。

常用的方法:

变量和类型方法描述
abstract voidadd​(int field, int amount)AM_PM字段的值,表示从午夜到正午之前的一天的时段。
booleanafter​(Object when)返回此 Calendar是否表示指定的 Object表示的时间之后的时间。
booleanbefore​(Object when)返回此 Calendar是否表示指定的 Object代表的时间之前的时间。
intget​(int field)返回给定日历字段的值。
intgetActualMaximum​(int field)给定此 Calendar的时间值,返回指定日历字段可能具有的 Calendar 。
intgetActualMinimum​(int field)给定此 Calendar的时间值,返回指定日历字段可能具有的 Calendar 。
intgetFirstDayOfWeek()得到一周的第一天是什么; 例如, SUNDAY在美国, MONDAY在法国。
static CalendargetInstance()使用默认时区和区域设置获取日历。
DategetTime()返回一个 Date对象,表示此 Calendar的时间值(距离 Epoch的毫秒偏移量)。
longgetTimeInMillis()以毫秒为单位返回此Calendar的时间值。
TimeZonegetTimeZone()获取时区。
voidset​(int field, int value)将给定的日历字段设置为给定值。
voidsetTime​(Date date)使用给定的 Date设置此日历的时间。
StringtoString()返回此日历的字符串表示形式。
/**
 * Calendar日历类
 */
public class Demo7Calendar {
    // get
    // set
    // add
    // getTime:获取日历时间,表示的Date对象
    // getActualMaxmum:获取某字段的最大值
    public static void main(String[] args) {
        // Calender是一个抽象类不能直接new,使用getInstance()会帮你返回一个已经实现好的一个子类对象,基于不同地区所编写的
        Calendar cl = Calendar.getInstance();
        // 获取日历里的年份
        int year = cl.get(Calendar.YEAR);
        System.out.println("日历里的年份:"+year);
        // 获取日历里的天数
        int day = cl.get(Calendar.DAY_OF_YEAR); // 根据年
        System.out.println("日历里的天数:"+day);
        System.out.println("获取今天是当前月份的第几天:"+cl.get(Calendar.DAY_OF_MONTH));  // 根据月份
        System.out.println("根据星期:"+cl.get(Calendar.DAY_OF_WEEK));   // 根据星期
        System.out.println("根据周和月:"+cl.get(Calendar.DAY_OF_WEEK_IN_MONTH));  // 根据周和月
        // 设置日历中的年份为2022年
        cl.set(Calendar.YEAR,2022);
        System.out.println("日历中的年份为2022年:"+cl.get(Calendar.YEAR));
        // 获取日历里的星期数
        System.out.println("根据年获取日历里的星期数:"+cl.get(Calendar.WEEK_OF_YEAR));  // 根据年
        // 年份加1,减法就是加负数
        cl.add(Calendar.YEAR,1);
        System.out.println("年份加1:"+cl.get(Calendar.YEAR));
        // 在计算机中月份是 0-11
        // 月份减5
        cl.add(Calendar.MONTH,-5);
        System.out.println("月份减5:"+cl.get(Calendar.MONTH));
        // 获取日历时间,表示的Date对象
        Date time = cl.getTime();
        // 获取当前年的最大月份
        int m = cl.getActualMaximum(Calendar.MONTH);
        System.out.println("获取当前年的最大月份:"+m);
        // 获取当前年的最大天数
        int d = cl.getActualMaximum(Calendar.DAY_OF_YEAR);
        System.out.println("当前年的最大天数:"+d);
        // 获取指定月份的天数
        cl.set(Calendar.MONTH,1);
        System.out.println("获取2月份的天数:"+cl.getActualMaximum(Calendar.DAY_OF_MONTH));
        // 获取一年中有多少周
        System.out.println("获取一年中有多少周:"+cl.getActualMaximum(Calendar.WEEK_OF_YEAR));

    }
}

运行结果:

日历里的年份:2020
日历里的天数:362
获取今天是当前月份的第几天:27
根据星期:1
根据周和月:4
日历中的年份为2022年:2022
根据年获取日历里的星期数:53
年份加12023
月份减56
获取当前年的最大月份:11
当前年的最大天数:365
获取2月份的天数:28
获取一年中有多少周:52

八、java.lang.System

System类包含几个有用的类字段和方法。 它无法实例化。 System类提供的设施包括标准输入,标准输出和错误输出流; 访问外部定义的属性和环境变量; 加载文件和库的方法; 以及用于快速复制阵列的一部分的实用方法。

常用的字段汇总:

System类的字段是一定要清楚的

变量和类型字段描述
static PrintStreamerr“标准”错误输出流。
static InputStreamin“标准”输入流。
static PrintStreamout“标准”输出流。

常用的方法:

变量和类型方法描述
static voidarraycopy​(Object src, int srcPos, Object dest, int destPos, int length)将指定源数组中的数组从指定位置开始复制到目标数组的指定位置。
static longcurrentTimeMillis()以毫秒为单位返回当前时间。
static Consoleconsole()返回与当前Java虚拟机关联的唯一Console对象(如果有)。
static voidexit​(int status)终止当前运行的Java虚拟机。
static voidgc()运行垃圾收集器。
static PropertiesgetProperties()确定当前系统属性。
static StringgetProperty​(String key)获取指定键指示的系统属性。

九、java.lang.String(绝对重点)

写Java代码那么久,可以发现,使用String可以表示出一个字符串,但是使用此类的时候也会发现有一点问题。
String命名风格可以发现,String是一个类,但是此类在使用的时候却发现可以不用构造方法而直接赋值,很多人初学者刚开始认为String是一个基本数据类型,这是一个误区。那么String类这样的操作有哪些特点呢?

1. String类介绍

String类表示字符串(在 Java 中字符串属于对象)。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。
字符串是不变的; 它们的值在创建后无法更改。 字符串缓冲区支持可变字符串。 因为 String 对象是不可变的,所以可以共享它们。 例如:

 String str = "abc";

相当于:

 char data[] = {'a', 'b', 'c'};
 String str = new String(data);

2. String类常用构造方法

构造器描述
String()初始化新创建的 String对象,使其表示空字符序列。
String​(byte[] bytes)通过使用平台的默认字符集解码指定的字节数组构造新的 String 。
String​(byte[] bytes, String charsetName)构造一个新的String由指定用指定的字节的数组解码charset 。
String​(char[] value)分配新的 String ,使其表示当前包含在字符数组参数中的字符序列。
String​(String original)初始化新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。
String​(StringBuffer buffer)分配一个新字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。
String​(StringBuilder builder)分配一个新字符串,其中包含当前包含在字符串构建器参数中的字符序列。

3. String类常用方法

记录了在Java开发时使用String类可能用得到的方法

变量和类型方法描述
charcharAt​(int index)返回指定索引处的 char值。
intcodePointAt​(int index)返回指定索引处的字符(Unicode代码点)。
intcodePointBefore​(int index)返回指定索引之前的字符(Unicode代码点)。
intcodePointCount​(int beginIndex, int endIndex)返回此 String的指定文本范围内的Unicode代码点数。
intcompareTo​(String anotherString)按字典顺序比较两个字符串。
booleancontains​(CharSequence s)当且仅当此字符串包含指定的char值序列时,才返回true。
static StringcopyValueOf​(char[] data)相当于 valueOf(char[]) 。
booleanstartsWith​(String prefix)测试此字符串是否以指定的前缀开头。
booleanendsWith​(String suffix)测试此字符串是否以指定的后缀结尾。
booleanequals​(Object anObject)将此字符串与指定的对象进行比较。
booleanequalsIgnoreCase​(String anotherString)将此 String与另一个 String比较,忽略了大小写。
inthashCode()返回此字符串的哈希码。
intindexOf​(String str)返回指定子字符串第一次出现的字符串中的索引。
intindexOf​(String str, int fromIndex)从指定的索引处开始,返回指定子字符串第一次出现的字符串中的索引。
intlastIndexOf​(String str)返回指定子字符串最后一次出现的字符串中的索引。
intlastIndexOf​(String str, int fromIndex)返回指定子字符串最后一次出现的字符串中的索引,从指定索引开始向后搜索。
Stringintern()返回字符串对象的规范表示。
booleanisEmpty()返回 true ,当且仅当, length()是 0 。
intlength()返回此字符串的长度。
Stringreplace​(char oldChar, char newChar)返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 。
StringreplaceAll​(String regex, String replacement)将给定替换的给定 正则表达式匹配的此字符串的每个子字符串替换。
StringreplaceFirst​(String regex, String replacement)将给定替换的给定 正则表达式匹配的此字符串的第一个子字符串替换。
String[]split​(String regex)将此字符串拆分为给定 正则表达式的匹配 项 。
booleanmatches​(String regex)判断此字符串是否与给定的 正则表达式匹配。
Stringsubstring​(int beginIndex)返回一个字符串,该字符串是此字符串的子字符串。
Stringsubstring​(int beginIndex, int endIndex)返回一个字符串,该字符串是此字符串的子字符串。
char[]toCharArray()将此字符串转换为新的字符数组。
StringtoLowerCase()使用默认语言环境的规则将此 String所有字符转换为小写。
StringtoUpperCase()使用默认语言环境的规则将此 String所有字符转换为大写。
Stringtrim()返回一个字符串,其值为此字符串,删除了所有前导和尾随空格,其中space被定义为其代码点小于或等于 ‘U+0020’ (空格字符)的任何字符。
static StringvalueOf​(Object obj)返回 Object参数的字符串表示形式。

以下是一些如何使用字符串的示例:

/**
 1. String
 2. 字符串是不变的
 3. 它们的值在创建后无法更改。
 4. 字符串缓冲区支持可变字符串。
 5. 因为String对象是不可变的,所以可以共享它们
 */
public class DemoString {
    public static void main(String[] args) {
        String text1 = "123";   // String直接创建
        String text2 = "123";   // String直接创建
        // new表示新开辟的空间(不会被缓存起来),内存地址绝对不可能相同,哪怕内容一样
        String text3 = new String("123");   // String对象创建
        System.out.println(text1 == text2);
        System.out.println(text1 == text3);
        // substring下标包含开始不包含结尾
        System.out.println("123456".substring(2, 5));
        // 字符串拼接,有几个加号就产生几个内存垃圾(能避免尽量避免)
        // 如果使用字符串拼接,不应该使用String
        // 应该使用StringBuffer,StringBuilder(可变字符序列,更节省内存)
        text1 = text1 + text2 + text3;
        System.out.println(text1);
        // StringBuilder 线程不安全的实现
        // StringBuffer 线程安全的实现
        StringBuilder sb = new StringBuilder("hahaha");
        sb.append("666");
        System.out.println(sb.toString());

    }
}

运行结果:

true
false
345
123123123
hahaha666

解析:

  1. 由于String字符串的不可变性,常量池中一定不存在两个相同的字符串。所以text1 == text2true
  2. new String("123");时,new表示新开辟的空间(不会被缓存起来),内存地址绝对不可能相同,哪怕内容一样。
  3. 使用"+"进行字符串拼接,有几个加号就产生几个内存垃圾(能避免尽量避免)。如果想要字符串拼接,不应该使用String应该使用StringBuffer,StringBuilder(可变字符序列,更节省内存)。

4. StringBuffer、StringBuilder和String的主要区别

  1. String是不可变字符序列,StringBuilderStringBuffer是可变字符序列。
  2. 执行速度StringBuilder > StringBuffer > String
  3. StringBuilder是非线程安全的,StringBuffer是线程安全的。

5. String类小测试

String类是我们在开发中使用频率最高的类之一,也是在面试时极有可能会被问到的,下面是一道测试题:

public class TestString {
    public static void main(String[] args) {
        String s1 = "1234";     // 双引号直接创建出来的String对象会直接存储在字符串常量池中
        String s2 = new String("1234");     // String对象创建
        System.out.println(s1 == s2);   // new是新创建的对象,不在字符串常量池中,所以是false
        String s3 = "12" + "34";
        // 字符串的+操作其本质是创建了StringBuilder对象进行append操作
        // 然后将拼接后的StringBuilder对象用toString方法处理成String对象,所以是true
        System.out.println(s1 == s3);
        String s4 = "12";
        String s5 = "34";
        String s6 = s4 + s5;
        System.out.println(s1 == s6);   // s6不在字符串常量池中,所以是false
        // String对象的intern方法会得到字符串对象在常量池中对应的引用
        // 如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用
        System.out.println(s1 == s6.intern());  // s6被添加到常量池中了,所以是true
        System.out.println(s2 == s2.intern());  // s2在堆中,s2.intern()在常量池中,所以是false
    }
}

运行结果:

false
true
false
true
false

在解析前必须要知道的点:

  1. 双引号直接创建出来的String对象会直接存储在堆内存中的字符串常量池中,new String()表示新开辟的空间,不会放在常量池中,而是放在存储在堆内存中。
  2. 字符串的"+"操作其本质是创建了StringBuilder对象进行append()操作,然后将拼接后的StringBuilder对象用toString()方法处理成String对象。
  3. String对象的intern()方法会得到字符串对象在常量池中对应的引用,如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。

解析:

  1. String s1 = "1234";是直接在字符串常量池中创建了"1234"字符串,String s2 = new String("1234");是在堆内存中创建了String对象,它们的引用不相同,所以s1 == s2false
  2. String s3 = "12" + "34";它们相加必然是"1234"字符串,与String s1 = "1234";的内容是一样的,因此无需再在常量池中创建"1234"字符串,而是直接把"1234"字符串的引用地址赋予s3,所以s1 == s3true
  3. String s6 = s4 + s5;这里是对象的相加,虽然s6的值是"1234",但是因为是对象的相加,所以s6存储在堆内存中并且是新开辟的空间,所以s1 == s6false
  4. s6.intern()因为s6是存储在堆内存空间中,不在常量池内,因此执行intern()会把s6添加到字符串常量池中,又因为s6的内容为"1234"与String s1 = "1234";相同,所以会直接把"1234"字符串的引用地址赋予s6,所以s1 == s6.intern()true
  5. s2 == s2.intern()s2存储在堆内存中,s2.intern()会被添加到字符串常量池中,因此这句话也等同于s2 == s1,所以s2 == s2.intern()false
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网友小锋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值