Java 常用类总结(SE基础)

本篇博客对java常用类相关知识进行了归纳总结,比较详细,适用于学习和复习。

  1. 字符串相关的类

1.1 String

String是一个 final类,代表不可变的字符序列。不可被继承。

String对象的字符内容是存储在一个字节数组 byte[]中。JDK1.8中存储的是 char[]注意区别。

  • String实现了 Serializable接口,支持序列化
  • 实现了 Comparable接口,表示可以比较大小
  • 通过字面量的方式(区别于 new)给一个 String赋值,此时的字符串值在字符串常量池中(和方法区在同一个地方)
  • String进行连接操作、重新赋值、 replace()等操作时,会重新指定内存区域赋值,不使用原有的 value进行赋值
String str = "hello";  //字面量赋值
String s1 = new String();//本质上为,this.value = new byte[0]
String s2 = new String(String str); //放一个String类型的参数
String s3 = new String(byte[] a);
String s3 = new String(byte[] a,int off,int length);//构造方法,放char[]也是可以的

考虑如下代码:

String s1 = "javaEE";
String s2 = "javaEE";
String s3 = new String("javaEE");
String s4 = new String("javaEE");

这里, s1==s2trues1==s3, s1==s4, s3==s4均为 false

原因如下:

Java 常用类总结(SE基础)

实际上,通过构造方法来构造 String会指向 value,而 value再去指向字符串常量。

String s3 = new String("javaEE");在内存中创建了两个对象:一个是堆中的 value结构,一个是常量池中的字符串数据。

  • intern() 返回字符串对象的规范表示。 这里会返回一个字符串常量。内存空间在常量池中。

另外,有一个关于形参实参方面的需要注意:

public class StringTest {
    String str = new String("hello");
    char[]ch = {'t','e','s','t'};

    public void change(String str,char ch[]){
        str = "hello,world";
        ch[0]='b';
    }

    public static void main(String[] args) {
        StringTest st = new StringTest();
        st.change(st.str, st.ch);
        System.out.println(st.str);
        System.out.println(st.ch);
    }
}

这里的结果为:”hello” /n “best”

类似于C语言中,根据指针进行交换两个指针中的内容,值传递过程中,实际参数的值传入形参,形成副本,方法结束后形参消失,实际参数值并没有改变。

另外还有一点需要注意:

String str = null; //这个指针指向null,并没有实例化
System.out.println(str);//输出"null"
System.out.println(str.length());//异常

1.2 String的常用方法

String的常用方法总结如下(未总结的请自己查阅):

Java 常用类总结(SE基础)

同时还需要注意的一些方法如下,重要程度依次降低,但仍需掌握:

Java 常用类总结(SE基础)

注意:上表下部的4个 int方法如果未找到,返回的均为-1

再举例一些方法(一些可能不太常用的):

Java 常用类总结(SE基础)

String regex一般都用正则表达式表示

String转换为基本数据类型或包装类

调用包装类的静态方法:对应的类型,如要转 int,调用 Integer.parseInt(str)

基本数据类型、包装类转为String

调用 String重载的 valueOf(xxx)

Java 常用类总结(SE基础)

另外

int num = 100;
String str = num+"";  //存在变量才会返回堆中,如果常量相加则会返回常量池

这样也可以转换为 String,但是需要注意,该类型是在堆中生成了 value数组,和 new String的方式类似。

String与char[], byte[]的相互转换

String–> char[]:调用 String.toCharArray即返回了一个 char[]

char[]或byte[] --> String:直接调用构造器

String–> byte[]:调用 String.getBytes即返回了一个 byte[],使用默认的字符集(例如”gbk、utf-8″等)进行转换。

getBytes(Charset charset) 使用给定的 charset将该 String编码为字节序列,将结果存储到新的字节数组中。不同的编码方式返回的可能不同。

1.3 StringBuffer与StringBuilder

StringStringBuffer, StringBuilder之间的异同?

String:不可变的字符序列,注意理解不可变性

StringBuffer:可变的字符序列,线程安全,效率较低(都是同步方法)

StringBuilder:jdk5.0新增,可变的字符序列,线程不安全,效率高

final byte[] value  //String中的
byte[] value  //StringBuffer和StringBuilder中的

StringBuffer

String str = new String();// new char[0]
String str1 = new String("abc");//new char[] {'a','b','c'};

StringBuffer sb = new StringBuffer();//new char[16] 初始容量为16
sb.append('a');// value[0]='a';依次进行

