JavaSE——常用类库(上)(泛型、Objects、Math、ArraysBigDecimal类)

第1节 常用类库(上)

面向对象更多是思想上的东西,常用类库更多是工具上的东西,熟能生巧,多整理笔记。

一、泛型

1.1 概述

泛型,即“参数化类型”。就是将类型由原来具体类型进行参数化 ,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参 ),然后在使用/调用时传入具体的类型(类型实参)

1.2 泛型的使用

   泛型一般在类、接口和方法中使用,其中主要是类中用的更多。

1.2.1 泛型在类中的使用

   先来看定义的时候的格式:
package com.kaikeba.coreclasslibrary;public class Person<A> {private String name;private int age;//这里是形参,实际使用该类时需要给定实参,在该类中可以用A来代替一种不确定的类型private A data;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public A getData() {return data;}public void setData(A data) {this.data = data;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", data=" + data +'}';}
}
   再看使用时的格式:
package com.kaikeba.coreclasslibrary;public class genericParadigm {public static void main(String[] args) {//实际使用时指定具体的类型给泛型,那么该类中所有的A全部替换为IntegerPerson<Integer> p = new Person<>();}
}

看下面传入不同的类型,setData方法的参数列表中data的类型也随之变化:

在这里插入图片描述
在这里插入图片描述

1.2.2 泛型在接口中的使用

   定义时格式如下所示,和类中基本一致:
public interface 接口名<T> {T getData();
}

接口都是要被类实现才有意义,实现接口时,可以选择指定泛型类型,也可以选择不指定,如下所示:

1、指定类型

//指定类型:这样的类使用时无需再给泛型具体的类型,直接使用即可
public class 类名 implements 接口名<String> {private String text;@Overridepublic String getData() {return text;}
}

具体的使用案例:

package com.kaikeba.coreclasslibrary;public class genericParadigm2 {public static void main(String[] args) {Apple a = new Apple();a.text = "123";System.out.println(a.getData());}}interface Fruit<T>{T getData();
}//实现接口时指定类型
class Apple implements Fruit<String>{String text;@Overridepublic String getData() {return text;}
}结果为:123

2、不指定类型:

//不指定类型:使用类时需要给定具体的类型
public class 类名<T> implements 接口名<T> {private T text;@Overridepublic T getData() {return text;}
}

具体的使用案例:

package com.kaikeba.coreclasslibrary;public class genericParadigm2 {public static void main(String[] args) {Apple<String> a = new Apple<>();a.text = "123";System.out.println(a.getData());}}interface Fruit<T>{T getData();
}//实现接口时不指定类型
class Apple<T> implements Fruit<T>{T text;@Overridepublic T getData() {return text;}
}结果:123

1.2.3 泛型在方法中的使用

   泛型方法的格式如下,注意位置与类和接口不一样:
private static <T> T 方法名(T a, T b) {}
   想用T的地方可以用T,不想用的地方就用自己想用的类型即可,上述的格式案例中全用了T,下面看个例子:
package com.kaikeba.coreclasslibrary;public class genericParadigm {public static void main(String[] args) {//根据传入的实际参数类型,自动获取泛型的类型print(123);}public static <A> void print(A a) {System.out.println(a);}
}结果:123

1.3 泛型限制类型

在使用泛型的时候,可以指定泛型的限定区域,例如:必须是某某类的子类 或 某某接口的实现类,格式:

<T extends 类或接口1 & 接口2>

注意:这里不论是类还是接口,都是使用extends关键字。

package com.kaikeba.coreclasslibrary;public class genericParadigm2 {public static void main(String[] args) {// 如果传入的不是水果的实现类,会报错// Plate<String> p = new Plate<>();// p.data = "String";// 如果传入的符合要求,则正确Plate<Apple> p = new Plate<>();}
}//定义一个水果接口
interface Fruit<T>{T getData();
}//实现水果接口的苹果类
class Apple<T> implements Fruit<T>{T text;@Overridepublic T getData() {return text;}
}//泛型限制只能传入水果接口的实现类
class Plate<T extends Fruit>{T data;
}

1.4 泛型中的通配符——?

类型通配符是使用 ? 代替方法具体的类型实参。

  1. <? extends Parent>指定了泛型类型的上界,必须是Parent或其子类;

  2. <? super Child>指定了泛型类型的下界,必须是Child或其父类;

  3. <?>指定了没有限制的泛型类型。

package com.kaikeba.coreclasslibrary;public class genericParadigm3 {public static void main(String[] args) {//不能将一个装着苹果的盘子看成一个装着水果的盘子//多态建立的基础:左右对象是父子关系,此时是同级别类,只是泛型是父子类关系而已//多态不能用在容器的内容上Plate3<? extends Fruit3> p1 = new Plate3<Apple3>();Plate3<? super Apple3> p2 = new Plate3<Fruit3>();}}interface Fruit3{}class Apple3 implements Fruit3{}class Plate3<T>{//也可以多个泛型T data;
}

1.5 泛型的作用以及注意事项

作用:

  1. 提高代码的复用率

  2. 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)

注意事项:

在编译之后程序会采取去泛型化的措施,也就是Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法,也就是说,泛型信息不会进入到运行时阶段。

二、java.util.Objects类

Objects类以及下面介绍的每一种类库,最好的学习方法就是看源码以及注释,其次可以配合中文手册,下面就是对其的整理。

简介: 此类由静态实用程序方法组成,用于对对象进行操作,或在操作前检查某些条件。这些实用程序包括空安全 (null-safe) 或空容忍 (null-tolerant) 方法,用于计算对象的哈希代码、返回对象的字符串、比较两个对象以及检查索引或子范围值是否超出范围等等。

2.1 checkFromIndexSize

在这里插入图片描述

2.2 checkFromToIndex

在这里插入图片描述

2.3 checkIndex

在这里插入图片描述

上面这三个判断索引范围,自己写也很简单。。。

2.4 compare

在这里插入图片描述

注意不是返回o,是返回0,还是看源码注释比较靠谱。。。

2.5 deepEquals

在这里插入图片描述

这个暂时用不到,用到了再来补充笔记。

2.6 euqals

在这里插入图片描述

这个目前比较重要,翻译的实在不太行,以后还是多看源码吧。

它的作用在于,如果一个对象为null,那么它调用默认Objectequals方法,会报空指针异常:

package com.kaikeba.coreclasslibrary.objects;import java.util.Objects;/*** Objects*/
public class Demo {public static void main(String[] args) {String s1 = null;String s2 = "456";System.out.println(s1.equals(s2));}
}结果为:
Exception in thread "main" java.lang.NullPointerExceptionat com.kaikeba.coreclasslibrary.objects.Demo.main(Demo.java:12)

因为null对象没有equals方法。

但是如果使用Objects.equals则不会:

package com.kaikeba.coreclasslibrary.objects;import java.util.Objects;/*** Objects*/
public class Demo {public static void main(String[] args) {Person p1 = null;Person p2 = new Person();System.out.println(Objects.equals(p1, p2));}
}结果为:
false

看一下equals的源码就知道了:

public static boolean equals(Object a, Object b) {return (a == b) || (a != null && a.equals(b));
}

首先判断a和b是否指向同一个对象,是则返回true,不是则看右边的括号,如果a为null,直接返回false,不空才调用Object.equals方法进行比较,这样可以避免因为空对象导致的异常抛出。

2.7 hash

在这里插入图片描述
哈希值目前还没介绍,后续补充。。。

2.8 hashCode

返回一个非空对象的哈希码,空对象返回0。

源码如下:

public static int hashCode(Object o) {return o != null ? o.hashCode() : 0;
}

2.9 isNull,nonNull

在这里插入图片描述

public static boolean isNull(Object obj) {return obj == null;
}

在这里插入图片描述

public static boolean nonNull(Object obj) {return obj != null;
}

2.10 requireNonNull、requireNonNullElse、requireNonNullElseGet

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.11 toString

在这里插入图片描述
在这里插入图片描述

三、java.lang.Math

Math类包含用于执行基本数值运算的方法,如初等指数、对数、平方根和三角函数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

看几个较常用的:

package com.kaikeba.coreclasslibrary.math;/*** Math*/
public class Demo {public static void main(String[] args) {System.out.println(Math.abs(-100));System.out.println(Math.min(100, 200));//返回最接近的整数System.out.println(Math.round(100.55));System.out.println(Math.round(-100.55));//返回小于等于参数的最大整数System.out.println(Math.floor(3.5));System.out.println(Math.floor(-3.5));//返回大于等于参数的最大整数System.out.println(Math.ceil(3.5));System.out.println(Math.ceil(-3.5));}
}结果如下:
100
100
101
-101
3.0
-4.0
4.0
-3.0

四、java.util.Arrays

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

4.1 binarySearch

在这里插入图片描述
除此之外,还有各种其他类型的二分查找,都是在一个数组中查找指定的值,返回找到的索引。

4.2 compare

在这里插入图片描述

比较两个数组

4.3 copyOf

在这里插入图片描述
将一个数组里的内容复制到一个新的长度的数组中。

4.4 copyOfRange

在这里插入图片描述

将指定数组的指定范围内容复制到新数组中。

4.5 equals

在这里插入图片描述

比较两个数组是否相同。

4.6 fill

在这里插入图片描述

将指定的元素分配给数组中每一个元素。

4.7 mismatch

在这里插入图片描述

查找并返回两个数组中第一个不匹配的索引。

4.8 sort

在这里插入图片描述

按升序对数组进行排序。

4.9 toString

在这里插入图片描述

返回数组内容的字符串表示形式。

上述的方法并没有全部总结,还有一些不常用的方法没有整理。

下面看一个例子:

package com.kaikeba.coreclasslibrary.arrays;import java.util.Arrays;public class Demo {public static void main(String[] args) {int[] arr = {8,1,2,3,4,5,6,7};//直接输出arr是地址信息System.out.println(arr);//下面可以输出数组的内容,但是很麻烦for(int i=0; i<arr.length; i++) {if(i == arr.length - 1) {System.out.print(arr[i]);}else {System.out.print(arr[i] + ", ");}}System.out.println();//Arrays中的方法都是静态的,直接用类名调用,无需新建对象//toString方法可以直接输出数组内每个元素System.out.println(Arrays.toString(arr));//sort方法可以升序排序Arrays.sort(arr);System.out.println(Arrays.toString(arr));//二分查找指定元素的索引,前提:数组必须有序System.out.println(Arrays.binarySearch(arr, 6));//动态扩容arr = Arrays.copyOf(arr, 15);System.out.println(Arrays.toString(arr));}
}结果如下所示:
[I@7c30a502
8, 1, 2, 3, 4, 5, 6, 7
[8, 1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7, 8]
5
[1, 2, 3, 4, 5, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0]

五、java.math.BigDecimal

5.1 概念

通过在控制台运行0.1+0.2,会发现float和double的运算误差:

package com.kaikeba.coreclasslibrary.bigdecimal;import java.math.BigDecimal;public class Demo {public static void main(String[] args) {System.out.println(0.1+0.2);}
}结果:
0.30000000000000004

虽然误差很小,但是在类似于银行这种地方,这些小误差累计起来还是很严重的,所以需要一种严格准确的计算类。为了实现精确运算就需要借助java.math.BigDecimal类对要计算的对象加以描述。

5.2 常用构造方法

   有很多构造方法,最常用字符串来指定精确值:
public BigDecimal(String val) {
}

如:

BigDecimal b1 = new BigDecimal("0.1");
BigDecimal b2 = new BigDecimal("0.2");

5.3 常用方法

有很多关于数学运算的方法,最常用的还是加减乘除四个。下述所有的运算方法,不会影响参与运算的数据本身,运算的结果会被封装为一个新的BigDecimal对象,这个对象会通过return返回出去。

  1. public BigDecimal add(BigDecimal augend):加法运算

  2. public BigDecimal subtract(BigDecimal augend):减法运算

  3. public BigDecimal multiply(BigDecimal augend):乘法运算

  4. public BigDecimal divide(BigDecimal augend):除法运算

看一个例子:

package com.kaikeba.coreclasslibrary.bigdecimal;import java.math.BigDecimal;public class Demo {public static void main(String[] args) {BigDecimal b1 = new BigDecimal("0.1");BigDecimal b2 = new BigDecimal("0.2");BigDecimal b3 = b1.add(b2);System.out.println(b1);System.out.println(b2);System.out.println(b3);}
}结果:
0.1
0.2
0.3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

朗兰兹纲领:关于数学大一统的伟大构想

麦克斯韦方程组来源&#xff1a;今日头条我们经常聊到物理学家都在追寻物理学的大一统&#xff0c;物理学的第一次大一统是麦克斯韦的麦克斯韦方程组&#xff0c;将电学与磁学相统一&#xff0c;建立了电磁学理论&#xff0c;后来&#xff0c;爱因斯坦想继续完成麦克斯韦未竟之…

JavaSE——常用类库(下)(Date、DateFormat、Calendar、System类)

第1节 常用类库&#xff08;下&#xff09; 六、java.util.Date Date类表示特定的时刻&#xff0c;精度为毫秒。 在JDK 1.1之前&#xff0c; Date类还有两个附加功能。 它允许将日期解释为年&#xff0c;月&#xff0c;日&#xff0c;小时&#xff0c;分钟和秒值。 它还允许…

世界隐形冠军比拼:德国1307家、美国366家、中国68家

来源&#xff1a;股权投资论坛目录一、隐形冠军的概念二、隐形冠军的四个特征三、隐形冠军为何隐形四、隐形冠军到底有多牛五、如何成为隐形冠军六、中国隐形冠军多吗1隐形冠军的概念“隐形冠军”这个概念是赫尔曼西蒙教授提出的。1986年&#xff0c;他在研究德国出口数据时发现…

JavaSE——常用类库(String类)

第1节 常用类库——String 因为String相对之前的类来说更加常用一些&#xff0c;所以对字符串类进行专门的整理。 1. 概述 String类表示字符串&#xff0c;Java中的所有字符串文字都实现为此类的实例。字符串是不变的&#xff0c;它们的值在创建后无法更改 。因为它的创建是通…

VVDocumenter 使用

函数说明文档插件下载链接 https://github.com/onevcat/VVDocumenter-Xcode下载后&#xff0c;直接运行项目升级Xcode后可能不能再次使用&#xff0c;需要做一些处理从Xcode 5开始&#xff0c;苹果要求加入UUID证书从而保证插件的稳定性。因此Xcode版本更新之后需要在VVDocumen…

大自然创作的分形艺术

来源&#xff1a;http://blog.sciencenet.cn/blog-420554-363521.html数学上的分形 (Fractal) 是指“一个粗糙或零碎的几何形状&#xff0c;可以分成数个部分&#xff0c;且每一部分都&#xff08;至少会大略&#xff09;是整体缩小尺寸的形状”。数学家们已经创作出许多美丽的…

JavaSE——类集(上)(Collection、List、Iterator、forEach)

第2节 集合&#xff08;上&#xff09; 因为已经有数据结构的基础&#xff0c;前面有关数据结构的知识就不单独整理了&#xff0c;直接上Java的集合类的知识。 一、类集&#xff08;集合类&#xff09; 1.1 集合概述 集合&#xff1a; 集合是java中提供的一种容器&#xff…

第二个spring冲刺总结

讨论成员&#xff1a;罗凯旋、罗林杰、吴伟锋、黎文衷 第二阶段总体是做到了四则运算的demo&#xff0c;,包括APP进入动画&#xff0c;以及界面的基本效果设计&#xff0c;还有能进行综合计算&#xff08;选择题&#xff0c;可以 自动生成简单&#xff0c;容易&#xff0c;困难…

图灵奖得主姚期智:求解人工智能的中国答案

来源&#xff1a;清华大学他是“图灵奖”创立以来首位获奖的亚裔学者&#xff0c;也是迄今为止获此殊荣的唯一华裔计算机科学家。2004年从普林斯顿辞去终身教职回到清华任教。2005年&#xff0c;他为清华本科生创立了计算机科学实验班“姚班”。如今&#xff0c;在中国乃至全球…

JavaSE——类集(下)(Set、Comparable、Collections、Comparator、Map)

第2节 集合&#xff08;下&#xff09; 一、Set接口 java.util.Set 接口和 java.util.List接口一样&#xff0c;同样继承自 Collection接口&#xff0c;它与Collection接口中的方法基本一致&#xff0c;并没有对 Collection接口进行功能上的扩充&#xff0c;只是比Collection…

美国国家科学院发布《材料研究前沿:十年调查》

来源&#xff1a;中国科学院科技战略咨询研究院2月8日&#xff0c;美国国家科学院发布了针对材料研究的第三次十年调查《材料研究前沿&#xff1a;十年调查》报告。这次的调查主要评估了过去十年中材料研究领域的进展和成就&#xff0c;确定了2020-2030年材料研究的机遇、挑战和…

JavaSE——IO(上)(File、字节流、字符流、转换流、打印流、缓存流)

第3节 IO&#xff08;上&#xff09; 一、File类与文件基本操作 在程序中经常需要用到文件的操作&#xff0c;Java有专门的类来进行文件的操作——File类。 1.1 File类概述 它是对文件和目录路径名的抽象表示。 即它本身不是一个文件&#xff0c;只是一个抽象表示&#xff…

学习新技能时,大脑在如何发生改变?

来源&#xff1a;中国生物技术网众所周知&#xff0c;无论是一项运动、一种乐器还是一门手艺&#xff0c;掌握一项新技能都是需要花费时间并进行训练的。虽然我们都知道健康的大脑能够应付的来&#xff0c;但是为了开发出新行为大脑如何发生改变科学家们对此仍知之甚少。近日&a…

JavaSE——IO(下)(Properties类、序列化与反序列化)

第3节 IO&#xff08;下&#xff09; 一、.properties文件与Properties类 1.1 .properties文件介绍 .properties文件一种属性文件&#xff0c;以键值对 的格式存储内容&#xff0c;在Java中可以使用Properties类来读取这个文件&#xff0c;一般来说它作为一些参数的存储&…

VS调试dll详细过程记录

VS调试dll详细过程记录 qianghaohao(孤狼) 前言&#xff1a;在我们写的程序中有时候调用dll&#xff0c;并且需要跟踪dll中的函数&#xff0c;此时直接调试调用dll的工程是无法跳进dll的函数的&#xff0c;此时我们可以启动dll工程 来跟踪程序的走向。注意&#xff1a;要有…

谁在真正领跑 5G:技术创新和标准

来源&#xff1a;云头条5G是包括美国总统特朗普在内的所有人都在谈论的新技术。所以&#xff0c;每家公司自然都想谈论5G以及如何领跑这个领域。然而现实情况是&#xff0c;移动5G是一项涵盖甚广的无线标准&#xff0c;它改变了我们对蜂窝通信的认识&#xff0c;并前所未有地拓…

JavaSE——XML与JSON(语法格式、解析内容)

第6节 XML与JSON 一、XML 1.1 XML简介 XML全称为可扩展标记语言&#xff08;extensible Markup Language&#xff09; 。 特性&#xff1a; xml具有平台无关性&#xff0c;是一门独立的标记语言&#xff1b; xml具有自我描述性。 用途&#xff1a; 网络数据传输 数据存…

三大阶段,四大领域,详解你不知道的AIoT!

AIoT即AIIoT&#xff0c;指的是人工智能技术与物联网在实际应用中的落地融合。目前&#xff0c;越来越多的行业及应用将AI与IoT结合到了一起&#xff0c;AIoT已经成为各大传统行业智能化升级的最佳通道&#xff0c;也是未来物联网发展的重要方向。来源&#xff1a;物联网智库AI…

人类为什么会同情机器人,是否需要禁止虐待机器人

6月14日&#xff0c;一段形似波士顿动力机器人Atlas反击人类的视频在网络热传&#xff0c;制作这款视频的团队Corridor Digital&#xff0c;是一家位于洛杉矶的美国制作工作室。自2010年以来&#xff0c;一直以制作与流行文化相关的病毒在线短片视频而闻名。Corridor Digital由…

dubbo学习总结——思维导图

Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的、轻量级的开源Java RPC框架&#xff0c;可以和Spring框架无缝集成&#xff0c;2018年阿里巴巴把这个框架捐献给了apache基金会 什么是RPC&#xff1f; RPC全称为remote procedure call&#xff0c;即远程…