Java学习之路 —— API篇

文章目录

  • 前言
  • Object类
  • 2. Objects类
  • 3. 包装类
  • 4. StringBuilder和StringBuffer
  • 5. StringJoiner
  • 6. Math
  • 7. System
  • 8. JDK8开始新增的日期、时间
  • 9. Arrays
  • 10. Lambda表达式
  • 11. 方法引用

前言

其实转语言来说,语法都比较简单,花个三天就会了,但最主要的是熟悉各种API,比如用惯了C++的STL,再来学新的API,就会觉得很不习惯,就拿vector和ArrayList来说,vector就可以直接[]访问,但是Java没有提供操作符重载,就只能用函数来获取了,怪不习惯的。这就好比你之前都是在学一门语言的语法,但是更费时的是去背单词,而往往一门语言学的好不好就是看会的单词多不多。这个比喻不知道恰不恰当,哈哈哈~

接下来Java的学习,就是去熟悉各种常用的API了,我目前能想到的主要有各种数据结构、网络IO、多线程同步互斥、文件等等,把这些都写一遍,才算是初步熟悉Java了吧,然后再去学各种框架。在学习的时候,我也会时常去和C++的一些API做对比的,方便自己和读者们理解。

Object类

Object类是Java中所有类的祖宗类,因此,Java中所有类的对象都可以直接使用Object类中提供的一些方法。
在这里插入图片描述
toStringequals是可以在类中进行重写的,而clone会调用父类Object中的clone方法,并且需要在类中表明Cloneable才行。

package api_object;

import java.util.Objects;

// Cloneable是一个标记接口
// 规则

public class Student implements Cloneable{
    private String name;
    private int age;
    private int[] scores;

    public Student() {}
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        this.scores = new int[2];
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        // super去调用父类Object中的clone方法
        Student s2 = (Student) super.clone();
        s2.scores = s2.scores.clone();

        return s2;
    }

    public int[] getScores() {
        return scores;
    }

    public void setScores(int[] scores) {
        this.scores = scores;
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    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;
    }
}

深克隆和浅克隆
我们知道java的数据类型分为引用类型和值类型,因此就有了浅克隆和深克隆一说。

对于浅克隆而言,一方数据改变后,另一方数据也会跟着变化
对于深克隆而言,原型对象和克隆对象之间没有任何关联,指向不同的地址。

  • 浅克隆就是地址用同一块(引用类型拷贝的只是地址)
  • 深克隆
    • 对象中基本类型的数据直接拷贝
    • 对象中的字符串数据拷贝的还是地址(存放在字符串常量池)
    • 对象中还包含的其他对象,不会拷贝地址,会创建新对象

所以为了实现深克隆,就需要对对象进行递归克隆,clone中嵌套clone:首先让源对象调用克隆方法获得克隆的对象,然后获得被克隆对象的引用类型的成员变量对象,对该成员变量对象调用克隆方法,此时成员变量对象也被克隆了一份,最后将该克隆的成员变量对象,设置为克隆对象的新的成员变量,再返回该被克隆的对象,即可实现深克隆。

2. Objects类

该类中都是些static方法,且是final类,用于操作对象或操作前检查某些条件。
在这里插入图片描述
对于equals来说,为什么不用对象自己的equals方法,就是为了防止空指针报错,所以官方更推荐Objects的equals方法。
在这里插入图片描述

3. 包装类

Java万物皆对象,所以对于基本类型来说,也包装成了对应的类。(String已经包装过了)

对于包装类来说,主要是为了模板和各种API的使用。
在这里插入图片描述
拿Integer来说

Integer i = Integer.valueOf(7);
Integer j = 7;  // 自动装箱
        
int p = i;  // 自动拆箱