StringBuffer sb1 = new StringBuffer("abc");//new char["abc".length()+16]
System.out.println(sb.length()); //return的是count,每append操作count+=len,这里为1,并不是value.length

接下来看 StringBuffer的扩容机制

简述:一般情况下,若容量不够的时候,扩充为原来容量的2倍+2,同时将原有数组的元素复制到新数组中

JDK15中,源码已经改变,为:

private int newCapacity(int minCapacity) {
    int oldLength = value.length;
    int newLength = minCapacity << coder;
    int growth = newLength - oldLength;
    int length = ArraysSupport.newLength(oldLength, growth, oldLength + (2 << coder));
    if (length == Integer.MAX_VALUE) {
        throw new OutOfMemoryError("Required length exceeds implementation limit");
    }
    return length >> coder;
}

ArraysSupport.newLength这里就是比较 growtholdLength + (2 << coder)谁大,大者加上 oldLength(这样就成了2倍+2)。这里coder原始值为0,我只看了 append相关源码, coder值并没有变,其他源码没有看,注意可能发生改变。

JDK1.8中是直接进行移位操作+2的,现版本已更新。

StringBuffer常用方法

Java 常用类总结(SE基础)

StringBuilder的API与之相同,只是线程不安全,没有保证同步。

  1. 日期时间

2.1 JDK8之前的日期时间

java.lang.System中的 static long currentTimeMillis() 返回当前时间与1970年1月1日00:00:00之间的时间差(以毫秒为单位)。适用于计算时间差。(时间戳)

计算世界时间的主要标准有: UTC, GMT, CST

java.util.Date

java.sql中也有一个 Date类,是 java.util.Date的子类

表示特定的时间,精确到毫秒

两个构造器的使用:

构造器一: 创建一个当前时间的 Date对象

Date date = new Date();
System.out.println(date);//sout自带.toString,输出:Mon Apr 26 01:16:00 CST 2021
System.out.println(date.getTime());//返回当前date对象对应的时间戳

//Date中的无参构造源码
public Date() {
        this(System.currentTimeMillis());
    }

构造器二: 创建了一个指定时间的 Date对象

Date date1 = new Date(1619371381884L); //随便找了个时间戳
System.out.println(date1);

构造器的其余方法均已过时,不建议使用。

java.sql.Date对应的是数据库中的日期时间类,一般在数据库交互时使用

java.sql.Date date2 = new java.sql.Date(1619371381884L); //2021-04-26
System.out.println(date2);

该类没有无参构造。输出形式不同。

两种 Date互转:

Date date3 = (Date)date2;  //子类转父类
System.out.println(date3);
java.sql.Date date4 = new java.sql.Date(new Date().getTime()); //父类转子类,不能强制类型转换

java.text.SimpleDateFormat

允许进行格式化:日期–>文本,解析:文本–>日期

格式化:

Java 常用类总结(SE基础)

解析:

Date parse(String text, ParsePosition pos) 从字符串中解析文本以产生一个 Date

pattern举例如下图:

Java 常用类总结(SE基础)

demo1&#x9ED8;&#x8BA4;&#x6A21;&#x5F0F;

SimpleDateFormat sdf = new SimpleDateFormat();
Date date = new Date();
String format = sdf.format(date);
System.out.println(date); //Mon Apr 26 02:38:11 CST 2021
System.out.println(format); //2021/4/26 上午2:38

//解析过程
String str = "2021/4/16 上午12:38";  //格式有要求
Date date1 = sdf.parse(str);
System.out.println(date1); //Fri Apr 16 00:38:00 CST 2021

使用指定模式:

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy,MM,dd HH:mm:ss aaa");
String str2 = sdf1.format(date);
System.out.println(str2); //2021,04,26 02:47:22 上午
//解析的话也需要按这种模式进行,正常模式通常为"yyyy-MM-dd hh:mm:ss"
String str3 ="2021,04,26 02:47:22 上午";
Date date2 = sdf1.parse(str3);
System.out.println(date2); //Mon Apr 26 02:47:22 CST 2021

Calendar

Calendar是一个抽象类,主要用于完成日期字段之间的相互操作。

Calendar提供了一种类方法 getInstance ,用于获取此类型的一般有用的对象。 CalendargetInstance方法返回一个 Calendar对象,其日历字段已使用当前日期和时间进行初始化:

Calendar rightNow = Calendar.getInstance();调用了它的子类 GregorianCalendar的构造器

Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getClass());//class java.util.GregorianCalendar

