Java 基础知识点 笔记总结 (十)

  • new T[];创建泛型数组是不可以的!!但是我们可以通过下面方式来进行:

//我们可以通过下面这种方式来创建T类型的数组。

T[] a = (T[])new Object[10];

5. 泛型方法

=====================================================================


先说一个误区,不是方法中使用了泛型,我们叫他泛型方法,并不是!

在这里插入图片描述


那么,泛型方法是什么呢?

在这里插入图片描述

注意,泛型方法中可以使用static,原因也很简单,就是我们的类型在调用该 [静态泛型方法] 之前已经确定了和 [上面的使用泛型参数但不能使用staitc的方法 ]不同!

简而言之,泛型参数T是在调用方法时确定的,并非在实例化类时确定,因此才可以声明成为static静态的。

在这里插入图片描述

6. 泛型 继承注意点

=========================================================================


在这里插入图片描述

不能随意赋值,其二两者属于并列关系:

在这里插入图片描述


这种泛型类型相同,并且由子父类多态效果这样可以赋值!

在这里插入图片描述

7. 泛型 通配符?

========================================================================


泛型的通配符: ?

类A是类B的父类,G和G 是没有关系的,二者共同的父类是G<?>。

因此,我们可以通过通配符来赋值:

在这里插入图片描述


但是对于List<?>是不能向其内部添加数据的,话句话说不能调用add方法,但除了list.add(null)之外。

在这里插入图片描述

8. 泛型 有限制条件的通配符?

==============================================================================


<? extends Person>:可以理解为小于等于Object类型,就是只能接受Object和Object子类。也叫做上界通配符

<? super Person>:可以理解为大于等于Object类型,就是只能接受Object和Object的父类。也叫做下界通配符。

下面举例来看:

import java.util.ArrayList;

public class Person {

public static void main(String[] args) {

ArrayList list = new ArrayList<>();

list.add(new Baoma());

list.add(new Baoma());

list.add(new Baoma());

list.add(new Baoma());

contest(list);

ArrayList list2 = new ArrayList<>();

list2.add(new Benchi());

list2.add(new Benchi());

list2.add(new Benchi());

list2.add(new Benchi());

contest(list2);

// 下面方法我们使用了上界通配符

// 因此我们的Dog对象不能使用的!

ArrayList list3 = new ArrayList<>();

list3.add(new Dog());

list3.add(new Dog());

// contest(list3); // 报错!

}

public static void contest(ArrayList<? extends Car> car) {

System.out.println(car);

}

}

class Dog {

}

class Baoma extends Car {

}

class Benchi extends Car {

}

class Car {

}

9. File类

======================================================================

9.1 File类的使用



file类注意好路径设置,window下和unix下路径设置不同。

在这里插入图片描述

三个构造器的设置。构造器看源码就能理解。

在这里插入图片描述

9.2 file类的常用方法



在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

9.3 file类 总结



总结:

  • File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)。

  • File类声明在java.io包下。

  • File类中涉及到关于文件或文件目录的创建,删除,重命名,修改时间,文件大小等方法,并没有涉及到写入或读取文件内容的操作,如果读取写入文件需要io操作完成(将file对象作为参数)。

10. IO 流

======================================================================


流,按照数据单位不同,分为:字节流(8个bit)和字符流(16个bit) 。

1个字节是8个比特,一个字符是2个字节。

按照数据流的流向不同分为:输入流 , 输出流。

在这里插入图片描述

11. IO流 体系对象

==========================================================================


其实,整个体系都是从inputStream , OutputStream , Reader , Writer。这四个衍生出来的。效果都差不多,就是对应不同的流而已。

在这里插入图片描述

12. IO流 的使用

=========================================================================

12.1 IO的 读操作



读操作的关键就是理解好char[] 或 byte[] 数组 和 read方法 的作用!

(字节流就对应byte[] , 字符流就对应char[] )

在这里插入图片描述

12.1 IO的 写操作



在这里插入图片描述

注意:字符流不能来处理图片这种字节数据!处理图片等字节数据要使用字节流来处理。

总结起来:

  • 对于文本文件(.txt ,.java ,.c , .cpp等),使用字符流处理。

  • 对于非文本文件(.jpg , .mp3 , .mp4 , avi , .doc , .ppt等)使用字节流处理。

