JavaSE学习记录——Java常用类库_javaseript常用库-程序员宅基地

技术标签: java  Java SE学习  

一、泛型

  • 概述:指的是"参数化类型",指我们在开始定义一个方法的参数时,不能对其类型有一个具体的定义,即我们后期用到它时,可能将它定义为 String\int\double…等等
    这时候我们就要用到泛型来定义,首先定义参数名,等到后期需要调用的时候,在调用的地方重新定义它的数据类型
  • 泛型的使用
  1. 泛型类:顾名思义,就是在定义类的同时,定义一个泛型参数,指明这个类里面的有一种类型是我们泛指的某一种类型
    例子:
public class GeniricClassDemo {
    
    public static void main(String[] args) {
    
        Person<String> p = new Person<>();
        p.setData("今天也一定要努力");
        p.say();
    }
}
/**
 * 泛型类
 */
class Person<A>{
    
    private String name;
    private int age;
    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;
    }

    @Override
    public String toString() {
    
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", data=" + data +
                '}';
    }
    public void say(){
    
        System.out.println(data);
    }
}
  1. 泛型接口:与泛型类基本一致,不过分为两种情况,一种是在继承泛型接口时指定数据类型;另一种是在继承泛型接口时不指定数据类型,但在调用继承类创建对象时指定数据类型
    例子:
/**
* 泛型接口
*/
public interface GenericInterface<T> {
    
    T setData(T t);
}
/**
* 实现类
*/
public class GenericInterfaceDemo {
    
    public static void main(String[] args) {
    
        //1、调用指定数据类型的泛型接口类;
        GeneticInterface01 text01 = new GeneticInterface01();
        text01.setData("今天是个好日子");
        //2、调用泛型继承类
        GenericInterface02<String> text02 = new GenericInterface02<>();
        text02.setData("我今天也很努力呀");
    }
}
//指定数据类型
class GeneticInterface01 implements GenericInterface<String> {
    
    private String text;

    @Override
    public String setData(String text) {
    
        System.out.println(text);
        return text;
    }
}
//不指定数据类型
class GenericInterface02<T> implements GenericInterface<T> {
    
    private T data;

    @Override
    public T setData(T data) {
    
        System.out.println(data);
        return data;
    }
}
  1. 泛型方法:在定义方法时定义泛型,这个泛型的范围只在这个方法内有效
    例子:
public class GenericMethodDemo {
    
    public static void main(String[] args) {
    
        haha("明天会下雨");
    }
    public static <A> void haha(A a){
    
        System.out.println(a);
    }
}
  • 泛型限制类型
    在使用泛型时,可以指定泛型的限定区域,
    例如,泛型只能是某某类的子类,某某接口的实现类,则可以这样写:
<T extends 类或接口1 & 接口2>
  • 泛型的通配符 ——
    类通配符是使用 ? 代替方法具体的类型实参
<? extends Parent> //指定了泛型类型的上届
<? super Child>  //指定了泛型类型的下届
<?>  //指定了没有限制的泛型类型

例子:

public class GenericMethodDemo {
    
    public static void main(String[] args) {
    
        //创建的对象必须是Fruit的子类
        Plate<? extends Fruit> p = new Plate<Apple>();
        //创建的对象必须是Apple的父类
        Plate<? super Apple> m = new Plate<Fruit>();
    }
}

interface Fruit {
    }
class Apple implements Fruit {
    }
class Plate<T> {
    
    T data;
}
  • 作用
  1. 提高代码的复用率
  2. 泛型中的类型在使用时指定,不需要强制类型转换(类型安全,编译器会检查类型)

二、Java Objects类

变量和类型 方法 描述
static int checkFromIndexSize​(int fromIndex, int size, int length) 检查是否在子范围从 fromIndex (包括)到 fromIndex + size (不包括)是范围界限内 0 (包括)到 length (不包括)。
static int checkFromToIndex​(int fromIndex, int toIndex, int length) 检查是否在子范围从 fromIndex (包括)到 toIndex (不包括)是范围界限内 0 (包括)到 length (不包括)。
static int checkIndex​(int index, int length) 检查 index是否在 0 (含)到 length (不包括)范围内。
static < T > int compare​(T a, T b, Comparator<? super T> c) 如果参数相同则返回0,否则返回 c.compare(a, b) 。
static boolean deepEquals​(Object a, Object b) 返回 true如果参数是深层相等,彼此 false其他。
static boolean equals​(Object a, Object b) 返回 true如果参数相等,彼此 false其他。
static int hash​(Object… values) 为一系列输入值生成哈希码。
static int hashCode​(Object o) 返回非的哈希码 null参数,0为 null的论点。
static boolean isNull​(Object obj) 返回 true如果提供的参考是 null ,否则返回 false 。
static boolean nonNull​(Object obj) 返回 true如果提供的参考是非 null否则返回 false 。
static < T > T requireNonNull​(T obj) 检查指定的对象引用是否不是 null 。
static < T > T requireNonNull​(T obj, String message) 检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。
static < T > T requireNonNull​(T obj, Supplier< String > messageSupplier) 检查指定的对象引用是否为null ,如果是,则抛出自定义的NullPointerException 。
static < T > T requireNonNullElse​(T obj, T defaultObj) 如果它是非 null ,则返回第一个参数,否则返回非 null第二个参数。
static < T > T requireNonNullElseGet​(T obj, Supplier<? extends T> supplier) 如果它是非 null ,则返回第一个参数,否则返回非 null值 supplier.get() 。
static String toString​(Object o) 返回调用的结果 toString对于非 null参数, "null"为 null的说法。
static String toString​(Object o, String nullDefault) 如果第一个参数不是 null ,则返回在第一个参数上调用 toString的结果,否则返回第二个参数。