Calendar对象可以产生实现特定语言和日历风格的日期时间格式化所需的所有日历字段值(例如日语 – 公历,日语 – 繁体)。 Calendar定义某些日历字段返回的值的范围及其含义。 例如,日历系统第一个月的值为 MONTH == JANUARY为所有日历。 其他值由具体的子类定义,如 ERA 。 有关详细信息,请参阅各个实体文档和子类文档。

常用方法:

void set(int field, int value) 将给定的日历字段设置为给定的值。

void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段。

final Date getTime() 返回一个 Date表示此物体 Calendar的时间值

void setTime(Date date) 使用给定的 Date设置此日历的时间

demo如下:

Calendar calendar = Calendar.getInstance();
//get
int i = calendar.get(Calendar.DAY_OF_MONTH);
System.out.println(i);//获取这个月的第几天,本实例为26,当前时间4/26
System.out.println(calendar.get(Calendar.DAY_OF_YEAR));//类似上一个
//set
calendar.set(Calendar.DAY_OF_MONTH,12);
int j = calendar.get(Calendar.DAY_OF_MONTH);  //12,改变了
System.out.println(j);
//add
calendar.add(Calendar.DAY_OF_MONTH,3);
j = calendar.get(Calendar.DAY_OF_MONTH); //15,还是改变,增加3天
System.out.println(j);
//getTime
Date date = calendar.getTime(); //Thu Apr 15 03:10:28 CST 2021,返回时间戳
System.out.println(date);
//setTime:Date --> Calendar
calendar.setTime(date);//直接操作当前对象
int days = calendar.get(Calendar.DAY_OF_MONTH);  //15
System.out.println(days);

获取月份时,一月是0;获取星期几时,周日是1

2.2 JDK8中的日期时间

因为之前的类具有4个问题:

  • 可变性:例如 Calendarset,它们都是可变的
  • 偏移性: Date中的年份都是从1900开始,月份从0开始,如果调用有参构造,会发生偏移。
  • 格式化:格式化只对 Date有用,对于 Calendar则不行
  • 线程不安全

java8中的java.time API已经纠正了过去的缺陷。

时间日期的相关packge:

Java 常用类总结(SE基础)

LocalDate, LocalTime, LocalDateTime是其中比较重要的几个类,他们的实例均为不可变实例,使用 ISO-8601日历系统。

ISO-8601日历系统是国际标准话组织制定的现代公民的日期和时间的表示法(公历)

相关方法:

Java 常用类总结(SE基础)

上面四个层次其实就是构造、get、set、加减操作。和 Calendar类似。

localDate是一个 final类,有构造方法,类似 String, Math,举例当前时间生成:

LocalDate localDate = LocalDate.now();  //2021-04-27
LocalTime localTime = LocalTime.now();  //19:24:37.171676500
LocalDateTime localDateTime = LocalDateTime.now();  //2021-04-27T19:24:37.171676500

举例设置指定时间:

LocalDateTime localDateTime1 = LocalDateTime.of(2020,10,6,13,12,13);//2020-10-06T13:12:13

举例相关 get操作:

Java 常用类总结(SE基础)
System.out.println(localDateTime.getMonth()); //APRIL
System.out.println(localDateTime.getMonthValue()); //4

这里的月份是从1开始的。

.with操作(设置相关属性):

LocalDate localDate1 = localDate.withDayOfMonth(22); //2021-04-22
System.out.println(localDate);  //2021-04-27
System.out.println(localDate1);

locatDate实例本身并没有发生变化(不可变性)。

加减操作:

Java 常用类总结(SE基础)
LocalDate localDate2 = localDate.plusDays(4); //localDate为4-27
System.out.println(localDate2);//2021-05-01
//减的话即将Plus换位minus

2.3 Instant(瞬时)

时间线上的一个瞬时点,可能用来记录应用程序中的事件时间戳。

同样是起始于1970年1月1日00:00:00的一个时间戳(纳秒级)。

相关方法:

Java 常用类总结(SE基础)

时间标准主要有:UTC, GMT, CST,UTC时间与伦敦本地时间相同,与北京相差8个小时(早了8个小时)

Instant instant = Instant.now();
System.out.println(instant); //2021-04-27T11:45:00.321544Z,实际时间19:45,相差8个小时

偏移应用:

OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8));
System.out.println(offsetDateTime);  //2021-04-27T19:48:17.448368100+08:00

返回时间戳(毫秒数):

System.out.println(instant.toEpochMilli());//1619524168468

设置特定时间,和 Date类似:

