该文章是分享对于Java中根底广泛常识类的总结之SE方面的常识,是我在学习过程中的笔记以及前期整顿好的总结,实用性很高,心愿对大家有帮忙。

接下来开始进行分享:

目录

  1. 字符串相干的类

       1.1 String   1.2 String的罕用办法   1.3 StringBuffer与StringBuilder
  2. 日期工夫

       2.1 JDK8之前的日期工夫   2.2JDK中的日期和工夫   2.3 Instant(刹时)   2.4 DateTimeFormatter

3.比拟

  1. System, Math, BigInteger 和 BigDecimal

       4.1 System   4.2Math   4.3BigInteger与Bigdecimal   4.4集体总结的其余类
  2. 字符串相干的类
    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==s2为true,s1==s3, s1==s4, s3==s4均为false

起因如下:

实际上,通过构造方法来结构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的罕用办法总结如下(未总结的请本人查阅):

同时还须要留神的一些办法如下,重要水平顺次升高,但仍需把握:

留神:上表下部的4个int办法如果未找到,返回的均为-1

再举例一些办法(一些可能不太罕用的):

String regex个别都用正则表达式示意

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

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

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

调用String重载的valueOf(xxx)

另外

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编码为字节序列,将后果存储到新的字节数组中。不同的编码方式返回的可能不同。

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
String与StringBuffer, 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这里就是比拟growth和oldLength + (2 << coder)谁大,大者加上oldLength(这样就成了2倍+2)。这里coder原始值为0,我只看了append相干源码,coder值并没有变,其余源码没有看,留神可能产生扭转。

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

StringBuffer罕用办法

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-26System.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
容许进行格式化:日期-->文本,解析:文本-->日期

格式化:

解析:

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

pattern举例如下图:

demo1默认模式:

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 ,用于获取此类型的个别有用的对象。 Calendar的getInstance办法返回一个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个问题:

可变性:例如Calendar的set,它们都是可变的

偏移性:Date中的年份都是从1900开始,月份从0开始,如果调用有参结构,会产生偏移。

格式化:格式化只对Date有用,对于Calendar则不行

线程不平安

java8中的java.time API曾经纠正了过来的缺点。

工夫日期的相干packge:

LocalDate, LocalTime, LocalDateTime是其中比拟重要的几个类,他们的实例均为不可变实例,应用ISO-8601日历零碎。

ISO-8601日历零碎是国际标准话组织制订的古代公民的日期和工夫的表示法(公历)

相干办法:

下面四个档次其实就是结构、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操作:

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实例自身并没有发生变化(不可变性)。

加减操作:

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的一个工夫戳(纳秒级)。

相干办法:

工夫规范次要有: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

三种预约义的规范格局:

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

本地化相干的格局:

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(不再具体赘述):

以上三种Date之间的转换:

  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:

4.2 Math

以上为Math罕用办法总结。可见开发文档。

4.3 BigInteger与BigDecimal
BigInteger
构造方法:

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

![上传中...]()

BigDecimal

Float和Double的精度不能满足用户需要时,能够应用BigDecimal

构造方法:

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

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

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

加减乘除操作相似于BigInteger,阐明一下devide:

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

几种舍入模式:

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

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

ROUND_DOWN即向下舍。

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

这几个能够参考对应英文进行了解。

4.4 集体总结的其余类

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

例如取一个随机整数。

Random r1 = new Random();

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

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

以上就是明天Java中根底广泛常识类的总结之SE方面的常识的分享,感激大家观看,也欢送大家交换探讨,该文章若有不正确的中央,心愿大家多多包涵。

若对大家有帮忙,给个赞哦~,你们的