官方的描述文档是这样写的,那应该怎样去使用这些方法呢?举个例子:

    public static void main(String[] args) {
    
        String p = null;
        System.out.println(Objects.requireNonNull(p));
    }

在这里插入图片描述
上面这段小程序我们调用的是 requireNonNull​(T obj, String message) 这个方法,如果我们的 p 为空的话,就会返回指定的异常;如果不为空的话,就会返回 p 的值。其他的方法也可以这样调用,当然,有什么需求,我们就怎么调用。
例如,我们还可以这样玩:

public class ObjectsDemo01 {
    
    public static void main(String[] args) {
    
        Person p = new Person();
        p.setName(null);
        String result = Objects.requireNonNull(p.getName());
        System.out.println(result);
    }
}

class Person {
    
    private String name;

    public String getName() {
    
        return name;
    }

    public void setName(String name) {
    
        this.name = name;
    }
}

三、Java Math类

  • 方法很多,就不像上面那样一一列举了。官方的JDK文档也有相应的介绍。下面就演示一个Java Math类的方法该如何使用。
    我们使用 Math.multiplyExact(int x, int y) 方法,计算两个int 变量的乘积:
public class MathDemo01 {
    
    public static void main(String[] args) {
    
        int x = 10;
        int y = 2;
        int m = Math.multiplyExact(x,y);
        System.out.println(m);
    }
}

毫无疑问,上面输出的结果是20(这种难度的题,我一般口算都算不出来,基本都是借助计算器~)。好啦,这个方法就暂时这样吧,看看下一个难题…

四、Java Arrays类

  • Java Arrays类在开发中也非常的方便,可以快速的对数组进行查找,排序,以及对数组动态扩容。下面就通过代码来演示是如何使用的~
public class ArraysDemo01 {
    
    public static void main(String[] args) {
    
        int[] arr1 = {
    9,1,2,3,4,5,6,7,8};
        System.out.println(Arrays.toString(arr1)); //打印数组内容
        Arrays.sort(arr1); //排序
        System.out.println(Arrays.toString(arr1));
        System.out.println(Arrays.binarySearch(arr1,6)); //  查找数组中的数据
        //数组的动态扩容
        System.out.println(arr1.length); //原数组长度
        arr1 = Arrays.copyOf(arr1,15);
        System.out.println(arr1.length);  //扩容后的数组长度
    }
}
  1. 需要打印数组的内容,我们以前的操作是写一个for循环,遍历打印数组的每个下标对应的值,现在引入了Arrays类,我们只需要调用Arrays.toString()方法,就可以打印数组的内容~
  2. 以前对数组进行排序,常用的方法就是冒泡排序法,现在引入了Arrays类,只需要调用Arrays.sort()方法,就可以快速完成对数组的排序~
  3. 在查找数组中的数据时,我们以前常用的方法时二分查找法,引入Arrays类后,直接调用它的Arrays.binarySearch()方法,就可以简便的查找想要的数据~
  4. 除此之外,Arrays类还提供了对数组进行动态扩容的方法。底层原理是先创建一个指定长度的数组,再将原来的数组进行遍历复制到新的数组中,进而完成数组的动态扩容~~
  5. Arrays类还有很多便捷的方法,在开发中可以适当地运用,提高开发效率~
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zpl547/article/details/119641502

智能推荐

哪个牌子的电视盒子好用?测评60天整理目前最强的电视盒子_最强电视盒子-程序员宅基地

文章浏览阅读864次。创维π盒的外观一改之前创维机顶盒的圆润风格,采用了棱角分明的深色调配色,塑料及小巧的机身,承袭了创维一贯以来的优秀品质,磨砂材质的工艺也起到了一定的“杜绝指纹”作用,机身虽然小巧,但是产品本身却有一定的重量,不会像市面上的劣质机顶盒,接上稍硬一些的线材就被拖着到处晃。和大家说说这款盒子的硬件配置。泰捷的视频播放能力十分强悍,高清的4K画质可以实现秒速切换,加上无广告的视频体验,连续播放一整天都没有卡顿存在,得益于泰捷有六大核心视频技术加持,无论是WiFi还是网线连接,泰捷都可以做到流畅播放,用久不卡。_最强电视盒子

