学习分享,共勉
这里是小编拿到的学习资源,其中包括“中高级Java开发面试高频考点题笔记300道.pdf”和“Java核心知识体系笔记.pdf”文件分享,内容丰富,囊括了JVM、锁、并发、Java反射、Spring原理、微服务、Zookeeper、数据库、数据结构等大量知识点。同时还有Java进阶学习的知识笔记脑图(内含大量学习笔记)!
资料整理不易,读者朋友可以转发分享下!
Java核心知识体系笔记.pdf
中高级Java开发面试高频考点题笔记300道.pdf
架构进阶面试专题及架构学习笔记脑图
Java架构进阶学习视频分享
-
20. 对象流
-
21. 随机存取文件流
-
22. Java NIO 概述
-
23. 第三方jar包 commons-io jar包
-
24. UDP网络通信
======================================================================
泛型(Generic),泛型整体上的功能就和生活中的标签一样。
集合容器类在设计声明阶段不能确定这个容器到底是一个什么样的类型对象?因此在jdk1.5之后就有了泛型来解决这种类似的问题。
像Collection , List , ArrayList 等等,这种把元素的类型设置成一个参数(就是) ,这个参数就是泛型。
在jdk1.5之前,没有泛型的时候,我们通过Object和强转的方式来进行操作,如下:
========================================================================
JDK7 新特性之一:
Map<String,Integer> map = new HashMap<>();
后面可以省略<String,Integer>。
实现继承后的泛型定义:
=========================================================================
像泛型中例如:下面的Person 或 Person ,作用就是接受任意的类型,当然我们在创建实例,继承对象,实现接口时,可以定义只能是什么类型。
例如继承效果:
class Human extends Person{}
这样就非常方便操作了。
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();
p2.setPerson(“zhangsan”);
}
}
class Person{
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();
}
}
============================================================================
注意点1:
- 泛型类是可以有多个参数一起放到<>中的。
注意点2:
- 泛型类的构造器不要加上之类的东西,不需要的!
注意点3:
- 泛型不同的引用不能相互赋值!
注意点4:
- 静态方法中不能使用类的泛型!
这也好理解,静态是伴随类加载而加载,我们指定了泛型后它不知道要用谁去,这就不合理。
注意点5:
- 异常类不能是泛型的。
我们使用try-catch抛出的异常类型,不能是泛型的!
注意点6:
- new T[];创建泛型数组是不可以的!!但是我们可以通过下面方式来进行:
//我们可以通过下面这种方式来创建T类型的数组。
T[] a = (T[])new Object[10];
=====================================================================
先说一个误区,不是方法中使用了泛型,我们叫他泛型方法,并不是!
那么,泛型方法是什么呢?
注意,泛型方法中可以使用static,原因也很简单,就是我们的类型在调用该 [静态泛型方法] 之前已经确定了和 [上面的使用泛型参数但不能使用staitc的方法 ]不同!
简而言之,泛型参数T是在调用方法时确定的,并非在实例化类时确定,因此才可以声明成为static静态的。
=========================================================================
不能随意赋值,其二两者属于并列关系:
这种泛型类型相同,并且由子父类多态效果这样可以赋值!
========================================================================
泛型的通配符: ?
类A是类B的父类,G和G 是没有关系的,二者共同的父类是G<?>。
因此,我们可以通过通配符来赋值:
但是对于List<?>是不能向其内部添加数据的,话句话说不能调用add方法,但除了list.add(null)之外。
==============================================================================
<? 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 {
}
======================================================================
file类注意好路径设置,window下和unix下路径设置不同。
三个构造器的设置。构造器看源码就能理解。
总结:
-
File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)。
-
File类声明在java.io包下。
-
File类中涉及到关于文件或文件目录的创建,删除,重命名,修改时间,文件大小等方法,并没有涉及到写入或读取文件内容的操作,如果读取写入文件需要io操作完成(将file对象作为参数)。
======================================================================
流,按照数据单位不同,分为:字节流(8个bit)和字符流(16个bit) 。
1个字节是8个比特,一个字符是2个字节。
按照数据流的流向不同分为:输入流 , 输出流。
==========================================================================
其实,整个体系都是从inputStream , OutputStream , Reader , Writer。这四个衍生出来的。效果都差不多,就是对应不同的流而已。
=========================================================================
最后
按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。
学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。
“道路是曲折的,前途是光明的!”
=====================================
最后
按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。
学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。
“道路是曲折的,前途是光明的!”
[外链图片转存中…(img-9MRFbiT6-1715629610733)]
[外链图片转存中…(img-SxHbHfpe-1715629610734)]