一、数据类型
1.1 类型
- int
- double
- float
css
float b = 2f;//float数据类型必须加f
- String
- boolean
- 数组
less
//初始方式一
int []a = {1,2,3}
//初始方式二
int []a = new int[3]
1.2 强制转换
java强制转换通过(type)a实现
ini
float a = 1.23f;
int b = (int)a;
二、输入、输出
2.1 输出
2.1.1 字符串
csharp
System.out.println("abc");//换行
System.out.print("abc");
2.1.2 格式化输出
arduino
System.out.printf("abc%ddef",123);//abc123def
2.2 输入
2.2.1 非字符串类型输入
ini
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
double b = scanner.nextDouble();
2.2.2 字符串输入
next()与nextLine()
next遇到空格或回车结,而nextLine一次读取一行,遇到回车结束。nextLine与其它类型输入混用时需要吸收回车
案例一:纯nextLine输入:输入1\n2\n
ini
String a,b;
Scanner scanner = new Scanner(System.in);
a = scanner.nextLine();
b = scanner.nextLine();
System.out.println(a);//1
System.out.println(b);//2
案例二:nextLine与其它输入混合:输入1\n2\n
ini
String a,b;
Scanner scanner = new Scanner(System.in);
a = scanner.next();
scanner.nextLine();//吸收回车
b = scanner.nextLine();
System.out.println(a);//1
System.out.println(b);//2
三、类
3.1 继承
子类继承父类的属性、方法,非private的都可以访问。
java
import java.util.Scanner;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void sayHello(){
System.out.println("Hello,I am "+name);
}
}
class Student extends Person{
public Student(String name,int age){
super(name,age);
}
}
public class Main{
public static void main(String[] args) {
Student student = new Student("张三",20);
//System.out.println(student.name);//error
student.sayHello();
}
}
3.2 重载与重写
- 重载:方法名相同,参数的类型和个数不同
- 重写:父子类继承中,方法必须完全相同
csharp
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void sayHello(){
System.out.println("Hello,I am father"+name);
}
}
class Student extends Person{
public Student(String name,int age){
super(name,age);
}
//重写父类方法
public void sayHello(){
System.out.println("Hello,I am son"+super.getName());
}
//重载
public void sayHello(String name){
System.out.println("Hello,I am son"+name);
}
}
3.3 多态
多态必须同时满足两个条件
- 子类对父类方法的重写
- 父类引用指向了子类对象
注意点父类引用只能访问子类重写的方法,其它的都无法拿到
typescript
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void sayHello(){
System.out.println("Hello,I am father"+name);
}
}
class Student extends Person{
public Student(String name,int age){
super(name,age);
}
//重写父类方法
public void sayHello(){
System.out.println("Hello,I am son"+super.getName());
}
}
class Main{
public static void main(String[] args) {
Person student = new Student("张三",20);
student.sayHello();
}
}
3.4 抽象类
- 子类继承抽象类时,必须实现抽象类的抽象方法,除非子类自己是抽象类
- 抽象类里的抽象方法只能是方法体,不能实现。
- 抽象类是不能被new的,只用于被继承
java
//抽象类可以有抽象方法和普通方法
import java.util.Scanner;
abstract class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public abstract void sayHello();
public void test(){
}
}
class Student extends Person{
public Student(String name,int age){
super(name,age);
}
//重写抽象类的抽象方法
public void sayHello(){
System.out.println("Hello,I am son");
}
}
public class Main{
public static void main(String[] args) {
Student student = new Student("张三",20);
student.sayHello();
}
}
3.5 接口
- 接口内的所有方法只能是方法体,不能实现
- 子类使用接口时,必须实现其内部所有方法
- 接口内部的属性默认是static final修饰符,因此必须初始化。
typescript
interface Animal{
void sayHello();
void sayHello(String name);
}
class Student implements Animal{
@Override
public void sayHello(){
System.out.println("Hello,I am son");
}
@Override
public void sayHello(String name){
System.out.println("Hello,I am son"+name);
}
}
3.6 final,static
3.6.1 final
final修饰的变量不可以更改,修饰的类不能被继承,修饰的方法不能被重写
错误案例1
arduino
public final int age=10;
void setAge(int age){
this.age = age;//
}
3.6.2 static
- static修饰的属性、方法只能通过类访问
- static方法只能访问static的属性和方法,其它的报错
错误案例
csharp
public class Main{
public int a=10;
public static void main(String[] args) {
test();//error
System.out.println(a);/error
}
public void test() {
}
}
四、异常
java中所有异常的父类都是Exception,异常处理方式有两种
4.1 异常处理
1.方法中抛出异常
dart
public static void main(String[] args)throws Exception {
int num = 0;
if(num<10) {
throw new Myexception("num小于10");
}else if(num>10) {
throw new Myexception("num大于10");
}else {
System.out.println("num等于10");
}
}
2.处理异常
csharp
public static void main(String[] args) {
int num = 0;
try{
if(num<10) {
throw new Exception("num小于10");
}else if(num>10) {
throw new Exception("num大于10");
}else {
System.out.println("num等于10");
}
}catch(Exception e){
System.out.println(e.getMyMsg());
}
}
4.2 自定义异常
typescript
class Myexception extends Exception{
private String msg;
public Myexception(String message){
super(message);
this.msg = message;
}
public String getMyMsg() {
return "dzp:"+this.msg;
}
}
//使用
public class Main{
public int a=20;
public static void main(String[] args) {
int num = 0;
try{
if(num<10) {
throw new Myexception("num小于10");
}else if(num>10) {
throw new Myexception("num大于10");
}else {
System.out.println("num等于10");
}
}catch(Myexception e){
System.out.println(e.getMyMsg());
}
}
}
五、集合
所有集合的父类都是Collection,它内部定义了许多方法与遍历
5.1 List
ArrayList
- add(e) 尾插入
- add(index,e) 指定位置插入
- get(index) 获取指定位置的元素
- size() 获取集合的大小
- set(index,e) 修改指定位置的元素
- remove(index) 删除指定位置的元素
- remove(e) 删除指定元素
- clear() 清空集合
- contains(e) 判断集合是否包含指定元素
- indexOf(e) 获取指定元素的索引
- lastIndexOf(e) 获取指定元素的最后一个索引
- isEmpty() 判断集合是否为空
LinkList
链表数据结构
- addFirst(e) 头插入
- addLast(e) 尾插入
- getFirst() 获取头元素
- getLast() 获取尾元素
- removeFirst() 删除头元素
- removeLast() 删除尾元素
5.2 Set
数据不能重复,HashSet、TreeSet;其中treeset按顺序输出
5.3 Map
键值对存储,键值不能重复出现;HashMap、TreeMap;其中TreeMap的key按顺序输出
5.4 集合遍历
5.4.1 List与Set遍历
vbnet
Set<String> set = new TreeSet<>()
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
5.4.1 Map遍历
vbnet
Map<String,String> m = new HashMap<>();
m.put("a","b");
m.put("c","d");
Iterator<Map.Entry<String,String>> iterator = m.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String,String> entry = iterator.next();
System.out.println(entry.getKey() + " " + entry.getValue());
}
5.5 equals
equals用于判断两个对象是否相等,默认是判断两个对象的地址,如果对象内部重写了equals方法,则根据equals方法判断。
案例一:没有重写equals
csharp
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// 没有重写equals()方法
}
// 测试
Person p1 = new Person("张三", 25);
Person p2 = new Person("张三", 25);
Person p3 = p1; // p3指向p1的同一个对象
System.out.println(p1.equals(p2)); // false - 不同对象
System.out.println(p1.equals(p3)); // true - 同一个对象
System.out.println(p1 == p2); //false
案例二:重写equals
ini
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person other = (Person) obj;
return age == other.age && Objects.equals(name, other.name);
}
}
// 测试
Person p1 = new Person("张三", 25);
Person p2 = new Person("张三", 25);
Person p3 = p1;
System.out.println(p1.equals(p2)); // true - 内容相等
System.out.println(p1.equals(p3)); // true - 同一个对象
System.out.println(p1 == p2); // false - 不同对象
System.out.println(p1 == p3); //true
案例三:容器set、hash的key存储类
HashSet和HashMap存储时,需要保证存储的元素不能重复出现,如果元素是对象则需要重写equals和hashCode方法
csharp
class Person{
public String name;
public Person(String name) {
this.name = name;
}
public boolean equals(Object obj) {
if(obj != null && obj instanceof Person) {
Person p = (Person)obj;
return this.name.equals(p.name);
}
return false;
}
public int hashCode(){
return this.name.hashCode();
}
}
public class Main {
public static void main(String[] args) {
HashSet<Person> set = new HashSet<>();
set.add(new Person("dzp"));
set.add(new Person("dzp"));
System.out.println(set.size());//1
}
}
5.6 排序
排序一般两种方案,第一种就是在容器定义时传递lambda表达式,第二种就是自定义类实现Comparable接口
5.6.1 容器参数传递lambda表达式
java
TreeSet<Person> set = new TreeSet<>((a, b) -> {
if(a!=null && b!=null) {
return a.name.compareTo(b.name);
}else{
return 0;
}
});
set.add(new Person("dzp"));
set.add(new Person("azp"));
Iterator<Person> it = set.iterator();
while(it.hasNext()){
System.out.println(it.next().name);
}
5.6.2 类实现Comparable接口
java
public class Students<T, V extends Number> implements Comparable<Students<T, V>> {
private T name;
private V age;
private V score1;
private V score2;
public Students(T name, V age,V score1,V score2) {
this.name = name;
this.age = age;
this.score1 = score1;
this.score2 = score2;
}
public T getName() {
return name;
}
public V getAge() {
return age;
}
public void setName(T name) {
this.name = name;
}
public void setAge(V age) {
this.age = age;
}
public double getAvg() {
return (this.score1.doubleValue() + this.score2.doubleValue()) / 2;
}
@Override
public int compareTo(Students o) {
return this.getAvg() > o.getAvg() ? 1 : this.getAvg() < o.getAvg() ? -1 : 0;
}
public String toString() {
return "姓名: " + name + ", 年龄: " + age + ", 分数1: " + score1 + ", 分数2: " + score2;
}
}
六、泛型
6.1 模版
arduino
class Student<T>{
public T name;
public Student(T name,int age){
this.name = name;
}
}
Student<String> s = new Student("d");
6.2 通配符
6.2.1 ?
- 写:只能写null
- 读:用Object读取
- 接收:接收任何类型
案例一:使用
ini
List<?> list = new LinkedList<>();
list.add(null);
Object obj = list.get(0);
案例二:数据读取
scss
public static void printList(List<?> list) {
list.add(null);
//list.add(1); 禁止添加
for(Object obj : list) {
System.out.println(obj);
}
}
List<String> list1 = new LinkedList<>();
list1.add("1");
list1.add("2");
printList(list1);
List<Integer> list2 = new LinkedList<>();
list1.add(1);
list1.add(2);
printList(list2);
6.2.2 下界通配符
使用 ? extends T
-
写:只能写null
-
读:用T读取
-
接收:接收T及其子类
案例一:使用
scss
public static void printList(List<? extends Number> list) {
list.add(null);
for(Number obj : list) {
System.out.println(obj);
}
}
List<Integer> list2 = new LinkedList<>();
list1.add(1);
list1.add(2);
printList(list2)
6.2.3 上界通配符 ? super T
-
写:写入T及其子类
-
读:用Object读取
-
接收:接收T及其父类
案例一:使用
scss
public static void printList(List<? super Number> list) {
list.add(1);
for(Object obj : list) {
System.out.println(obj);
}
}
List<Integer> list2 = new LinkedList<>();
list1.add(1);
list1.add(2);
printList(list2)
七、文件
7.1 常用api
- getAbsolutePath 获取绝对路径
- getName 文件名
- isDirectory 是否是目录
- isFile 是否是文件
- createNewFile 创建文件
csharp
File file = new File(filePath);
System.out.println("文件路径:" + file.getAbsolutePath());
System.out.println("文件名:" + file.getName());
System.out.println("文件大小:" + file.length());
System.out.println("文件是否存在:" + file.exists());
System.out.println("文件是否可读:" + file.canRead());
System.out.println("文件是否可写:" + file.canWrite());
System.out.println("文件是否隐藏:" + file.isHid
7.2 字节流
用途:适用于绝大多数文件,音频
1.InputStream
InputStream是字节流的父类,FileInputStream是InputStream的子类,用于处理文件的输入
- read(byte\[\]) 读取指定字节大小的数据
csharp
File f1 = new File("src/1.txt");
try {
FileInputStream f2 = new FileInputStream(f1);
byte [] b = new byte[1024];
int len;
while((len = f2.read(b)) != -1) {
System.out.println(new String(b, "UTF-8"));
}
}catch (Exception e) {
throw new Error("异常"+e);
}
2.OutputStream
OutputStream是字节流的父类,FileOutputStream是OutputStream的子类,用于处理文件的输出
- write(byte\[\]) 写入指定字节的数据
ini
File f1 = new File("src/1.txt");
try {
FileOutputStream f2 = new FileOutputStream(f1);
String test = "dongzepingc测试";
byte [] b1 = test.getBytes(StandardCharsets.UTF_8);
f2.write(b1);
}catch (Exception e) {
throw new Error("异常"+e);
}
7.3 字符流
用途:主要适用于文件操作
1.Reader
Reader是字符流的父类,FileReader是Reader的子类,用于处理文件的输入
- read(char\[\])
ini
File f1 = new File("src/1.txt");
try {
FileReader f2 = new FileReader(f1);
char [] c = new char[1024];
int len;
while((len = f2.read(c)) != -1) {
System.out.println(new String(c, 0, len));
}
}catch (Exception e) {
throw new Error("异常"+e);
}
2.Writer
Writer是字符流的父类,FileWriter是Writer的子类,用于处理文件的输出
- write(char\[\])
ini
File f1 = new File("src/1.txt");
try {
FileWriter f2 = new FileWriter(f1,true);
String test = "dongzepingc测试2";
f2.write(test);
f2.flush();
}catch (Exception e) {
throw new Error("异常"+e);
}
7.4 字节-字符流
用途:结合字节流和字符流,适用于任何文件、文本、音频等
1.InputStreamReader
- read(char\[\])
ini
File f1 = new File("src/1.txt");
try {
InputStreamReader isr2 = new InputStreamReader(new FileInputStream(f1));
char[] buf = new char[1024];
int len = isr2.read(buf);
System.out.println("批量读取: " + new String(buf, 0, len));
isr2.close();
}catch (Exception e) {
throw new Error("异常"+e);
}
2.OutputStreamWriter
- write(char\[\])
java
File f1 = new File("src/1.txt");
try {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(f1, true), StandardCharsets.UTF_8);
osw.write("\nOutputStreamWriter 写入测试");
osw.write("\n第一行内容");
osw.write("\n第二行内容");
osw.flush();
osw.close();
}catch (Exception e) {
throw new Error("异常"+e);
}
7.5 缓冲流
用途:用于处理大量数据,提高效率,Buffer可以结合字节流、字符流的输入输出
- BufferedInputStream是InputStream的子类,用于处理文件的输入
ini
File f1 = new File("src/1.txt");
try {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f1));
byte[] buf = new byte[1024];
int len;
while((len = bis.read(buf)) != -1) {
System.out.println(new String(buf, 0, len));
}
bis.close();
}catch (Exception e) {
throw new Error("异常"+e);
}
- BufferedOutputStream是OutputStream的子类,用于处理文件的输出
ini
File f1 = new File("src/1.txt");
try {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(f1));
String test = "dongzepingc测试";
byte [] b1 = test.getBytes(StandardCharsets.UTF_8);
bos.write(b1);
bos.flush();
bos.close();
}catch (Exception e) {
throw new Error("异常"+e);
}
- BufferedReader是Reader的子类,用于处理文件的输入
arduino
File f1 = new File("src/1.txt");
try {
BufferedReader br = new BufferedReader(new FileReader(f1));
String line;
while((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}catch (Exception e) {
throw new Error("异常"+e);
}
- BufferedWriter是Writer的子类,用于处理文件的输出
java
File f1 = new File("src/1.txt");
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(f1, true));
bw.write("\nBufferedWriter 写入测试");
bw.write("\n第一行内容");
bw.write("\n第二行内容");
bw.flush();
bw.close();
}catch (Exception e) {
throw new Error("异常"+e);
}
7.6 序列化与反序列化
用途:java的程序对象无法直接存储到文件,并且文件也无法直接读取存储的对象,需要借助序列化实现转换。
- 序列化的类实现必须Serializable接口
arduino
public class Person implements Serializable {
private String name;
public int age;
public Person(String name) {
this.name = name;
}
public Person() {
this.name = "dzp";
}
public String getName() {
return name;
}
}
- 序列化与反序列化
ObjectOutputStream与ObjectInputStream可以实现序列化与反序列化
ini
File file = new File("src/1.txt");
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);//对象化
oos.writeObject(p);
oos.flush();
oos.close();
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Person p1 = (Person) ois.readObject();
System.out.println(p1.getName());
八、枚举
java的枚举有两种方式
方式一
ini
//定义枚举
public enum Test {
ONE,TWO,THREE
}
//使用测试,Student类有status属性
Student s = new Student()
s.status = Test.ONE
System.out.print(s.status == Test.ONE)
方式二
这种是企业常用的枚举定义,枚举数据支持灵活配置,需要定义构造函数
arduino
public enum Test {
ONE(1,"one"),
TWO(2,"tow");
private int code;
private String desc;
Test(int code,String desc) {
this.code = code;
this.desc = desc;
}
}
//使用
Students s1 = new Students();
s1.setTest(Test.ONE);
System.out.println(s1.getTest()==Test.ONE);
九、线程
9.1 线程创建
1.继承 Thread类
scala
class MyThread extends Thread{
@Override
public void run() {
System.out.println("线程启动了");
}
}
// Main.java
Thread t1 = new MyThread();
t1.start();
2.实现Runnable接口
java
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("线程启动了");
}
}
// Main.java
Thread t2 = new Thread(new MyRunnable());
t2.start();
3.Lambda
ini
Thread t3 = new Thread(() -> {
System.out.println("线程启动了");
});
t3.start();
9.2 join()
join() 是阻塞方法,调用线程会暂停执行。谁调用了join,则谁被阻塞
案例一:主线程里面调用的worker.join(),所以是主线程被阻塞了,而不是worker线程被阻塞
scss
// 假设有主线程和工作线程
Thread worker = new Thread(() -> {
// 工作线程的代码
});
worker.start();
// 主线程调用 join()
worker.join(); // ← 这里是主线程被阻塞!
案例二:
- A开始
- B开始
- A休眠时,cpu被b抢到了,但是b线程体内调用了join,导致其被无限阻塞,A执行结束后,B才能继续
csharp
Thread threadA = new Thread(() -> {
System.out.println("A开始");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {}
System.out.println("A结束");
});
Thread threadB = new Thread(() -> {
System.out.println("B开始");
try {
threadA.join(); // ← B线程调用join(),所以B被阻塞!
System.out.println("B继续执行");
} catch (InterruptedException e) {}
});
threadA.start();
threadB.start();
9.3 synchronized
synchronized用于控制多个并发请求的执行,同一时间永远只有1个资源在执行,如下案例synchronized代码块只有执行结束后才能释放锁。
scss
Object lock = new Object();
// 线程A
new Thread(() -> {
synchronized(lock) {
System.out.println("A开始");
Thread.sleep(2000); // A持有锁2秒
System.out.println("A结束");
}
// A释放锁后,其他线程才能进入上面的synchronized块
}).start();
// 线程B
new Thread(() -> {
synchronized(lock) {
System.out.println("B开始"); // 必须等A完全退出synchronized块
System.out.println("B结束");
}
}).start();
// 线程C(不相关代码)
new Thread(() -> {
System.out.println("C独立执行"); // 这个可以立即执行,不受影响
}).start();
//结果
C独立执行
A开始
(等待2秒)
A结束
B开始
B结束
十、反射
反射目的是在运行时动态获取类的信息,进而可以操作类的内部属性和方法等。
11.1 Class获取
Class是反射最核心的api,只有通过Class才能进行后续操作,Class的获取3种方式,如下
1.Class.forName("包名.类名")
ini
Class<Person> personClass = Person.class;
2.对象.getClass()
ini
Person p = new Person("dzp");
Class<?> personClass = p.getClass();
3.类名.class
ini
Class<?> personClass = Class.forName("Person");
11.2 Class常用api
1.clazz.getName()
获取完整的类名
ini
Class<Person> personClass1 = Person.class;
System.out.println(p.getName());
2.clazz.getSimpleName()
获取类名
ini
Class<Person> personClass1 = Person.class;
System.out.println(p.getSimpleName());
3.clazz.isArray()
判断是否是数组
ini
Class<Person> personClass1 = Person.class;
System.out.println(p.isArray());
11.3 构造函数
1.获取构造函数
1.getConstructors()//获取所有的构造函数
2.getConstructor(参数类型)//获取指定的构造
ini
Class<?> clazz = Class.forName("Person");
Constructor<?>[] constructor1 = clazz.getConstructors();//获取所有的构造函数
for (Constructor<?> c:constructor1) {
System.out.println(c);
}
Constructor<?> constructor2 = clazz.getConstructor(String.class);
System.out.println(constructor2);
2.创建对象
1.newInstance(...args)//创建对象
ini
Constructor<?> constructor2 = clazz.getConstructor(String.class);
System.out.println(constructor2);
Person p = (Person) constructor2.newInstance("dzp");
System.out.println(p.getName());
11.4 属性
1.获取属性
1.getFields()//获取所有的public属性
2.getDeclaredFields()//获取所有的属性,public,private等
3.getField(name)//获取指定的属性
ini
Class<?> clazz = Class.forName("Person");
Field[] fields = clazz.getFields();
for (Field f:fields) {
System.out.println("field"+f);
}
Field field = clazz.getField("age");
2.属性操作
1.getName()//获取属性名
2.get(实例对象)//获取对属性的值
3.set(实例对象,value)//属性值写入
ini
Class<?> clazz = Class.forName("Person");
Field field = clazz.getField("age");
Person p = new Person("test");
System.out.println(field.getName()+"获取值"+field.get(p));
11.5 方法
1.方法获取
1.getMethods()//获取所有的方法-public
2.getDeclaredMethods(实例对象)//获取所有的方法-包含public,private
3.getMethod(name)//获取指定的方法
2.方法操作
1.getName()//获取方法名
2.invoke(实例对象,参数1,参数2)//执行这个方法
十一、网络编程
11.1 InetAddress
用途:获取主机、IP、端口等网络信息。
1.InetAddress实例创建
InetAddress.getByName(String host):根据主机名获取IP地址
InetAddress.getLocalHost():获取本地主机IP地址
ini
InetAddress ad1 = InetAddress.getByName("www.baidu.com");
InetAddress ad2 = InetAddress.getLocalHost("127.0.0.1");
2.getHostName 获取主机
ini
InetAddress ad1 = InetAddress.getByName("www.baidu.com");
System.out.println(ad1.getHostName());//www.baidu.com
3.getHostName 获取IP地址
ini
InetAddress ad1 = InetAddress.getByName("www.baidu.com");
System.out.println(ad1.getHostAddress());//124.1231.1212
11.2 URL
用途:获取网络资源
scss
URL u1 = new URL("https://www.baidu.com:443/s?wd=123");
getProtocol()//获取协议
getHost()//获取主机
getPort()//获取端口
getPath()//获取路径
getQuery()//获取参数
11.3 TCP、UDP
用途:网络传输协议层
scss
public void tcpDemo() {
/*
* 三、TCP
* 1.服务器端
* 2.客户端
* */
new Thread(() -> {
try {
ServerSocket serverSocket = new ServerSocket(8888);
System.out.println("服务端启动,等待连接...");
while (true) {
Socket socket = serverSocket.accept();
System.out.println("客户端连接成功:" + socket.getInetAddress().getHostAddress());
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) != -1) {
System.out.println("服务端收到消息:" + new String(buffer, 0, len, StandardCharsets.UTF_8));
}
socket.close();
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}).start();
new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
try {
Thread.sleep(500);
Socket socket = new Socket("127.0.0.1", 8888);
socket.getOutputStream().write("Hello World".getBytes(StandardCharsets.UTF_8));
socket.getOutputStream().flush();
socket.close();
} catch (IOException | InterruptedException e) {
throw new RuntimeException(e);
}
}).start();
}
11.4 HttpServer(高频重点)
用途:网络应用层
ini
public void httpGetDemo() throws IOException, InterruptedException {
/*
* 四、httpClient 应用层
* 用途:发送get,post,调用第三方接口
* */
HttpClient cl = HttpClient.newHttpClient();
HttpRequest rq = HttpRequest.newBuilder().uri(URI.create("https://www.baidu.com")).GET().build();
HttpResponse rp = cl.send(rq, HttpResponse.BodyHandlers.ofString());
System.out.println(rp.body()+"状态码"+rp.statusCode());
}
public void httpPostDemo() throws IOException, InterruptedException {
/*
* 四、httpClient 应用层
* 用途:发送get,post,调用第三方接口
* */
String form = "wd=123&age=123";
HttpClient cl = HttpClient.newHttpClient();
HttpRequest rq = HttpRequest.newBuilder().uri(URI.create("https://www.baidu.com")).POST(HttpRequest.BodyPublishers.ofString(form)).build();
HttpResponse rp = cl.send(rq, HttpResponse.BodyHandlers.ofString());
System.out.println(rp.body()+"状态码"+rp.statusCode());
}
十二、工具
1.Math
ini
int a = Math.abs(-5);
int b = Math.max(1,2)
2.Date
ini
Date d = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(d);