JS屏蔽右键菜单和禁止刷新F5_怎么关掉右键的刷新功能-程序员宅基地

文章浏览阅读8.5k次。在某些特殊网页上面,我们不想让用户刷新或者点出右键菜单来,要达到这个功能需要添加一定的javascript代码才能做到,思路:判断用户点击的是哪个按键keycode,从而屏蔽这些按键的功能。但是IE和FF中的event不一样,要经过浏览器判断,包括e.keycode,FF中用的是e.which,经过这些分析后,就能完成禁止某些按钮功能的作用,下面是实例代码://禁止按键F5document_怎么关掉右键的刷新功能

Hadoop HA——hdfs haadmin 详解_warn ha.haadmin: proceeding with manual ha state m-程序员宅基地

文章浏览阅读7.2k次,点赞4次,收藏16次。NameNode切换 Hadoop版本:hadoop-2.6.0-CDH5.5.4 namenode切换需要用到hdfs haadmin 命令,该命令有如下方法: hdfs haadmin -transitionToActive &lt;serviceId&gt; 将&lt;serviceId&gt;namenode过渡到active状态当前状态: nn1:s..._warn ha.haadmin: proceeding with manual ha state management even though auto

程序员职业思维导图_程序员职业的思维导图-程序员宅基地

文章浏览阅读2.8k次,点赞4次,收藏10次。大家好:从本次博客开始为了对应AC项目我要准备程序员的职业思维导图啦 这是个人整理的会慢慢持续更新的呀,深感路漫漫其修远兮我将上下而求索..._程序员职业的思维导图

java增删改查代码_低代码开发平台-程序员宅基地

文章浏览阅读662次。Question世界上有没有这种类型的软件开发项目?可以做到:对客户来说,可以让想法快速变成系统,几天内即可投入使用,产生价值。对老板来说,可以以最低的成本获得最大的利益。对程序员来说,可以不用996,扔掉生发剂,拥抱新生活。从面向企业级应用的开发领域来说,如果有,也只能是基于一些低代码开发平台(LCAP:low code application platform),来实现系统开发这一条..._低代码平台 动态新增删除字段

java第四次作业-程序员宅基地

文章浏览阅读64次。package Text;public class One1 { public static void main(String[] args) { int a[] = {16,25,9,90,23}; int temp = 0; for (int i = 0;i < a.length - 1; i++){ for (int j = 0;j < a.length - 1 -i;j++){

随便推点

uniapp打包h5提示DCloud APPID非当前账号所有 怎么办?_此应用 dcloud appid 非当前账号所有,请联系应用所有者 (即此appid的创建者)设置-程序员宅基地

文章浏览阅读3.1k次。在hbuilderX启动拷贝下来的项目的时候uniapp云端打包提示:“DCloud APPID非当前账号所有,请联系应用所有者设置此账号为协作者,或重新生成APPID后打包”解决办法:重新获取一下manifest.json里的云端获取..._此应用 dcloud appid 非当前账号所有,请联系应用所有者 (即此appid的创建者)设置

python安装第三方哭出现Microsoft Visual C++ 14.0 is required 的解决方案_python第三方包安装时报错:microsoft visual c++ 14.0 is requi-程序员宅基地

文章浏览阅读472次。由于windows开发经常出现这个问题,真是令人讨厌,于是得想个法子,干他娘的一炮,以绝后患,二营长,老子的意大利炮呢!以安装scrapy为例:如:pip install scrapy 时出现:error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http:/..._python第三方包安装时报错:microsoft visual c++ 14.0 is required

C语言根据概率随机抽奖,【图片】红蓝球概率问题,通过程序模拟抽取,计算结果已出,有兴趣来看【非现役文职吧】_百度贴吧...-程序员宅基地

文章浏览阅读235次。该楼层疑似违规已被系统折叠隐藏此楼查看此楼我用的c语言,大一学的还没忘完。。。。程序非常简单,就是生成随机数,然后根据随机数的结果进行计数就好了。代码贴下面,有兴趣的可以看看。懂行的请不要喷我写的烂。。。。。毕竟不是专业码农。#include#include#includeint main(){srand((unsigned)time(NULL));int count1=0,count2=0,c..._红蓝球概率问题

BZOJ 4562: [Haoi2016]食物链【拓扑】-程序员宅基地

文章浏览阅读97次。4562: [Haoi2016]食物链【题目描述】 传送门【题解】 简单的拓扑,但是单点不算食物链。代码如下#include<cstdio>#include<cctype>#include<queue>#define MAXN 100005#define MAXE ...

ESP8266EX资料-程序员宅基地

文章浏览阅读760次。https://github.com/esp8266/Arduinohttp://espressif.com/zh-hans/support/explore/faq电路资料图如下:介绍功能:参数引脚引脚定义电路flash:”转载于:https://w...

ATM-程序员宅基地

文章浏览阅读62次。