Instant instant1 = Instant.ofEpochMilli(1619524168468L);  //2021-04-27T11:49:28.468Z,这里的时间就是毫秒级的了
System.out.println(instant1);

2.4 DateTimeFormatter

Java 常用类总结(SE基础)

三种预定义的标准格式:

Java 常用类总结(SE基础)
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//格式化:日期-->字符串
LocalDateTime localDateTime = LocalDateTime.now();
String str = dateTimeFormatter.format(localDateTime);  //将当前时间格式化
System.out.println(str); //2021-04-27T19:59:19.0153049

//解析:字符串-->日期
TemporalAccessor temporalAccessor = dateTimeFormatter.parse("2021-04-27T19:59:19.0153049");
System.out.println(temporalAccessor);//{},ISO resolved to 2021-04-27T19:59:19.015304900

本地化相关的格式:

Java 常用类总结(SE基础)
DateTimeFormatter format = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM);
//SHORT 2021/4/27 下午8:09,  MEDIUM  2021年4月27日 下午8:10:02,
// 在java15中LONG会异常,1.8不会,DateTime中没有FULL,Date中有
String str1 = format.format(localDateTime);
System.out.println(str1);

自定义格式(类似于 SimpleDateFormat):

DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
String str1 = format.format(localDateTime); //2021-04-27 08:21:52
System.out.println(str1);
TemporalAccessor temporalAccessor1 = format.parse(str1);
System.out.println(temporalAccessor1);
//{MicroOfSecond=0, HourOfAmPm=8, MilliOfSecond=0, NanoOfSecond=0, MinuteOfHour=21, SecondOfMinute=52},ISO resolved to 2021-04-27

解析同上面即可,注意解析时需要一个 TemporalAccessor转承。

其他的一些API(不再详细赘述):

Java 常用类总结(SE基础)

以上三种 Date之间的转换:

Java 常用类总结(SE基础)
  1. 比较器

这里牵扯到对象的比较

实现 Comparable接口(自然排序),重写 compareTo()方法,重写的规则是:当前对象this大于形参对象obj,返回正整数;this小于,返回负整数;this等于,返回0;

使用 Comparator接口(定制排序)

适用于该类型没有实现 Comparable接口,且不方便修改代码;或者实现了 Comparable接口但是排序规则不适合当前操作

对比:

  • Comparable接口的方式可以保证类的对象在任何位置都可以实现比较
  • Comparator接口属于临时性的比较

关于应用在之前的博客中已有实现,可参考

(Set, Map, Collections工具类)JAVA集合框架二

  1. System, Math, BigInteger 和 BigDecimal

4.1 System

java.lang.System

成员变量:in, out ,err三个,分别代表标准输入流(键盘输入),标准输出流(显示器),标准错误输出流(显示器)

static long currentTimeMillis() 返回当前时间(以毫秒为单位)。表达格式同时间戳。

static void exit(int status) 终止当前运行的Java虚拟机。 status为0时代表正常退出,非零则为异常退出。

static void gc() 运行垃圾回收器。请求系统进行垃圾回收。

static String getProperty(String key) 获取指定键指示的系统属性。对于常用的 key

Java 常用类总结(SE基础)

4.2 Math

Java 常用类总结(SE基础)

以上为 Math常用方法总结。可见开发文档。

4.3 BigInteger与BigDecimal

BigInteger

构造方法:

Java 常用类总结(SE基础)

BigInteger提供所有java的基本整数操作符的对应物,并提供 java.lang.Math的所有相关方法,另外,还提供一下运算:模算术,GCD计算,质数测试,素数生成,位操作等。

Java 常用类总结(SE基础)

BigDecimal

FloatDouble的精度不能满足用户需求时,可以使用 BigDecimal

构造方法:

BigDecimal(double val)double转换为 BigDecimal ,这是 double的二进制浮点值的精确十进制表示。

BigDecimal(String val) 将BigDecimal的字符串表示 BigDecimal转换为 BigDecimal

还有很多,只举例了两种常用的。

加减乘除操作类似于 BigInteger,说明一下 devide

Java 常用类总结(SE基础)

scale即保留多少位小数,上下文设置用的不多不再赘述。

几种舍入模式:

Java 常用类总结(SE基础)

其中,有些翻译不够准确,解释一下:

ROUND_UP,即向上舍。0.1203456789,当精度为3的时候,按照 ROUND_UP模式,结果是0.121

ROUND_DOWN即向下舍。

ROUND_HALF_EVEN,像邻近的偶数方向舍。

