Java 基础知识点 笔记总结
Posted IT_Holmes
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 基础知识点 笔记总结相关的知识,希望对你有一定的参考价值。
文章目录
- 1. 泛型 定义
- 2. 泛型 的小细节
- 3. 泛型 自定义泛型
- 4. 泛型 自定义泛型注意点
- 5. 泛型方法
- 6. 泛型 继承注意点
- 7. 泛型 通配符?
- 8. 泛型 有限制条件的通配符?
- 9. File类
- 10. IO 流
- 11. IO流 体系对象
- 12. IO流 的使用
- 13. 缓冲流 的使用
- 14. 转换流 InputStreamReader 和 OutputStreamWriter
- 15. 多个字符编码集
- 16. system.in的相关介绍
- 17. 打印流
- 18. 数据流
- 19. 对象序列化 和 transient关键字
- 20. 对象流
- 21. 随机存取文件流
- 22. Java NIO 概述
- 23. 第三方jar包 commons-io jar包
- 24. UDP网络通信
1. 泛型 定义
泛型(Generic),泛型整体上的功能就和生活中的标签一样。
集合容器类在设计声明阶段不能确定这个容器到底是一个什么样的类型对象?因此在jdk1.5之后就有了泛型来解决这种类似的问题。
像Collection<E> , List<E> , ArrayList<E> 等等,这种把元素的类型设置成一个参数(就是<E>) ,这个参数<E>就是泛型。
在jdk1.5之前,没有泛型的时候,我们通过Object和强转的方式来进行操作,如下:
2. 泛型 的小细节
JDK7 新特性之一:
Map<String,Integer> map = new HashMap<>();
后面可以省略<String,Integer>。
实现继承后的泛型定义:
3. 泛型 自定义泛型
像泛型中例如:下面的Person<T> 或 Person<E> ,作用就是接受任意的类型,当然我们在创建实例,继承对象,实现接口时,可以定义只能是什么类型。
例如继承效果:
class Human extends Person<Integer>
这样就非常方便操作了。
package com.itholmes.generic;
public class Human
public static void main(String[] args)
//通过泛型可以随便设置属性的类型
Person p = new Person();
p.setPerson("zhangsan");
p.setPerson(123);
//也可以预先指定泛型,下面就是默认第三个参数T就是字符串类型
Person p2 = new Person<String>();
p2.setPerson("zhangsan");
class Person<T>
String name;
int id;
//可以像这样来声明类型对象的对象
T person;
public Person(String name, int id, T person)
super();
this.name = name;
this.id = id;
this.person = person;
public T getPerson()
return person;
public void setPerson(T person)
this.person = person;
public Person()
super();
4. 泛型 自定义泛型注意点
注意点1:
- 泛型类是可以有多个参数一起放到<>中的。
注意点2:
-
泛型类的构造器不要加上<T>之类的东西,不需要的!
注意点3: -
泛型不同的引用不能相互赋值!
注意点4:
- 静态方法中不能使用类的泛型!
这也好理解,静态是伴随类加载而加载,我们指定了泛型后<T>它不知道要用谁去,这就不合理。
注意点5:
- 异常类不能是泛型的。
我们使用try-catch抛出的异常类型,不能是泛型的!
注意点6:
- new T[];创建泛型数组是不可以的!!但是我们可以通过下面方式来进行:
//我们可以通过下面这种方式来创建T类型的数组。
T[] a = (T[])new Object[10];
5. 泛型方法
先说一个误区,不是方法中使用了泛型,我们叫他泛型方法,并不是!
那么,泛型方法是什么呢?
注意,泛型方法中可以使用static,原因也很简单,就是我们的类型在调用该 [静态泛型方法] 之前已经确定了和 [上面的使用泛型参数但不能使用staitc的方法 ]不同!
简而言之,泛型参数T是在调用方法时确定的,并非在实例化类时确定,因此才可以声明成为static静态的。
6. 泛型 继承注意点
不能随意赋值,其二两者属于并列关系:
这种泛型类型相同,并且由子父类多态效果这样可以赋值!
7. 泛型 通配符?
泛型的通配符: ?
类A是类B的父类,G<A>和G<B> 是没有关系的,二者共同的父类是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 <E> void main(String[] args)
ArrayList<Baoma> list = new ArrayList<>();
list.add(new Baoma());
list.add(new Baoma());
list.add(new Baoma());
list.add(new Baoma());
contest(list);
ArrayList<Benchi> list2 = new ArrayList<>();
list2.add(new Benchi());
list2.add(new Benchi());
list2.add(new Benchi());
list2.add(new Benchi());
contest(list2);
// 下面方法我们使用了上界通配符
// 因此我们的Dog对象不能使用的!
ArrayList<Dog> 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类的函数方法,以后慢慢熟知。
24. UDP网络通信
UDP数据包通过数据包套接字DatagramSocket发送和接受。
中间还会用到DatagramPacket来使用。
了解。
以上是关于Java 基础知识点 笔记总结的主要内容,如果未能解决你的问题,请参考以下文章