当然还有一些包装类的常见操作,比如:

  • 把基本类型的数据转换成字符串类型(对应C++的to_string()
    public static String toString(double d)
  • 把字符串类型的数值转换成数值本身对应的数据类型(对应C++的stoi()
    public static int parseInt(String s)
    public static Integer valueOf(String s)(最推荐这个)

当然,还可以这样操作:Integer a = 23; String s = a + ""

4. StringBuilder和StringBuffer

相当于一个容器,这个类在String的基础上,提供了更多的一些方法做修改,效率会更高,代码会更简洁。

StringBuilder就相当于是C++的string了,是一个动态可变字符串,而Java原本的String是不可变的,修改效率非常地下

在这里插入图片描述
而StringBuilder和StringBuffer的用法一模一样,但是StringBuilder是线程不安全的,StringBuffer是线程安全的。

5. StringJoiner

这个类是JDK8才有的,和StringBuilder一样,也是个容器。

好处:不仅能提高字符串的操作效率,并在一些场景下使用它操作字符串,代码会更简洁。
在这里插入图片描述
C++能有这玩意儿?这个是真的牛啊!!!

6. Math

在这里插入图片描述

7. System

System代表程序所在的系统,也是一个工具类
在这里插入图片描述

8. JDK8开始新增的日期、时间

  • JDK8之后的时间API设计更合理,功能丰富,使用方便
  • 都是不可变对象,修改后会返回新的时间对象,不会丢失最开始的时间
  • 线程安全
  • 能精确到毫秒、纳秒

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

9. Arrays

在这里插入图片描述
或许用得最多的是最后一个数组排序,算法题可能用的比较多吧。

关于这个自定义排序,和C++有点不同。Java官方的约定是:

  • 如果认为左边大于右边,则返回正数
  • 如果认为左边小于右边,则返回负数
  • 如果相等,则返回0

根据这样,得到的是升序,那么在代码的体现最直接了当的就是o1 > o2即可。然而C++确是o1 < o2,注意区分。

10. Lambda表达式

作用:用于简化匿名内部类的代码写法

格式

(被重写方法的形参列表)->{
	被重写方法的方法体代码。
}

对比下C++的匿名函数

[](形参列表) {
	代码。
}
  • lambda只能简化函数式接口的匿名内部类(接口、有且仅有一个抽象方法)!!!
  • 我们见到的大部分函数式接口,上面都可能会有一个@FunctionalInterface的注解,有该注解的接口必定是函数式接口

省略写法

  • 参数类型可以不写
  • 如果只有一个参数,参数类型可以省略,同时()也可以省略
  • 如果Lambda中的方法体代码只有一行代码,可以省略大括号,同时要省略分号!如果这行代码是return,也必须去掉return不写
int[] nums = new int[]{123, 321, 153};
        Arrays.setAll(nums, value -> nums[value]*2);
        for (int num : nums) {
            System.out.println(num);
        }

11. 方法引用

  • 静态方法引用
    类名::静态方法
    如果某个Lambda表达式只是调用一个静态方法,并且前后参数的形式一致,就可以使用静态方法引用。

  • 实例方法引用
    对象名::实例方法
    如果某个Lambda表达式只是调用一个实例方法,并且前后参数的形式一致,就可以使用实例方法引用。

  • 特定类型方法的引用
    类型::方法
    如果某个Lambda表达式里只是调用一个实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该实例方法的入参的,则此时可以使用特定类型的方法引用。

  • 构造器引用
    类名::new
    如果某个Lambda表达式只是在创建对象,并且前后参数情况一致,就可以使用构造器引用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【luckfox】2、添加lcd spi屏st7735和gc9306

前言 本章使用fbtft添加spi lcd st7735/gc9306。 fbtft生成fb0设备&#xff0c;后续通过lvgl可以实现自定义界面绘制。 代码参考 https://gitee.com/openLuat/LuatOS/blob/master/components/lcd/luat_lcd_gc9306x.c 硬件是合宙的&#xff0c;合宙esp32有支持&#xff0c;仿…

Mistral 7B 比Llama 2更好的开源大模型 (二)

Mistral 7B 论文学习 Mistral 7B 论文链接 https://arxiv.org/abs/2310.06825 代码: https://github.com/mistralai/mistral-src 网站: https://mistral.ai/news/announcing-mistral-7b/ 论文摘要 Mistral 7B是一个70亿参数的语言模型,旨在获得卓越的性能和效率。Mistral 7…

外汇天眼:你的交易技术分析,为什么不赚钱?

众所周知&#xff0c;交易圈分为两个派别&#xff0c;一个是基本面分析派&#xff0c;另外一个就是技术分析派。 无论哪个派别都有成功的案例。 今天我们主要来说一下技术分析&#xff0c;市场中&#xff0c;用技术分析来做交易的人有很多&#xff0c;但并不是人人都赚钱&#…

SELF-AUGMENTED MULTI-MODAL FEATURE EMBEDDING

two embeddings f o r g _{org} org​ and f a u g _{aug} aug​ are combined using a gating mechanism 作者未提供代码

RT-Thread系列10——ETH网口设备

文章目录 1. ETH测试第一步&#xff1a;cubemx配置。第二步&#xff1a;board.h配置。第三步&#xff1a;rtthread settings配置第四步&#xff1a;以太网复位引脚设置第五步&#xff1a;修改rtthread源码第六步&#xff1a;修改 cubemx 生成的 main 函数第七步&#xff1a;编译…

救命!这套性能测试的实践痛点和解决方法真的绝了

昨天有同学找我咨询了一个性能测试相关的问题&#xff0c;他说&#xff1a; 他们公司的性能测试实践目前基本成为了形式主义&#xff0c;除了版本迭代时候的单系统单接口压测&#xff0c;没有其他亮点&#xff0c;领导也不重视。想做一些异常测试和高可用测试&#xff0c;体现自…

C++ builder 常见问题汇总

1、CB静态编译设置 2、CB10.3设置经典编译器&#xff08;用于解决10.3弹出代码提示慢&#xff09; 3、CBuilder生成Release版本 &#xff1a; project->Options->CCompiler->Build Configuration 选择 Release project->Options->CLinker中取消Use dynamic RTL…

PP-YOLO: An Effective and Efficient Implementation of Object Detector(2020.8)

文章目录 Abstract1. Introduction先介绍了一堆前人的work自己的workexpect 2. Related Work先介绍别人的work与我们的区别 3.Method3.1. ArchitectureBackboneDetection NeckDetection Head 3.2. Selection of TricksLarger Batch SizeEMADropBlockIoULossIoU AwareGrid Sensi…

python 随机密码生成器

最近在研究PySimpleGUI库&#xff0c;把之前写的一个随机密码生成器改成GUI版本发出来&#xff0c;有兴趣的兄弟们可以拿走。 因为能力有限&#xff0c;目前只能写生成一个随机密码的Gui版本&#xff0c;等我学了更多的内容再慢慢完善。 核心代码很简单&#xff0c;界面也很粗陋…

2023年华为杯数学建模E题——代码复盘(第一问)

2023年华为杯数学建模E题 代码复盘 写在最前面目录问题1a计算时间间隔思路说明代码输出结果 插值求解思路代码输出结果 绘图绘制3D图&#xff08;待修改&#xff09; 问题1b数据预处理思路代码 模型训练思路代码输出结果网格调参代码输出结果 写在最前面 超开心又有点遗憾 结果…

Vue3 watch监视和watchEffect函数

Vue3 中的watch使用效果和Vue2 中配置watch配置项的使用效果是一致的。 使用watch监视之前&#xff0c;需要先对watch进行引入。 import {watch} from vue; 一、监视一个ref对象 以下情况只适用于监视一个ref对象。 watch(监视对象, (newValue, oldValue) > { // 监视操作…

使用清华智谱ChatGLM2大模型搭建本地私有知识库

首先放上该方案项目的git地址&#xff1a;https://github.com/chatchat-space/Langchain-Chatchat 以下是我的搭建和踩坑经验记录 一、环境准备 1、python安装 在环境中安装python&#xff0c;我安装的是3.9版本的python&#xff0c;官方要求的是Python 3.8 - 3.10 版本。不知…

Java学习之路 —— Day1(环境配置、变量)

文章目录 前言1. 搭建Java开发环境1.1 下载java1.2 JDK组成1.3 使用idea开发 2. java基本语法2.1 变量类型2.2 Scanner输入2.3 随机数2.4 数组 前言 已经好久没有写博客了&#xff0c;打开这个网站有一种熟悉又陌生的感觉。 前段时间一直在准备秋招&#xff0c;现在也告一段落…

【C++代码】最接近的三数之和,括号生成,合并两个有序链表,合并 K 个升序链表

题目&#xff1a;最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字符串 ""。 class Solution { public:string longestCommonPrefix(vector<string>& strs) {string res"";int index 0; f…

专题知识点-二叉树-(非常有意义的一篇文章)

这里写目录标题 二叉树的基础知识知识点一(二叉树性质 )树与二叉树的相互转换二叉树的遍历层次优先遍历树的深度和广度优先遍历中序线索二叉树二叉树相关遍历代码顺序存储和链式存储二叉树的遍历二叉树的相关例题左右两边表达式求值求树的深度找数找第k个数二叉树非递归遍历代码…

Swift 警惕“隐式异步(implicitly asynchronous)”方法的执行陷阱

概览 actor 是 Swift 5.5 中一个“不可思议”的新类型&#xff0c;可以把它看做成一个数据同步器。actor 中所有属性和方法都会被自动“串行”&#xff08;serializes&#xff09;访问和执行&#xff0c;从而有效避免了数据竞争的发生。 不过&#xff0c;在一些微妙的情境下使…

笔记51:循环神经网络入门

本地笔记地址&#xff1a;D:\work_file\DeepLearning_Learning\03_个人笔记\3.循环神经网络\循环神经网络 a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a a

29.第三方登录

1►第三方登录 当今社会&#xff0c;微信登录、QQ登录、抖音登录等等三方登录已经层出不穷&#xff0c;学会三方登录势在必行。 微信登录要认证开发者&#xff0c;必须为企业&#xff0c;个人不行&#xff0c;而且还要交300块钱。 QQ登录也要申请、微博登录也要申请。 还好…

ppt画思路图 流程图 医学药学生画图素材

关注微信&#xff0c;回复: 素材 &#xff0c;即可领取

基于 React 的 HT for Web ,由厦门图扑团队开发和维护 - 用于 2D/3D 图形渲染和交互

本心、输入输出、结果 文章目录 基于 React 的 HT for Web &#xff0c;由厦门图扑团队开发和维护 - 用于 2D/3D 图形渲染和交互前言什么是 HT for WebHT for Web 的特点如何使用 HT for Web相关链接弘扬爱国精神 基于 React 的 HT for Web &#xff0c;由厦门图扑团队开发和维…