这几个可以参考对应英文进行理解。

4.4 个人总结的其他类

其实经常用到的还有 Ramdom,生活中经常用到随机数。

Java 常用类总结(SE基础)

例如取一个随机整数。

Random r1 = new Random();
int i = r1.nextInt(100); //取0到100的随机整数,无 100

其他方法都是与之类似的,具体可参考开发文档。

Original: https://www.cnblogs.com/gaoyuan206/p/14710954.html
Author: GaoYuan206
Title: Java 常用类总结(SE基础)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578978/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • centos 7 IP不能访问nginx Failed connect to 185.239.226.111:80; No route to host解决办法

    服务器环境 centos 7.4 问题描述 1.可以ping通IP ,用IP访问nginx 不能访问,在服务器上curl localhost curl 185.239.226.11…

    Java 2023年5月30日
    093
  • Java之取余操作 “%”

    取模运算与取余运算两个概念有重叠的部分但又不完全一致。主要的区别在于对负整数进行除法运算时操作不同。 对于整形数a,b来说,取模运算或者求余运算的方法都是: 1、求 整数商 c =…

    Java 2023年6月6日
    067
  • java WebSocket 即时通讯服务端代码

    ackage org.fh.plugins.ChatServer; import java.net.InetSocketAddress; import java.net.Unkno…

    Java 2023年6月8日
    085
  • Google支付和服务端验证

    因为公司业务需求,需要使用google的登录和支付。google支付分为订阅和应用内购买两种,笔者使用的是应用内购买这种方式,这里将整个google支付和支付验证的流程记录下来。 …

    Java 2023年5月30日
    082
  • 使用certbot制作免费Lets encrypt SSL证书

    利用 certbot软件包可以免费制作SSL证书 这对小网站和测试项目太有用了,下面记录一下制作证书的流程和方法。以备后用。以centos7系统为例 其他系统类似。 yum ins…

    Java 2023年6月16日
    0130
  • JAVA WEB 中的编码分析

    ServletPath和PathInfo中的中文 QueryString中的中文 public void service(org.apache.coyote.Request req…

    Java 2023年6月7日
    081
  • 【软件构造】正则表达式

    1.定义 正则表达式:用来匹配一系列符合某个语法规则的字符串。 2.语法规则 符号 功能描述 示例 . 匹配除换行符以外的所有字符 w.h可以匹配wah,wbh,w#h等 [ ] …

    Java 2023年6月5日
    070
  • 【Java】的四种引用的区别

    强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM 也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强…

    Java 2023年5月29日
    0100
  • DBeaver首选项

    1.自动保存 2.SQL格式 可根据个人习惯选择SQL格式; 本人习惯紧凑格式。 3.自定义模板 将常用的SQL语句添加至模板,在SQL编辑器内输入模板名称按下Tab键,即可唤出全…

    Java 2023年6月8日
    089
  • .net 反射简单介绍

    1.什么是反射 反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。有了反射,即可对每一个类型了如…

    Java 2023年5月30日
    0139
  • 国产Java代码补全神器,aiXcoder 2.0实测

    国人的「代码补全工具」aiXcoder近期推出了「本地2.0新版」,笔者感觉试用一番… 发现新的2.0版一改之前1.0版对电脑性能的要求,在笔记本上运行也能保持稳、准、…

    Java 2023年5月29日
    069
  • 【HarmonyOS 】【JAVA UI】HarmonyOS 加载网络图片

    ​ 主要作用 加载网络图片功用于界面显示 参考资料 权限开发指导 线程管理 图像开发概述 代码实现 config.json配置 config.json代码如下 "reqP…

    Java 2023年5月29日
    079
  • Java高性能反射工具包ReflectASM

    ReflectASM 使用字节码生成的方式实现了更为高效的反射机制。执行时会生成一个存取类来 set/get 字段,访问方法或创建实例。一看到 ASM 就能领悟到 ReflectA…

    Java 2023年5月29日
    084
  • Java异常

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    072
  • Spring Data Jpa

    &#x3000;&#x3000;JPA(Java Persistence API)意即Java持久化API,是Sun官方在JDK5.0后提出的Java持久化规范(J…

    Java 2023年6月8日
    0121
  • 【转】Error:JAVA_HOME is not set and could not be found

    如果stop-dfs.sh也报了这个错,把$HADOOP_HOME/libexec/hadoop-config.sh中的如下内容之前加上 export JAVA_HOME=/hom…

    Java 2023年5月29日
    075
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球