13. 缓冲流 的使用

=========================================================================


缓冲流的字节字符流:BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter。

缓冲流的作用就是:提升流的读取,写入的速度。

在这里插入图片描述

缓冲流中间可能嵌套这一个flush()的方法,该方法就是刷新缓冲区,将缓冲区数据清空,将数据写入。

此外,上面的while循环判断表达式中,有些流可以用readLine()的方法来判断。

14. 转换流 InputStreamReader 和 OutputStreamWriter

============================================================================================================


InputStreamReader :将一个字节的输入流转为字符的输入流。

OutputStreamWriter:将一个字符的输出流转为字节的输出流。。

因此像InputStreamReader或者OutputStreamWriter一般都是需要传入参数的。

第一个参数:流对象,第二个参数:设定字符集。

在这里插入图片描述

15. 多个字符编码集

=========================================================================


在这里插入图片描述

上面这些字符集的关系可以见下图判别:

在这里插入图片描述

(ANSI是美国国家标椎学会简称。)

16. system.in的相关介绍

================================================================================


在这里插入图片描述

17. 打印流

=====================================================================


记住一点,使用输出的是字符串形式。

在这里插入图片描述

18. 数据流

=====================================================================


在这里插入图片描述

19. 对象序列化 和 transient关键字

======================================================================================


Java的对象序列化:指的是将对象转换成以字节序列形式来表示。

这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,也可用于网络传输,一般当我们使用缓存cache(内存空间不够有可能会本地存储到硬盘)或远程调用rpc(网络传输)的时候,经常需要让我们的实体类实现Serializable接口,目的就是为了让其可序列化。

当然,序列化后的最终目的是为了反序列化,恢复成原先的Java对象,要不然序列化后干嘛呢,所以序列化后的字节序列都是可以恢复成Java对象的,这个过程就是反序列化。


Java中transient关键字的作用,简单地说,就是让某些被修饰的成员属性变量不被序列化。

理解好,序列化和不被序列化就行。

注意:如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的,为了实现可序列化,该类必须实现如下接口中的一个: Serializable 和 Externalizable ,另外还要设置一个long常量serialVersionUID。

序列化和反序列化,有两种情况一种是看网络中的流数据还原到内存,还有一种是磁盘文件中的对象还原到内存中。

20. 对象流

=====================================================================


在这里插入图片描述

对象流对应的实例类必须要序列化。

对于private static final long serivalVersionUID的相关解释:

在这里插入图片描述

序列化前提总结:

  • 实现接口Serializable。

  • 提供一个全局常量serialVersionUID。

  • 除了当前类需要实现Serializable,如果还有其他内部类或者属性必须也要实现序列化。

  • ObjectOutputStream 和 ObjectInputStream不能序列化static和transient修饰的成员变量。

不过现在网络间传输对象不需要序列化传输了,通常我们用JSON来传输数据。

21. 随机存取文件流

=========================================================================


RandomAccessFile类:

在这里插入图片描述

在这里插入图片描述

seek()方法使用,指针角标位置。

在这里插入图片描述

常用于下载或上传的断点时使用:

在这里插入图片描述

22. Java NIO 概述

=============================================================================


NIO版本有NIO和NIO.2版本,NO.2版本要比NIO版本好的多。

在这里插入图片描述

了解就好。


在NIO.2有一个Path接口,它可以看做File类的升级版本。

在这里插入图片描述


Path path = Paths.get(url);该方法要知道。对应的path方法如下:

在这里插入图片描述

path和 file对象可以相互转换的:

在这里插入图片描述


此外,还有java.nio.file.Files,用于操作文件或目录的工具类,这个也要了解。它比file类比起来多了一下操作文件的方法,

23. 第三方jar包 commons-io jar包

=========================================================================================


commons-io包,有很多用处,有些时候的一些包会依赖它,开发也经常用到,里面有个FileUtils该类有很多能够操作file类的函数方法,以后慢慢熟知。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!


commons-io包,有很多用处,有些时候的一些包会依赖它,开发也经常用到,里面有个FileUtils该类有很多能够操作file类的函数方法,以后慢慢熟知。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-ekf2RVEs-1715704631087)]

[外链图片转存中…(img-VTAPpwhS-1715704631087)]

[外链图片转存中…(img-Qib2Ehay-1715704631088)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值