Java入门基础视频教程,java零基础自学首选黑马程序员Java入门教程(含Java项目和Java真题)_哔哩哔哩_bilibili为了帮助广大对Java有兴趣和立志进入本行业的零基础学员,本套课程由此而生,舍弃了冗长的理论,结合软件公司一个个真实的应用需求,来加强大家对知识的理解和掌握。本课程知识全面透彻,案例极为丰富,阶段课程完结后都配备了综合实战案例,具备大量优雅、高质量的代码供初学者训练,手把手边学边干,清楚,实用!是Java零基础学员极好的入门视频。课程从Java语言的简介到程序开发执行的原理、集成开发工具IDEA的https://www.bilibili.com/video/BV1Cv411372m?p=128

本文为P1-P127,之后的内容由于项目暂时用不上,所以没学

Java层次

基础格式

package com.itheima.test;    //包名:一般为公司网址倒写public class Test {    //类名:Test
}

main函数

main加tab键

package com.itheima.test;public class Test {public static void main(String[] args) {}
}

输出语句

System.out.println();
package com.itheima.test;public class Test {public static void main(String[] args) {System.out.println("HelloWorld");}
}

注释

 单行注释

//单行注释
package com.itheima.note;public class NoteDemo {public static void main(String[] args) {//单行注释}
}

多行注释

/*注释内容1注释内容2
*/
package com.itheima.note;public class NoteDemo {public static void main(String[] args) {/*注释内容1注释内容2*/}
}

文档注释:文档注释的内容是可以提取到一个程序说明文档中去的

/**文档注释
*/
package com.itheima.note;
/**文档注释
*/public class NoteDemo {public static void main(String[] args) {}
}

变量

int a=10;
double b=2.0;
float c=3.0;

输入

import java.util.Scanner;Scanner sc=new Scanner(System.in);int age =sc.nextInt();String name =sc.next();
package com.itheima.scanner;import java.util.Scanner;// 1、导包操作〔并不需要自己写的,以后通过工具进行导入更方使)
public class ScannerDemo {public static void main(String[] args) {//2.得到一个键盘扫描对象Scanner sc=new Scanner(System.in);//3.调用sc对象的功能等待用户输入的数据//这个代码会等待用户输入数据,直到用户输入完数据并按了回车键就会把数据拿到System.out.println("请输入你的年龄:");int age =sc.nextInt();System.out.println("您的年龄是:"+age);System.out.println("请输入你的名称:");String name =sc.next();System.out.println("欢迎:"+name);}
}

if

if (条件表达式) {语句体; }
if (条件表达式) {语句体1;	
} else {语句体2;	
}
if (条件表达式1) {语句体1;	
} else if (条件表达式2) {语句体2;	
} else if (条件表达式3) {语句体3;	
} 
. . .
else {语句体n+1;
}

switch

switch(表达式){case 值1:执行代码1;break;case 值2:执行代码2;break;...default:执行代码n;//break;

for循环

for (初始化语句; 循环条件; 迭代语句)  {	循环体语句(重复执行的代码);
}
// 输出3次HelloWorld
for (int i = 0; i < 3; i++) {   System.out.println("Hello World");
}

while循环

初始化语句;
while (循环条件) {循环体语句(被重复执行的代码);迭代语句;
}
int i = 0;
while (i < 3) {System.out.println("Hello World");i++;
}

do-while循环

初始化语句;
do {循环体语句;迭代语句;
} while (循环条件);
int i = 0;
do {System.out.println(“Hello World!");i++;
} while( i < 3);

死循环

for(;;){
}
while(true){
}
do{
}while(true);

Random随机数

import java.util.Random;Random r = new Random();int data = r.nextInt(10); // 0 - 9 不包含10的(包前不包后)
package com.itheima.random;import java.util.Random;public class RandomDemo1 {public static void main(String[] args) {// 目标:学会使用Java提供的随机数类Random// 1、导包// 2、创建随机数对象Random r = new Random();// 3、调用nextInt功能(方法)可以返回一个整型的随机数给你for (int i = 0; i < 20; i++) {int data = r.nextInt(10); // 0 - 9 不包含10的(包前不包后)System.out.println(data);}System.out.println("-----------------------");// 1 - 10 ==> -1 ==> (0 - 9) + 1int data = r.nextInt(10) + 1;System.out.println(data);// 3 - 17 ==> -3 ==> (0 - 14) + 3int data1 = r.nextInt(15) + 3;System.out.println(data1);}
}

数组

// 完整格式
数据类型[]  数组名 = new 数据类型[]{元素1,元素2 ,元素3… };
double[] scores = new double[]{89.9, 99.5, 59.5, 88.0};
int[] ages = new int[]{12, 24, 36}
// 简化格式
数据类型[] 数组名 = { 元素1,元素2 ,元素3,… };
int[] ages = {12, 24, 36};

数据类型[] 数组名”也可以写成 “数据类型 数组名[] 

int[] ages =...;  
int ages[] =...;  double[] scores = ...;
double scores[] = ...;

数组的访问

// 取值
System.out.println(arr[0]); // 12
// 赋值
arr[2] = 100;
System.out.println(arr[2]); // 100

数组的长度属性:length

// 获取数组的长度(就是数组元素的个数)
System.out.println(arr.length); // 3

数组的动态初始化

数据类型[]  数组名 = new 数据类型[长度];
int[] arr = new int[3];//新建三个整形空间

方法(函数)

修饰符  返回值类型  方法名( 形参列表 ){方法体代码(需要执行的功能代码)return 返回值;
}
public static int add(int a,int b){int c=a+b;return c;
}

方法的调用格式

//方法名(…); 
int sum = add(10, 20);
System.out.println(sum);

方法重载

public class Test {//(1)默认发一枚武器public static void fire(){System.out.println(“默认发射一枚武器给米国!");}//(2)可以指定地区发射一枚武器。public static void fire(String location){System.out.println("给"+location+"发射一枚武器!");}//(3)可以指定地区发射多枚武器。public static void fire(String location , int nums){System.out.println("给"+location+"发射"+nums+"枚武器!");}
}fire();
fire("米国");
fire("岛国" , 1000);

面向对象编程

定义类,才能获得对象

public class 类名{1、成员变量(代表属性)2、成员方法(代表行为)3、构造器(后面学习)4、代码块(后面学习)5、内部类(后面学习)
}
public class Car{String name;double price;public void start(){system.out.println(name+"启动了! ");}public void run(){system.out.println("售价为:" + price +"的" +name+"跑的快! ");}
}

得到类的对象

//类名对象名= new类名();
Car c2 = new Car();

使用对象

对象.成员变量;对象.成员方法(...)

car.name;
car.price;
car.start();

构造器

public class Car {//无参数构造器(默认存在的)
}
public class Car {//无参数构造器(需要写出来了)public Car(){}//有参数构浩public car(String n,String b){}
}

this关键字:当前对象的地址

public class car {String name;double price;public car(string name , double price){this.name = name;this.price = price;}
}
public class car {String name;double price;public void gowith(String name){system.out.println(this.name +"正在和"+name +"一起比赛!!");}
}

封装:隐藏实现细节,暴露出合适的访问方式。(合理隐藏、合理暴露)

public class Student {private int age;public int getAge() {return age;}public void setAge(int age) {if (age >= 0 && age <= 200) {this.age = age;}else {System.out.println("请检查年龄数值");}}
}

String字符串创建

String s1 = "abc" ;
String s2 = "abc" ;
System.out.println(s1 == s2); //truechar[] chs = {'a', 'b', 'c'};
string s3 = new String(chs);
String s4 = new String(chs);
System.out.println(s3 == s4); //false

字符串的内容比较

推荐使用String类提供的“equals”比较:只关心内容一样即可

public boolean equals (Object anobject)

将此字符串与指定对象进行比较。只关心字符内容是否一致!

public boolean equalsIgnorecase (string anotherString)

将此字符串与指定对象进行比较,忽略大小写比较字符串。只关心字符内容是否一致!

if(okName.equals(name ) && okPassword.equals(password)){System.out.println("登录成功!");
}else {System.out.println("用户名或者密码错误了!");
}

ArrayList集合

package com.itheima.arraylist;import java.util.ArrayList;/**目标: 创建ArrayList对象,代表集合容器,往里面添加元素。*/
public class ArrayListDemo1 {public static void main(String[] args) {// 1、创建ArrayList集合的对象ArrayList list = new ArrayList();// 2、添加数据list.add("Java");list.add("Java");list.add("MySQL");list.add("黑马");list.add(23);list.add(23.5);list.add(false);System.out.println(list.add('中'));System.out.println(list);// 3、给指定索引位置插入元素list.add(1, "赵敏");System.out.println(list);}
}

true
[Java, Java, MySQL, 黑马, 23, 23.5, false, 中]
[Java, 赵敏, Java, MySQL, 黑马, 23, 23.5, false, 中]

ArrayList泛型

//使用泛型:<数据类型>
ArrayList<String> list1 = new ArrayList();//此集合只能操作字符串类型的元素

ArrayList集合常用方法

package com.itheima.arraylist;import java.util.ArrayList;/**目标:掌握ArrayList集合的常用API*/
public class ArrayListDemo3 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("Java");list.add("Java");list.add("MySQL");list.add("MyBatis");list.add("HTML");// 1、public E get(int index):获取某个索引位置处的元素值String e = list.get(3);System.out.println(e);// 2、public int size():获取集合的大小(元素个数)System.out.println(list.size());// 3、完成集合的遍历for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}// 4、public E remove(int index):删除某个索引位置处的元素值,并返回被删除的元素值System.out.println(list); // [Java, Java, MySQL, MyBatis, HTML]String e2 = list.remove(2);System.out.println(e2);System.out.println(list);// 5、public boolean remove(Object o):直接删除元素值,删除成功返回true,删除失败返回falseSystem.out.println(list.remove("MyBatis"));System.out.println(list);ArrayList<String> list1 = new ArrayList<>();list1.add("Java");list1.add("王宝强");list1.add("Java");list1.add("MySQL");System.out.println(list1);// 只会删除第一次出现的这个元素值,后面的不删除System.out.println(list1.remove("Java"));System.out.println(list1);// 6、public E set(int index,E element):修改某个索引位置处的元素值。String e3 = list1.set(0 , "贾乃亮");System.out.println(e3);System.out.println(list1);}
}

MyBatis
5
Java
Java
MySQL
MyBatis
HTML
[Java, Java, MySQL, MyBatis, HTML]
MySQL
[Java, Java, MyBatis, HTML]
true
[Java, Java, HTML]
[Java, 王宝强, Java, MySQL]
true
[王宝强, Java, MySQL]
王宝强
[贾乃亮, Java, MySQL]

static静态

static可以修饰成员变量和成员方法。

成员变量

static修饰成员变量表示该成员变量只在内存中只存储一份,可以被共享访问、修改。

public class User {// 成员变量public static int onlineNumber= 161;private String name;private int age;…
}

推荐访问方式:类名.静态成员变量

User.onlineNumber

成员方法

静态成员方法(有static修饰,属于类),建议用类名访问,也可以用对象访问。

实例成员方法(无static修饰,属于对象),只能用对象触发访问。

package com.itheima.d2_static_method;public class Student {private String name;private int age;/**实例方法:无static修饰,属于对象的,通常表示对象自己的行为,可以访问对象的成员变量*/public void study(){System.out.println(name + "在好好学习,天天向上~~");}/**静态方法:有static修饰,属于类,可以被类和对象共享访问。*/public static void getMax(int a, int b){System.out.println(a > b ? a : b);}public static void main(String[] args) {// 1、类名.静态方法Student.getMax(10, 100);// 注意:同一个类中访问静态成员 可以省略类名不写getMax(200, 20);// 2、对象.实例方法// study(); // 报错的Student s = new Student();s.name = "全蛋儿";s.study();// 3、对象.静态方法(不推荐)s.getMax(300,20);}
}

饿汉单例设计模式

在用类获取对象的时候,对象已经提前为你创建好了

设计步骤:

定义一个类,把构造器私有

定义一个静态变量存储一个对象

/** a、定义一个单例类 */
public class SingleInstance {/** c.定义一个静态变量存储一个对象即可 :属于类,与类一起加载一次 */public static SingleInstance instance = new SingleInstance ();/** b.单例必须私有构造器*/private SingleInstance (){System.out.println("创建了一个对象");}
}

懒汉单例设计模式

在真正需要该对象的时候,才去创建一个对象(延迟加载对象)。

设计步骤:

定义一个类,把构造器私有

定义一个静态变量存储一个对象。

提供一个返回单例对象的方法

/** 定义一个单例类 */
class SingleInstance{/** 定义一个静态变量存储一个对象即可 :属于类,与类一起加载一次 */public static SingleInstance instance ; // null/** 单例必须私有构造器*/private SingleInstance(){}/** 必须提供一个方法返回一个单例对象  */public static SingleInstance getInstance(){...return ...;}
}

继承

Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系。

Student称为子类(派生类),People称为父类(基类 或超类)

public class Student extends People {}

①子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。

②Java是单继承模式:一个类只能继承一个直接父类。

③Java不支持多继承、但是支持多层继承。

④Java中所有的类都是Object类的子类。

父类文件People.java

package com.itheima.d7_extends;public class People {private String name;private int 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;}
}

子类文件Student.java继承

package com.itheima.d7_extends;public class Student extends People{/**独有的行为*/public void study(){System.out.println(getName() + "学生开始学习~~~~~");}
}

测试

package com.itheima.d7_extends;public class Test {public static void main(String[] args) {// 创建子类对象,看是否可以使用父类的属性和行为Student s = new Student();s.setName("西门"); // 父类的s.setAge(25);// 父类的System.out.println(s.getName());// 父类的System.out.println(s.getAge());// 父类的s.study();}
}

西门
25
西门学生开始学习~~~~~

super关键字:指定访问父类的成员

关键字

访问成员变量

访问成员方法

访问构造方法

this

this.成员变量

访问本类成员变量

this.成员方法(…)

访问本类成员方法

this(…)

访问本类构器

super

super.成员变量

访问父类成员变量

super.成员方法(…)

访问父类成员方法

super(…)

访问父类构造器

    public Student(String name, int age, String className) {super(name, age);this.className = className;}

this()访问本类构造器

后台创建对象封装数据的时候如果用户没有输入学校,则默认使用“黑马培训中心”。如果用户输入了学校则使用用户输入的学校信息

public class Student {        private String schoolName;private String name;public Student(String name){this(name , “黑马培训中心”);	}	public Student(String name , String schoolName ){this.name = name;this.schoolName = schoolName;}	
}

包是用来分门别类的管理各种不同类的,类似于文件夹、建包利于程序的管理和维护

建包的语法格式:package 公司域名倒写.技术名称。报名建议全部英文小写,且具备意义

建包语句必须在第一行,一般IDEA工具会帮助创建

package com.itheima.javabean;
public class Student {}

导包 

相同包下的类可以直接访问不同包下的类必须导包,才可以使用!导包格式:import 包名.类名;

假如一个类中需要用到不同类,而这个两个类的名称是一样的,那么默认只能导入一个类,另一个类要带包名访问

package com.itheima.d1_package;import com.itheima.d1_package.demo1.Animal;
import com.itheima.d1_package.demo1.Cat;public class Test {public static void main(String[] args) {// 导包:相同包下的类可以直接访问。Student s = new Student();// 不同包下的类必须导包才可以使用Animal a = new Animal();// 使用默认导包的类:demo1下的catCat c1 = new Cat();c1.run();// 指定使用demo2下的Cat类com.itheima.d1_package.demo2.Cat c2 = new  com.itheima.d1_package.demo2.Cat();c2.run();}
}

权限修饰符

权限修饰符:是用来控制一个成员能够被访问的范围的

自己定义成员(方法,成员变量,构造器等)一般满足如下要求:

  1. 成员变量一般私有。
  2. 方法一般公开。
  3. 如果该成员只希望本类访问,使用private修饰。
  4. 如果该成员只希望本类,同一个包下的其他类和子类访问,使用protected修饰

修饰符

同一 个类中

同一个包中

其他类

不同包下的

子类

不同包下的

无关类

private

缺省

protected

public

package com.itheima.d2_modifier.itcast;public class Fu {// 1.private 只能本类中访问private void show1() {System.out.println("private");}// 2.缺省:本类,同一个包下的类中。void show2() {System.out.println("缺省");}// 3.protected:本类,同一个包下的类中,其他包下的子类protected void show3() {System.out.println("protected");}// 4.任何地方都可以public void show4() {System.out.println("public");}public static void main(String[] args) {//创建Fu的对象,测试看有哪些方法可以使用Fu f = new Fu();f.show1();f.show2();f.show3();f.show4();}
}

private
缺省
protected
public

final最终

final 关键字是最终的意思,可以修饰(方法,变量,类)

修饰方法:表明该方法是最终方法,不能被重写。

class Animal{public final void run(){System.out.println("动物可以跑~~");}
}class Tiger extends Animal{
//    @Override
//    public void run() {
//        System.out.println("老虎跑的贼快~~~");
//    }
}

修饰变量:表示该变量第一次赋值后,不能再次被赋值(有且仅能被赋值一次)。

变量有几种:局部变量。成员变量。-- 1、静态成员变量。-- 2、实例成员变量。final基本上不会用来修饰实例成员变量,没有意义!
public static void main(String[] args) {// final修饰变量,变量有且仅能被赋值一次。final int age;age = 12;// age = 20; // 第二次赋值,报错了!
}

修饰类:表明该类是最终类,不能被继承。

final class Animal{
}
class Cat extends Animal{    //报错,不能继承final修饰的类
}

final修饰变量的注意

final修饰的变量是基本类型:那么变量存储的数据值不能发生改变。

final修饰的变量是引用类型:那么变量存储的地址值不能发生改变,但是地址指向的对象内容是可以发生变化的。

package com.itheima.d3_final;public class Test2 {public static void main(String[] args) {// final修饰变量的注意事项:// 1、final修饰基本类型变量,其数据不能再改变final double rate = 3.14;// rate = 3.15; // 第二次赋值,报错// 2、final修饰引用数据类型的变量,变量中存储的地址不能被改变,但是地址指向的对象内容可以改变。final int[] arr = {10, 20, 30};System.out.println(arr);// arr = null; // 属于第二次赋值,arr中的地址不能被改变arr[1] = 200;System.out.println(arr);System.out.println(arr[1]);}
}

常量

常量是使用了public static final修饰的成员变量,必须有初始化值,而且执行的过程中其值不能被改变。

常量的作用和好处:可以用于做系统的配置信息,方便程序的维护,同时也能提高可读性。

常量命名规范:英文单词全部大写,多个单词下划线连接起来。

public class Constant {public static final String SCHOOL_NAME  = “传智教育";public static final String LOGIN_NAME  = “admin";public static final String PASS_WORD  = “123456";
} 

枚举

 修饰符 enum 枚举名称{第一行都是罗列枚举类实例的名称。
}
枚举的第一行必须罗列枚举类的对象名称,建议全部大写
public enum Season{SPRING , SUMMER , AUTUMN , WINTER;
}
做信息标志和分类
public enum Orientation {UP, DOWN, LEFT, RIGHT;
}

案例 :现在开发的超级玛丽游戏需要接收用户输入的四个方向的信号(上下左右),以便控制玛丽移动的方向

package com.itheima.d5_enum;import javax.swing.*;
import java.awt.event.ActionEvent;/**目标: 常量的其他作用,做信息标志和信息分类(其实也是一种配置形式)*/
public class EnumDemo2 {public static void main(String[] args) {// 1、创建一个窗口对象(桌子)JFrame win = new JFrame();// 2、创建一个面板对象(桌布)JPanel panel = new JPanel();// 3、把桌布垫在桌子上win.add(panel);// 4、创建四个按钮对象JButton btn1 = new JButton("上");JButton btn2 = new JButton("下");JButton btn3 = new JButton("左");JButton btn4 = new JButton("右");// 5、把按钮对象添加到桌布上去panel.add(btn1);panel.add(btn2);panel.add(btn3);panel.add(btn4);// 6、显示窗口win.setLocationRelativeTo(null);win.setSize(300,400);win.setVisible(true);btn1.addActionListener(new AbstractAction() {@Overridepublic void actionPerformed(ActionEvent e) {move(Orientation.UP) ; // 让玛丽往上跳}});btn2.addActionListener(new AbstractAction() {@Overridepublic void actionPerformed(ActionEvent e) {move(Orientation.DOWN) ; // 让玛丽往下跳}});btn3.addActionListener(new AbstractAction() {@Overridepublic void actionPerformed(ActionEvent e) {move(Orientation.LEFT) ; // 让玛丽往左跑}});btn4.addActionListener(new AbstractAction() {@Overridepublic void actionPerformed(ActionEvent e) {move(Orientation.RIGHT) ; // 让玛丽往右跑}});}public static void move(Orientation o){// 控制玛丽移动switch (o) {case UP:System.out.println("玛丽往上飞了一下~~");break;case DOWN:System.out.println("玛丽往下蹲一下~~");break;case LEFT:System.out.println("玛丽往左跑~~");break;case RIGHT:System.out.println("玛丽往→跑~~");break;}}
}

抽象类

一个类中的某个方法的具体实现不能确定

修饰符 abstract class 类名{  }
修饰符 abstract 返回值类型 方法名称(形参列表);
public abstract class Animal{public abstract void run();
}

接口interface

接口用关键字interface来定义,接口不能创建对象

public interface 接口名 {// 常量// 抽象方法
} 
public interface SportManInterface {// 接口中的成员:JDK 1.8之前只有常量 和 抽象方法// public static final 可以省略不写,接口默认会为你加上!// public static final String SCHOOL_NAME = "黑马";String SCHOOL_NAME = "黑马";// 2、抽象方法//  public abstract 可以省略不写,接口默认会为你加上!// public abstract void run();void run();// public abstract void eat();void eat();
}

接口类实现implements

接口是用来被类实现(implements)的,实现接口的类称为实现类。实现类可以理解成所谓的子类

修饰符 class 实现类 implements 接口1, 接口2, 接口3 , ... {
}
public interface Law {void rule(); // 遵章守法
}public interface SportMan {void run();void competition();
}/**实现类(子类)*/
public class PingPongMan implements SportMan , Law{private String name;public PingPongMan(String name) {this.name = name;}@Overridepublic void rule() {System.out.println(name + "要遵章守法,不能随意外出,酗酒,约会~~~");}@Overridepublic void run() {System.out.println(name + "必须要跑步训练~~");}@Overridepublic void competition() {System.out.println(name + "需要参加国际比赛~~");}
}public class Test {public static void main(String[] args) {PingPongMan p = new PingPongMan("张继科");p.rule();p.run();p.competition();}
}

张继科要遵章守法,不能随意外出,酗酒,约会~~~
张继科必须要跑步训练~~
张继科需要参加国际比赛~~

接口:JDK8开始后新增方法

默认方法:default修饰,实现类对象调用。

静态方法:static修饰,必须用当前接口名调用

私有方法:private修饰,jdk9开始才有的,只能在接口内部被调用。

他们都会默认被public修饰。

package com.itheima.d13_interface_jdk8;public interface SportManInter {/**1、JDK 8开始 :默认方法(实例方法)-- 必须default修饰,默认用public修饰-- 默认方法,接口不能创建对象,这个方法只能过继给了实现类,由实现类的对象调用。*/default void run(){go();System.out.println("跑的很快~~~");}/**2、静态方法必须使用static修饰,默认用public修饰-- 接口的静态方法,必须接口名自己调用。*/static void inAddr(){System.out.println("我们都在学习Java新增方法的语法,它是Java源码自己会用到的~~~");}/**3、私有方法(实例方法)-- JDK 1.9开始才支持的。-- 必须在接口内部才能被访问*/private void go(){System.out.println("开始跑~~~");}}class PingPongMan implements SportManInter{
}class Test{public static void main(String[] args) {PingPongMan p = new PingPongMan();p.run();SportManInter.inAddr();// PingPongMan.inAddr();}
}

开始跑~~~
跑的很快~~~
我们都在学习Java新增方法的语法,它是Java源码自己会用到的~~~

多态

同类型的对象,执行同一个行为,会表现出不同的行为

多态中成员访问特点:

特征方法调用:编译看左边,运行看右边。

变量调用:编译看左边,运行也看左边

多态的前提有继承/实现关系;有父类引用指向子类对象;有方法重写。

多态的常见形式

父类类型 对象名称 = new 子类构造器;
接口     对象名称 = new 实现类构造器;
/**父类*/
public class Animal {public String name = "动物名称";public void run(){System.out.println("动物可以跑~~");}
}public class Dog extends Animal{public String name = "狗名称";@Overridepublic void run() {System.out.println("🐕跑的贼溜~~~~~");}
}public class Tortoise extends Animal{public String name = "乌龟名称";@Overridepublic void run() {System.out.println("🐢跑的非常慢~~~");}
}public class Test {public static void main(String[] args) {// 目标:先认识多态的形式// 父类  对象名称 = new 子类构造器();Animal a = new Dog();a.run(); // 方法调用:编译看左,运行看右System.out.println(a.name); // 变量调用:编译看左,运行也看左,动物名称Animal a1 = new Tortoise();a1.run();System.out.println(a1.name); // 动物名称}
}

🐕跑的贼溜~~~~~
动物名称
🐢跑的非常慢~~~
动物名称

多态形式下的类中转换机制

1.引用数据类型的类型转换,有几种方式?

  •  自动类型转换、强制类型转换。

2.强制类型转换能解决什么问题?强制类型转换需要注意什么。

  •  可以转换成真正的子类类型,从而调用子类独有功能。
  •  有继承关系/实现的2个类型就可以进行强制转换,编译无问题。
  •  运行时,如果发现强制转换后的类型不是对象真实类型则报错。
  •  类型转换异常:ClassCastException
/**父类*/
public class Animal {public String name = "动物名称";public void run(){System.out.println("动物可以跑~~");}
}public class Dog extends Animal {public String name = "狗名称";@Overridepublic void run() {System.out.println("🐕跑的贼溜~~~~~");}/**独有功能*/public void lookDoor(){System.out.println("🐕在看🚪!!!");}
}public class Tortoise extends Animal {public String name = "乌龟名称";@Overridepublic void run() {System.out.println("🐢跑的非常慢~~~");}/**独有功能*/public void layEggs(){System.out.println("🐢在下蛋~~~");}
}/**目标:学习多态形式下的类中转换机制。*/
public class Test {public static void main(String[] args) {// 自动类型转换Animal a = new Dog();a.run();
//        a.lookDoor(); // 多态下无法调用子类独有功能// 强制类型转换:可以实现调用子类独有功能的Dog d = (Dog) a;d.lookDoor();// 注意:多态下直接强制类型转换,可能出现类型转换异常// 规定:有继承或者实现关系的2个类型就可以强制类型转换,运行时可能出现问题。// Tortoise t1 = (Tortoise) a;// 建议强制转换前,先判断变量指向对象的真实类型,再强制类型转换。if(a instanceof Tortoise){Tortoise t = (Tortoise) a;t.layEggs();}else if(a instanceof Dog){Dog d1 = (Dog) a;d1.lookDoor();}System.out.println("---------------------");Animal a1 = new Dog();go(a1);}public static void go(Animal a){System.out.println("预备~~~");a.run();// 独有功能if(a instanceof Tortoise){Tortoise t = (Tortoise) a;t.layEggs();}else if(a instanceof Dog){Dog d1 = (Dog) a;d1.lookDoor();}System.out.println("结束~~~~");}
}

🐕跑的贼溜~~~~~
🐕在看🚪!!!
🐕在看🚪!!!
---------------------
预备~~~
🐕跑的贼溜~~~~~
🐕在看🚪!!!
结束~~~~

内部类

内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)

public class People{// 内部类public class Heart{}
}

静态内部类

  • 有static修饰,属于外部类本身。
  • 它的特点和使用与普通类是完全一样的,类有的成分它都有,只是位置在别人里面而已
  • 可以直接访问外部类的静态成员,不能直接访问外部类的实例成员
public class Outer{// 静态成员内部类public static class Inner{}
}

静态内部类创建对象的格式

格式:外部类名.内部类名 对象名 = new 外部类名.内部类构造器;
范例:Outer.Inner in =  new Outer.Inner();

成员内部类

  • 无static修饰,属于外部类的对象。
  • JDK16之前,成员内部类中不能定义静态成员,JDK 16开始也可以定义静态成员了
  • 可以直接访问外部类的静态成员,实例方法中可以直接访问外部类的实例成员
public class Outer {// 成员内部类public class Inner {}
}

成员内部类创建对象的格式

格式:外部类名.内部类名 对象名 = new  外部类构造器.new 内部类构造器();
范例:Outer.Inner in =  new Outer().new Inner();

局部内部类

  • 局部内部类放在方法、代码块、构造器等执行体中。
  • 局部内部类的类文件名为: 外部类$N内部类.class

匿名内部类

本质上是一个没有名字的局部内部类,定义在方法中、代码块中、等。
作用:方便创建子类对象,最终目的为了简化代码编写。

new 类|抽象类名|或者接口名() {重写方法;
};
Animal a = new Animal() {public void run() {}
};
a. run();
public class Test {public static void main(String[] args) {Animal a = new Animal(){@Overridepublic void run() {System.out.println("老虎跑的块~~~");}};a.run();}
}//class Tiger extends Animal{
//    @Override
//    public void run() {
//        System.out.println("老虎跑的块~~~");
//    }
//}abstract class Animal{public abstract void run();
}

匿名内部类在开发中的使用形式了解

某个学校需要让老师,学生,运动员一起参加游泳比赛

/*游泳接口*/
public interface Swimming {void swim();
}
/* 测试类*/
public class JumppingDemo {public static void main(String[] args) {//需求:goSwimming方法}// 定义一个方法让所有角色进来一起比赛public static void goSwimming(Swimming swimming) {swimming.swim();}
}

API

  • API(Application Programming interface)  应用程序编程接口。
  • 简单来说:就是Java帮我们已经写好的一些方法,我们直接拿过来用就可以了。

Object类

  • Object类的方法是一切子类对象都可以直接使用的,所以我们要学习Object类的方法。
  • 一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java中的祖宗类

ObjecttoString方法

父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息!! 

Student s = new Student("周雄", '男', 19);
System.out.println(s);

toS+tab键快速重写对象中toString方法

package com.itheima.d9_api_object;import java.util.Objects;public class Student { //extends Object{private String name;private char sex;private int age;public Student() {}public Student(String name, char sex, int age) {this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", sex=" + sex +", age=" + age +'}';}
}package com.itheima.d9_api_object;/**目标:掌握Object类中toString方法的使用。*/
public class Test1 {public static void main(String[] args) {Student s = new Student("周雄", '男', 19);// 直接输出对象变量,默认可以省略toString调用不写的System.out.println(s);}
}

Student{name='周雄', sex=男, age=19}

Objectequals方法

父类equals方法存在的意义就是为了被子类重写,以便子类自己来定制比较规则

Objects.equals(s1, s2)
package com.itheima.d9_api_object;import java.util.Objects;public class Student { //extends Object{private String name;private char sex;private int age;public Student() {}public Student(String name, char sex, int age) {this.name = name;this.sex = sex;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public char getSex() {return sex;}public void setSex(char sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}/**定制相等规则。两个对象的内容一样就认为是相等的s1.equals(s2)比较者:s1 == this被比较者: s2 ==> o*/@Overridepublic boolean equals(Object o) {// 1、判断是否是同一个对象比较,如果是返回true。if (this == o) return true;// 2、如果o是null返回false  如果o不是学生类型返回false  ...Student !=  ..Pigif (o == null || this.getClass() != o.getClass()) return false;// 3、说明o一定是学生类型而且不为nullStudent student = (Student) o;return sex == student.sex && age == student.age && Objects.equals(name, student.name);}/**自己重写equals,自己定制相等规则。两个对象的内容一样就认为是相等的s1.equals(s2)比较者:s1 == this被比较者: s2 ==> o*//*   @Overridepublic boolean equals(Object o){// 1、判断o是不是学生类型if(o instanceof Student){Student s2 = (Student) o;// 2、判断2个对象的内容是否一样。
//            if(this.name.equals(s2.name) &&
//                 this.age == s2.age && this.sex == s2.sex){
//                return true;
//            }else {
//                return false;
//            }return this.name.equals(s2.name) && this.age == s2.age&& this.sex == s2.sex ;}else {// 学生只能和学生比较,否则结果一定是falsereturn false;}}*/@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", sex=" + sex +", age=" + age +'}';}
}package com.itheima.d9_api_object;import java.util.Objects;/**目标:掌握Object类中equals方法的使用。*/
public class Test2 {public static void main(String[] args) {Student s1 = new Student("周雄", '男', 19);Student s2 = new Student("周雄", '男', 19);// equals默认是比较2个对象的地址是否相同,子类重写后会调用子类重写的来比较内容是否相同。System.out.println(s1.equals(s2));System.out.println(s1 == s2);System.out.println(Objects.equals(s1, s2));}
}

StringBuilder

StringBuilder是一个可变的字符串类,我们可以把它看成是一个对象容器。

拼接、反转字符串建议使用StringBuilder:

String :内容是不可变的、拼接字符串性能差。

StringBuilder:内容是可变的、拼接字符串性能好、代码优雅。

使用情况

定义字符串使用String

拼接、修改等操作字符串使用StringBuilder

public StringBuilder()

创建一个空白的可变的字符串对象,不包含任何内容

public StringBuilder(String str)

创建一个指定字符串内容的可变字符串对象

public StringBuilder append(任意类型)

添加数据并返回StringBuilder对象本身

public StringBuilder reverse()

将对象的内容反转

public int length()

返回对象内容长度

public String toString()

通过toString()就可以实现把StringBuilder转换为String

public class Test {public static void main(String[] args) {StringBuilder sb = new StringBuilder();sb.append("a");sb.append("b");sb.append("c");System.out.println(sb);}
}

Math类

包含执行基本数字运算的方法,Math类没有提供公开的构造器。

如何使用类中的成员呢?看类的成员是否都是静态的,如果是,通过类名就可以直接调用

Math 类的常用方法

方法名

说明

public static int abs​(int a)

获取参数绝对值

public static double ceil​(double a)

向上取整

public static double floor​(double a)

向下取整

public static int round​(float a)

四舍五入

public static int max​(int a,int b)

获取两个int值中的较大值

public static double pow​(double a,double b)

返回ab次幂的值

public static double random​()

返回值为double的随机值,范围[0.0,1.0)

package com.itheima.d12_math;/**目标:Math类的使用。Math用于做数学运算。Math类中的方法全部是静态方法,直接用类名调用即可。方法:方法名                                          说明public static int abs(int a)                   获取参数a的绝对值:public static double ceil(double a)            向上取整public static double floor(double a)           向下取整public static double pow(double a, double b)   获取a的b次幂public static long round(double a)             四舍五入取整小结:记住。*/
public class MathDemo {public static void main(String[] args) {// 1.取绝对值:返回正数System.out.println(Math.abs(10)); // 10System.out.println(Math.abs(-10.3)); // 10.3// 2.向上取整: 5System.out.println(Math.ceil(4.00000001)); // 5.0System.out.println(Math.ceil(4.0)); // 4.0// 3.向下取整:4System.out.println(Math.floor(4.99999999)); // 4.0System.out.println(Math.floor(4.0)); // 4.0// 4.求指数次方System.out.println(Math.pow(2 , 3)); // 2^3 = 8.0// 5.四舍五入 10System.out.println(Math.round(4.49999)); // 4System.out.println(Math.round(4.500001)); // 5System.out.println(Math.random());  // 0.0 - 1.0 (包前不包后)// 拓展: 3 - 9 之间的随机数  (0 - 6) + 3//  [0 - 6] + 3int data =  (int)(Math.random() * 7) + 3;System.out.println(data);}
}

System

System也是一个工具类,代表了当前系统,提供了一些与系统相关的方法。

System 类的常用方法

方法名

说明

public static void exit​(int status)

终止当前运行的 Java 虚拟机,非零表示异常终止

public static long currentTimeMillis​()

返回当前系统的时间毫秒值形式

public static void arraycopy(数据源数组, 起始索引, 目的地数组, 起始索引, 拷贝个数)

数组拷贝

终止当前运行的 Java 虚拟机 

System.exit(0); // JVM终止!

 返回当前系统的时间毫秒值形式

long time = System.currentTimeMillis();
System.out.println(time);//1643334543214

进行时间的计算:性能分析 

        long startTime = System.currentTimeMillis();// 进行时间的计算:性能分析for (int i = 0; i < 100000; i++) {System.out.println("输出:" + i);}long endTime = System.currentTimeMillis();System.out.println((endTime - startTime)/1000.0 + "s");

做数组拷贝

        /**arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length)参数一:被拷贝的数组参数二:从哪个索引位置开始拷贝参数三:复制的目标数组参数四:粘贴位置参数五:拷贝元素的个数*/int[] arr1 = {10, 20, 30, 40, 50, 60, 70};int[] arr2 = new int[6]; // [0, 0, 0, 0, 0, 0] ==>  [0, 0, 40, 50, 60, 0]System.arraycopy(arr1, 3, arr2, 2, 3);System.out.println(Arrays.toString(arr2));

[0, 0, 40, 50, 60, 0]

BigDecimal

用于解决浮点型运算精度失真的问题

创建对象BigDecimal封装浮点型数据(最好的方式是调用方法)

public static BigDecimal valueOf(double val):   包装浮点数成为BigDecimal对象

方法名

说明

public BigDecimal add(BigDecimal b)

加法

public BigDecimal subtract(BigDecimal b)

减法

public BigDecimal multiply(BigDecimal b)

乘法

public BigDecimal divide(BigDecimal b)

除法

public BigDecimal divide (另一个BigDecimal对象,精确几位,舍入模式)

除法

package com.itheima.d14_bigdecimal;import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;/**目标:BigDecimal大数据类。引入:浮点型运算的时候直接+  * / 可能会出现数据失真(精度问题)。BigDecimal可以解决浮点型运算数据失真的问题。BigDicimal类:包:java.math.创建对象的方式(最好的方式:)public static BigDecimal valueOf(double val) :包装浮点数成为大数据对象。方法声明public BigDecimal add(BigDecimal value)       加法运算public BigDecimal subtract(BigDecimal value)  减法运算 public BigDecimal multiply(BigDecimal value)  乘法运算 public BigDecimal divide(BigDecimal value)    除法运算public double doubleValue(): 把BigDecimal转换成double类型。*/
public class BigDecimalDemo {public static void main(String[] args) {// 浮点型运算的时候直接+  * / 可能会出现数据失真(精度问题)。System.out.println(0.09 + 0.01);System.out.println(1.0 - 0.32);System.out.println(1.015 * 100);System.out.println(1.301 / 100);System.out.println("-------------------------");double a = 0.1;double b = 0.2;double c = a + b;System.out.println(c);System.out.println("--------------------------");// 包装浮点型数据成为大数据对象 BigDeciamlBigDecimal a1 = BigDecimal.valueOf(a);BigDecimal b1 = BigDecimal.valueOf(b);BigDecimal c1 = a1.add(b1);// BigDecimal c1 = a1.subtract(b1);// BigDecimal c1 = a1.multiply(b1);// BigDecimal c1 = a1.divide(b1);System.out.println(c1);// 目的:doubledouble rs = c1.doubleValue();System.out.println(rs);// 注意事项:BigDecimal是一定要精度运算的BigDecimal a11 = BigDecimal.valueOf(10.0);BigDecimal b11 = BigDecimal.valueOf(3.0);/**参数一:除数 参数二:保留小数位数  参数三:舍入模式*/BigDecimal c11 = a11.divide(b11, 2, RoundingMode.HALF_UP); // 3.3333333333System.out.println(c11);System.out.println("-------------------");}
}

0.09999999999999999
0.6799999999999999
101.49999999999999
0.013009999999999999
-------------------------
0.30000000000000004
--------------------------
0.3
0.3
3.33
-------------------

Date :当前所在系统日期时间信息

Date d = new Date();    //代表系统此刻日期时间对象
long time = d.getTime();    //获取时间毫秒值//当前时间往后走 1小时  121s
long time = System.currentTimeMillis();
time += (60 * 60 + 121) * 1000;//把时间毫秒值转换成对应的日期对象
Date d = new Date(time);//修改时间
Date d = new Date();
d3.setTime(time);

Fri Jan 28 10:13:30 HKT 2022
1643336010844 

SimpleDateFormat 类:日期时间的格式化操作

Fri Jan 28 10:13:30 CST 2022--->2022年12810:13:30

  •   y    年
  •   M    月
  •   d    日
  •   H    时
  •   m    分
  •   s    秒
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
String rs = sdf.format(d);long time1 = System.currentTimeMillis()
String rs2 = sdf.format(time1);
        // 1、日期对象Date d = new Date();System.out.println(d);// 2、格式化这个日期对象 (指定最终格式化的形式)SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");// 3、开始格式化日期对象成为喜欢的字符串形式String rs = sdf.format(d);System.out.println(rs);System.out.println("----------------------------");// 4、格式化时间毫秒值// 需求:请问121秒后的时间是多少long time1 = System.currentTimeMillis() + 121 * 1000;String rs2 = sdf.format(time1);System.out.println(rs2);

Fri Jan 28 10:16:17 HKT 2022
2022年01月28日 10:16:17 周五 上午
----------------------------
2022年01月28日 10:18:18 周五 上午

SimpleDateFormat解析字符串时间成为日期对象

Date d = sdf.parse(dateStr);
// 目标: 学会使用SimpleDateFormat解析字符串时间成为日期对象。// 有一个时间 2021年08月06日 11:11:11 往后 2天 14小时 49分 06秒后的时间是多少。// 1、把字符串时间拿到程序中来String dateStr = "2021年08月06日 11:11:11";// 2、把字符串时间解析成日期对象(本节的重点):形式必须与被解析时间的形式完全一样,否则运行时解析报错!SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");Date d = sdf.parse(dateStr);// 3、往后走2天 14小时 49分 06秒long time = d.getTime() + (2L*24*60*60 + 14*60*60 + 49*60 + 6) * 1000;// 4、格式化这个时间毫秒值就是结果System.out.println(sdf.format(time));

Calendar:系统此刻日期对应的日历对象

Calendar是一个抽象类,不能直接创建对象。

    Calendar日历类创建日历对象的语法:Calendar rightNow = Calendar.getInstance();Calendar的方法:1.public static Calendar getInstance(): 返回一个日历类的对象。2.public int get(int field):取日期中的某个字段信息。3.public void set(int field,int value):修改日历的某个字段信息。4.public void add(int field,int amount):为某个字段增加/减少指定的值5.public final Date getTime(): 拿到此刻日期对象。6.public long getTimeInMillis(): 拿到此刻时间毫秒值
package com.itheima.d3_calendar;import javax.xml.crypto.Data;
import java.util.Calendar;
import java.util.Date;public class CalendarDemo{public static void main(String[] args) {// 1、拿到系统此刻日历对象Calendar cal = Calendar.getInstance();System.out.println(cal);// 2、获取日历的信息:public int get(int field):取日期中的某个字段信息。int year = cal.get(Calendar.YEAR);System.out.println(year);int mm = cal.get(Calendar.MONTH) + 1;System.out.println(mm);int days = cal.get(Calendar.DAY_OF_YEAR) ;System.out.println(days);// 3、public void set(int field,int value):修改日历的某个字段信息。// cal.set(Calendar.HOUR , 12);// System.out.println(cal);// 4.public void add(int field,int amount):为某个字段增加/减少指定的值// 请问64天后是什么时间cal.add(Calendar.DAY_OF_YEAR , 64);cal.add(Calendar.MINUTE , 59);//  5.public final Date getTime(): 拿到此刻日期对象。Date d = cal.getTime();System.out.println(d);//  6.public long getTimeInMillis(): 拿到此刻时间毫秒值long time = cal.getTimeInMillis();System.out.println(time);}
}

java.util.GregorianCalendar[time=1643336750682,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo

[id="Asia/Hong_Kong",offset=28800000,dstSavings=0,useDaylight=false,transitions=71,lastRule=null],

firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=0,WEEK_OF_YEAR=5,WEEK_OF_MONTH=5,

DAY_OF_MONTH=28,DAY_OF_YEAR=28,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=10,

HOUR_OF_DAY=10,MINUTE=25,SECOND=50,MILLISECOND=682,ZONE_OFFSET=28800000,DST_OFFSET=0]
2022
1
28
Sat Apr 02 11:24:50 HKT 2022
1648869890682

JDK8新增日期类

LocalDate:不包含具体时间的日期。
LocalTime:不含日期的时间。
LocalDateTime:包含了日期及时间。
Instant:代表的是时间戳。
DateTimeFormatter 用于做时间的格式化和解析的
Duration:用于计算两个“时间”间隔
Period:用于计算两个“日期”间隔

Instant时间戳

  • 时间戳是包含日期和时间的,与java.util.Date很类似,事实上Instant就是类似JDK8 以前的Date。
  • Instant和Date这两个类可以进行转换。
package com.itheima.d4_jdk8_time;import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;public class Demo05Instant {public static void main(String[] args) {// 1、得到一个Instant时间戳对象Instant instant = Instant.now();System.out.println(instant);// 2、系统此刻的时间戳怎么办?Instant instant1 = Instant.now();System.out.println(instant1.atZone(ZoneId.systemDefault()));// 3、如何去返回Date对象Date date = Date.from(instant);System.out.println(date);Instant i2 = date.toInstant();System.out.println(i2);}
}

2022-01-28T02:34:50.645395800Z
2022-01-28T10:34:50.654372600+08:00[Asia/Hong_Kong]
Fri Jan 28 10:34:50 HKT 2022
2022-01-28T02:34:50.645Z

DateTimeFormatter

日期与时间格式器,正反都能调用format方法

package com.itheima.d4_jdk8_time;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class Demo06DateTimeFormat {public static void main(String[] args) {// 本地此刻  日期时间 对象LocalDateTime ldt = LocalDateTime.now();System.out.println(ldt);// 解析/格式化器DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");// 正向格式化System.out.println(dtf.format(ldt));// 逆向格式化System.out.println(ldt.format(dtf));// 解析字符串时间DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");// 解析当前字符串时间成为本地日期时间对象LocalDateTime ldt1 = LocalDateTime.parse("2019-11-11 11:11:11" ,  dtf1);System.out.println(ldt1);System.out.println(ldt1.getDayOfYear());}
}

2022-01-28T10:36:24.292803800
2022-01-28 10:36:24 周五 上午
2022-01-28 10:36:24 周五 上午
2019-11-11T11:11:11
315

Duration:  用于计算两个“时间”间隔

在Java8中,我们可以使用以下类来计算时间间隔差异:java.time.Duration
提供了使用基于时间的值测量时间量的方法。
用于 LocalDateTime 之间的比较。也可用于 Instant 之间的比较。

        // 本地日期时间对象。LocalDateTime today = LocalDateTime.now();System.out.println(today);// 出生的日期时间对象LocalDateTime birthDate = LocalDateTime.of(2021,8,06,01,00,00);System.out.println(birthDate);Duration duration = Duration.between(  today , birthDate);//第二个参数减第一个参数System.out.println(duration.toDays());//两个时间差的天数System.out.println(duration.toHours());//两个时间差的小时数System.out.println(duration.toMinutes());//两个时间差的分钟数System.out.println(duration.toMillis());//两个时间差的毫秒数System.out.println(duration.toNanos());//两个时间差的纳秒数

Period:      用于计算两个“日期”间隔

在Java8中,我们可以使用以下类来计算日期间隔差异:java.time.Period
主要是 Period 类方法 getYears(),getMonths() 和 getDays() 来计算,只能精确到年月日。
用于 LocalDate 之间的比较。

        // 当前本地 年月日LocalDate today = LocalDate.now();System.out.println(today);//// 生日的 年月日LocalDate birthDate = LocalDate.of(1998, 10, 13);System.out.println(birthDate);Period period = Period.between(birthDate, today);//第二个参数减第一个参数System.out.println(period.getYears());System.out.println(period.getMonths());System.out.println(period.getDays());

ChronoUnit类可用于在单个时间单位内测量一段时间

这个工具类是最全的了,可以用于比较所有的时间单位

package com.itheima.d4_jdk8_time;import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;public class Demo09ChronoUnit {public static void main(String[] args) {// 本地日期时间对象:此刻的LocalDateTime today = LocalDateTime.now();System.out.println(today);// 生日时间LocalDateTime birthDate = LocalDateTime.of(1990,10,1,10,50,59);System.out.println(birthDate);System.out.println("相差的年数:" + ChronoUnit.YEARS.between(birthDate, today));System.out.println("相差的月数:" + ChronoUnit.MONTHS.between(birthDate, today));System.out.println("相差的周数:" + ChronoUnit.WEEKS.between(birthDate, today));System.out.println("相差的天数:" + ChronoUnit.DAYS.between(birthDate, today));System.out.println("相差的时数:" + ChronoUnit.HOURS.between(birthDate, today));System.out.println("相差的分数:" + ChronoUnit.MINUTES.between(birthDate, today));System.out.println("相差的秒数:" + ChronoUnit.SECONDS.between(birthDate, today));System.out.println("相差的毫秒数:" + ChronoUnit.MILLIS.between(birthDate, today));System.out.println("相差的微秒数:" + ChronoUnit.MICROS.between(birthDate, today));System.out.println("相差的纳秒数:" + ChronoUnit.NANOS.between(birthDate, today));System.out.println("相差的半天数:" + ChronoUnit.HALF_DAYS.between(birthDate, today));System.out.println("相差的十年数:" + ChronoUnit.DECADES.between(birthDate, today));System.out.println("相差的世纪(百年)数:" + ChronoUnit.CENTURIES.between(birthDate, today));System.out.println("相差的千年数:" + ChronoUnit.MILLENNIA.between(birthDate, today));System.out.println("相差的纪元数:" + ChronoUnit.ERAS.between(birthDate, today));}
}

2022-01-28T10:41:03.186356600
1990-10-01T10:50:59
相差的年数:31
相差的月数:375
相差的周数:1634
相差的天数:11441
相差的时数:274607
相差的分数:16476470
相差的秒数:988588204
相差的毫秒数:988588204186
相差的微秒数:988588204186356
相差的纳秒数:988588204186356600
相差的半天数:22883
相差的十年数:3
相差的世纪(百年)数:0
相差的千年数:0
相差的纪元数:0

包装类

其实就是8种基本数据类型对应的引用类型

Java为了实现一切皆对象,为8种基本类型提供了对应的引用类型。

后面的集合和泛型其实也只能支持包装类型,不支持基本数据类型

基本数据类型

引用数据类型

byte

Byte

short

Short

int

Integer

long

Long

char

Character

float

Float

double

Double

boolean

Boolean

自动装箱基本类型的数据和变量可以直接赋值给包装类型的变量

自动拆箱:包装类型的变量可以直接赋值给基本数据类型的变量

包装类的特有功能

  • 包装类的变量的默认值可以是null,容错率更高。
  • 可以把基本类型的数据转换成字符串类型(用处不大)
  • 可以把字符串类型的数值转换成真实的数据类型(真的很有用)
int age = Integer.valueOf(number);
double score = Double.valueOf(number1);
package com.itheima.d5_integer;/**目标:明白包装类的概念,并使用。*/
public class Test {public static void main(String[] args) {int a = 10;Integer a1 = 11;Integer a2 = a; // 自动装箱System.out.println(a);System.out.println(a1);Integer it = 100;int it1 = it; // 自动拆箱System.out.println(it1);double db = 99.5;Double db2 = db; // 自动装箱了double db3 = db2; // 自动拆箱System.out.println(db3);// int age = null; // 报错了!Integer age1 = null;Integer age2 = 0;System.out.println("-----------------");// 1、包装类可以把基本类型的数据转换成字符串形式。(没啥用)Integer i3 = 23;String rs = i3.toString();System.out.println(rs + 1);String rs1 = Integer.toString(i3);System.out.println(rs1 + 1);// 可以直接+字符串得到字符串类型String rs2 = i3 + "";System.out.println(rs2 + 1);System.out.println("-----------------");String number = "23";//转换成整数// int age = Integer.parseInt(number);int age = Integer.valueOf(number);System.out.println(age + 1);String number1 = "99.9";//转换成小数//double score = Double.parseDouble(number1);double score = Double.valueOf(number1);System.out.println(score + 0.1);}
}

10
11
100
99.5
-----------------
231
231
231
-----------------
24
100.0

正则表达式

public boolean matches(String regex):判断是否与正则表达式匹配,匹配返回true

字符类(默认匹配一个字符)

[abc]         只能是a, b, c

[^abc]         除了a, b, c之外的任何字符

[a-zA-Z]               az AZ,包括(范围)

[a-d[m-p]]         ad,或m通过p:([a-dm-p]联合)

[a-z&&[def]]         d, e, f(交集)

[a-z&&[^bc]]         az,除了bc:([ad-z]减法)

[a-z&&[^m-p]]     az,除了mp:([a-lq-z]减法)

预定义的字符类(默认匹配一个字符)

任何字符

\d  一个数字: [0-9]

\D  非数字: [^0-9]

\s  一个空白字符: [ \t\n\x0B\f\r]

\S  非空白字符: [^\s]

\w  [a-zA-Z_0-9] 英文、数字、下划线

\W  [^\w] 一个非单词字符

贪婪的量词(配合匹配多个字符)

X?  X , 一次或根本不

X*  X,零次或多次

X+  X , 一次或多次

X {n}  X,正好n

X {n, }  X,至少n

X {n,m}  X,至少n但不超过m

        // 只能是 a  b  cSystem.out.println("a".matches("[abc]")); // trueSystem.out.println("z".matches("[abc]")); // false// 不能出现a  b  cSystem.out.println("a".matches("[^abc]")); // falseSystem.out.println("z".matches("[^abc]")); // trueSystem.out.println("a".matches("\\d")); // falseSystem.out.println("3".matches("\\d")); // trueSystem.out.println("333".matches("\\d")); // falseSystem.out.println("z".matches("\\w")); // trueSystem.out.println("2".matches("\\w")); // trueSystem.out.println("21".matches("\\w")); // falseSystem.out.println("你".matches("\\w")); //falseSystem.out.println("你".matches("\\W")); // trueSystem.out.println("---------------------------------");//  以上正则匹配只能校验单个字符。// 校验密码// 必须是数字 字母 下划线 至少 6位System.out.println("2442fsfsf".matches("\\w{6,}"));System.out.println("244f".matches("\\w{6,}"));// 验证码 必须是数字和字符  必须是4位System.out.println("23dF".matches("[a-zA-Z0-9]{4}"));System.out.println("23_F".matches("[a-zA-Z0-9]{4}"));System.out.println("23dF".matches("[\\w&&[^_]]{4}"));System.out.println("23_F".matches("[\\w&&[^_]]{4}"));

 public String replaceAll(String regex,String newStr)

按照正则表达式匹配的内容进行替换

public String[] split(String regex)

按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组。

        String names = "小路dhdfhdf342蓉儿43fdffdfbjdfaf小何";String[] arrs = names.split("\\w+");for (int i = 0; i < arrs.length; i++) {System.out.println(arrs[i]);}String names2 = names.replaceAll("\\w+", "  ");System.out.println(names2);

小路
蓉儿
小何
小路  蓉儿  小何

正则表达式爬取信息中的内容

package com.itheima.d6_regex;import java.util.regex.Matcher;
import java.util.regex.Pattern;/**拓展:正则表达式爬取信息中的内容。(了解)*/
public class RegexDemo05 {public static void main(String[] args) {String rs = "来黑马程序学习Java,电话020-43422424,或者联系邮箱" +"itcast@itcast.cn,电话18762832633,0203232323" +"邮箱bozai@itcast.cn,400-100-3233 ,4001003232";// 需求:从上面的内容中爬取出 电话号码和邮箱。// 1、定义爬取规则,字符串形式String regex = "(\\w{1,30}@[a-zA-Z0-9]{2,20}(\\.[a-zA-Z0-9]{2,20}){1,2})|(1[3-9]\\d{9})" +"|(0\\d{2,6}-?\\d{5,20})|(400-?\\d{3,9}-?\\d{3,9})";// 2、把这个爬取规则编译成匹配对象。Pattern pattern = Pattern.compile(regex);// 3、得到一个内容匹配器对象Matcher matcher = pattern.matcher(rs);// 4、开始找了while (matcher.find()) {String rs1 = matcher.group();System.out.println(rs1);}}
}

020-43422424
itcast@itcast.cn
18762832633
0203232323
bozai@itcast.cn
400-100-3233
4001003232

Arrays类:数组操作工具类,专门用于操作数组元素的。

public static String toString​(类型[] a)

返回数组的内容(字符串形式)

public static void sort​(类型[] a)

对数组进行默认升序排序

public static <T> void sort​(类型[] a, Comparator<? super T> c)

使用比较器对象自定义排序

public static int binarySearch​(int[] a, int key)

二分搜索数组中的数据,存在返回索引,不存在返回-1

package com.itheima.d7_arrays;import java.util.Arrays;public class ArraysDemo1 {public static void main(String[] args) {// 目标:学会使用Arrays类的常用API ,并理解其原理int[] arr = {10, 2, 55, 23, 24, 100};System.out.println(arr);// 1、返回数组内容的 toString(数组)
//        String rs = Arrays.toString(arr);
//        System.out.println(rs);System.out.println(Arrays.toString(arr));// 2、排序的API(默认自动对数组元素进行升序排序)Arrays.sort(arr);System.out.println(Arrays.toString(arr));// 3、二分搜索技术(前提数组必须排好序才支持,否则出bug)int index = Arrays.binarySearch(arr, 55);System.out.println(index);// 返回不存在元素的规律: - (应该插入的位置索引 + 1)int index2 = Arrays.binarySearch(arr, 22);System.out.println(index2);// 注意:数组如果没有排好序,可能会找不到存在的元素,从而出现bug!!int[] arr2 = {12, 36, 34, 25 , 13,  24,  234, 100};System.out.println(Arrays.binarySearch(arr2 , 36));}}

[I@776ec8df
[10, 2, 55, 23, 24, 100]
[2, 10, 23, 24, 55, 100]
4
-3
-7

public static void sort​(类型[] a)

对数组进行默认升序排序

public static <T> void sort​(类型[] a, Comparator<? super T> c)

使用比较器对象自定义排序

package com.itheima.d7_arrays;import java.util.Arrays;
import java.util.Comparator;public class ArraysDemo2 {public static void main(String[] args) {// 目标:自定义数组的排序规则:Comparator比较器对象。// 1、Arrays的sort方法对于有值特性的数组是默认升序排序int[] ages = {34, 12, 42, 23};Arrays.sort(ages);System.out.println(Arrays.toString(ages));// 2、需求:降序排序!(自定义比较器对象,只能支持引用类型的排序!!)Integer[] ages1 = {34, 12, 42, 23};/**参数一:被排序的数组 必须是引用类型的元素参数二:匿名内部类对象,代表了一个比较器对象。*/Arrays.sort(ages1, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {// 指定比较规则。
//                if(o1 > o2){
//                    return 1;
//                }else if(o1 < o2){
//                    return -1;
//                }
//                return 0;// return o1 - o2; // 默认升序return o2 - o1; //  降序}});System.out.println(Arrays.toString(ages1));System.out.println("-------------------------");Student[] students = new Student[3];students[0] = new Student("吴磊",23 , 175.5);students[1] = new Student("谢鑫",18 , 185.5);students[2] = new Student("王亮",20 , 195.5);System.out.println(Arrays.toString(students));// Arrays.sort(students);  // 直接运行奔溃Arrays.sort(students, new Comparator<Student>() {@Overridepublic int compare(Student o1, Student o2) {// 自己指定比较规则// return o1.getAge() - o2.getAge(); // 按照年龄升序排序!// return o2.getAge() - o1.getAge(); // 按照年龄降序排序!!// return Double.compare(o1.getHeight(), o2.getHeight()); // 比较浮点型可以这样写 升序return Double.compare(o2.getHeight(), o1.getHeight()); // 比较浮点型可以这样写  降序}});System.out.println(Arrays.toString(students));}
}
package com.itheima.d7_arrays;public class Student {private String name;private int age;private double height;public Student() {}public Student(String name, int age, double height) {this.name = name;this.age = age;this.height = height;}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;}public double getHeight() {return height;}public void setHeight(double height) {this.height = height;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", age=" + age +", height=" + height +'}';}
}

常见算法

冒泡排序

package com.itheima.d8_sort_binarysearch;import java.util.Arrays;/**目标:学会使用选择排序的方法对数组进行排序。*/
public class Test1 {public static void main(String[] args) {// 1、定义数组int[] arr = {5, 1, 3, 2};//           0  1  2  3// 2、定义一个循环控制选择几轮: arr.length - 1for (int i = 0; i < arr.length - 1; i++) {// i = 0   j =  1  2  3// i = 1   j =  2  3// i = 2   j =  3// 3、定义内部循环,控制选择几次for (int j = i + 1; j < arr.length; j++) {// 当前位:arr[i]// 如果有比当前位数据更小的,则交换if(arr[i] > arr[j]) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}System.out.println(Arrays.toString(arr));}
}

选择排序

二分查找

  • 定义变量记录左边和右边位置。
  • 使用while循环控制查询(条件是左边位置<=右边位置)
  • 循环内部获取中间元素索引
  • 判断当前要找的元素如果大于中间元素,左边位置=中间索引+1
  • 判断当前要找的元素如果小于中间元素,右边位置=中间索引-1
  • 判断当前要找的元素如果等于中间元素,返回当前中间元素索引
package com.itheima.d8_sort_binarysearch;/**目标:理解二分搜索的原理并实现。*/
public class Test2 {public static void main(String[] args) {// 1、定义数组int[] arr = {10, 14, 16, 25, 28, 30, 35, 88, 100};//                                            r//                                                l//System.out.println(binarySearch(arr , 35));System.out.println(binarySearch(arr , 350));}/*** 二分查找算法的实现* @param arr  排序的数组* @param data 要找的数据* @return  索引,如果元素不存在,直接返回-1*/public static int binarySearch(int[] arr, int data){// 1、定义左边位置  和 右边位置int left = 0;int right = arr.length - 1;// 2、开始循环,折半查询。while (left <= right){// 取中间索引int middleIndex = (left + right) / 2;// 3、判断当前中间位置的元素和要找的元素的大小情况if(data > arr[middleIndex]) {// 往右边找,左位置更新为 = 中间索引+1left = middleIndex + 1;}else if(data < arr[middleIndex]) {// 往左边找,右边位置 = 中间索引 - 1right = middleIndex - 1;}else {return middleIndex;}}return -1; // 查无此元素}}

Lambda简化匿名内部类的代码写法

Lambda表达式只能简化函数式接口的匿名内部类的写法形式

(匿名内部类被重写方法的形参列表) -> {被重写方法的方法体代码。
}
注:-> 是语法形式,无实际含义
package com.itheima.d9_lambda;public class LambdaDemo2 {public static void main(String[] args) {// 目标:学会使用Lambda的标准格式简化匿名内部类的代码形式// 注意:Lambda只能简化接口中只有一个抽象方法的匿名内部类形式(函数式接口)
//        Swimming s1 = new Swimming() {
//            @Override
//            public void swim() {
//                System.out.println("老师游泳贼溜~~~~~");
//            }
//        };//        Swimming s1 = () -> {
//            System.out.println("老师游泳贼溜~~~~~");
//        };Swimming s1 = () -> System.out.println("老师游泳贼溜~~~~~");go(s1);System.out.println("---------------------");
//        go(new Swimming() {
//            @Override
//            public void swim() {
//                System.out.println("学生游泳很开心~~~");
//            }
//        });//        go(() ->{
//                System.out.println("学生游泳很开心~~~");
//        });go(() -> System.out.println("学生游泳很开心~~~"));}public static void go(Swimming s){System.out.println("开始。。。");s.swim();System.out.println("结束。。。");}
}@FunctionalInterface // 一旦加上这个注解必须是函数式接口,里面只能有一个抽象方法
interface Swimming{void swim();
}

Lambda表达式的省略写法(进一步在Lambda表达式的基础上继续简化)

参数类型可以省略不写。

如果只有一个参数,参数类型可以省略,同时()也可以省略。

如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!

如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 5. Maven属性与Profile

    项目基于spring框架开发时需要引入大量的spring模块&#xff0c;例如core、beans、context、jdbc等&#xff0c;在引入上述模块时所用的都是同一个版本的模块&#xff0c;此时我们会定义一个maven属性来处理这种应用场景。但maven的属性还有更多应用场景。 Maven属性分类 内置…...

    2024/4/27 20:15:08
  2. 更新应用时,如何实现 K8s 零中断滚动更新?

    Kubernetes 集群中&#xff0c;业务通常采用 Deployment LoadBalancer 类型 Service 的方式对外提供服务&#xff0c;其典型部署架构如图 1 所示。这种架构部署和运维都十分简单方便&#xff0c;但是在应用更新或者升级时可能会存在服务中断&#xff0c;引发线上问题。今天我们…...

    2024/4/27 19:28:24
  3. C++进阶----继承

    C进阶----继承1)继承①继承父类成员访问方式的变化②父子类赋值转换③隐藏(重定义)④子类的4个默认成员函数(const取地址略)子类构造函数子类拷贝构造子类赋值重载子类析构函数⑤友元⑥静态成员⑦菱形继承⑧虚继承(virtual)⑨组合1)继承 概念&#xff1a; 继承机制是面向对象程…...

    2024/4/14 0:37:31
  4. 基于docker容器搭建redis集群(3主三从)

    基于docker容器搭建redis集群(3主三从) 一、容器准备 从镜像仓库拉取centos基础镜像&#xff0c;然后创建容器后初始化环境&#xff0c;安装gcc、tar、ssh、telnet等一些常用命令和环境依赖&#xff0c;然后创建test01用户并设置密码。然后将初始化好的容器打包为镜像作为真正…...

    2024/4/18 18:01:12
  5. 如何在xml文件中引入约束

    1、先搞清楚为啥要对xml编写进行约束&#xff1f; <?xml version"1.0" encoding"utf-8" ?> <?xml-stylesheet type"text/css" href"a.css" ?><users><user id"zhangsan"><name>张三<…...

    2024/4/16 14:30:06
  6. 一种自主性信道资源选择方法-007

    ...

    2024/4/14 1:11:07
  7. P1031 [NOIP2002 提高组] 均分纸牌

    题目描述 有N堆纸牌&#xff0c;编号分别为 1,2,…,N。每堆上有若干张&#xff0c;但纸牌总数必为N的倍数。可以在任一堆上取若干张纸牌&#xff0c;然后移动。 移牌规则为&#xff1a;在编号为1堆上取的纸牌&#xff0c;只能移到编号为2的堆上&#xff1b;在编号为N的堆上取…...

    2024/4/14 0:37:46
  8. iOS底层系列之<41>--多线程<十一>同步串行队列控制线程执行

    用同步串行队列&#xff0c;控制想要执行的任务挨个执行 #import "dispatchQueueVC.h"interface dispatchQueueVC () property (strong, nonatomic) dispatch_queue_t ticketQueue; property (strong, nonatomic) dispatch_queue_t moneyQueue; endimplementation d…...

    2024/4/24 16:15:03
  9. 2. 在Navicat Premium上,调出能写sql 语句的步骤

    文章目录公共操作1. 选中test连接&#xff0c;点击查询&#xff0c;再新建查询2. 选中数据库&#xff08;不能选空白&#xff09;写sql语句,运行1. select语句2.create table 语句3. insert into 语句4. 可以合在一块写公共操作 1. 选中test连接&#xff0c;点击查询&#xff…...

    2024/4/14 20:16:06
  10. GenericObjectPool连接池

    最近项目中使用Spring data redis lettuce管理redis连接。 其通过GenericObjectPool管理连接池&#xff0c;具体lettuce怎么用的连接池暂不考虑&#xff0c;仅关注池对象&#xff08;连接&#xff09;是如何管理的。 GenericObjectPool连接池idle对象及其清理 使用自动装配的…...

    2024/4/16 17:51:44
  11. 迪赛智慧数——其他图表(平行坐标图):一线、新一线城市春节返乡人群画像对比

    数据源&#xff1a;静态数据 {"column": ["年份","男","女","24岁以下","25-34岁","35-44岁","45岁"],"data": [["2020年",53.1, 46.9, 38.4, 23.8, 15.9, 20],["…...

    2024/4/14 0:37:31
  12. 2021年全球以太网供电(POE)控制器收入大约269.2百万美元,预计2028年达到363.9百万美元

    本文研究全球市场、主要地区和主要国家以太网供电&#xff08;POE&#xff09;控制器的销量、销售收入等&#xff0c;同时也重点分析全球范围内主要厂商&#xff08;品牌&#xff09;竞争态势&#xff0c;以太网供电&#xff08;POE&#xff09;控制器销量、价格、收入和市场份…...

    2024/4/14 0:37:36
  13. 阶乘后的零

    class Solution { public int trailingZeroes(int n) {int zeroCount 0;long currentMultiple 5;while (n > 0) {n / 5;zeroCount n;}return zeroCount; } }...

    2024/4/14 0:37:16
  14. Android adb启动任意app的几种方式

    一、知道app包名和主Activity 命令行输入 adb shell am start 包名/.Activity (要启动的Activity) adb shell am start com.android.settings/.HWSettings或者命令行中输入adb shell am start -W -n 包名/.Activity adb shell am start -W -n com.android.settings/.Setting…...

    2024/4/14 0:37:46
  15. 【AcWing 787. 归并排序】题解

    【AcWing 787. 归并排序】 ​ 板子&#xff1a;【排序板子】 归并排序原理 有序序列的归并&#xff1a;利用有序序列的单调性质&#xff0c;设置双指针对序列进行扫描&#xff0c;合并后的序列保持单调性不变。 ​ 令 iii &#xff0c;jjj 双指针分别指向两个递增序列 AAA &…...

    2024/4/14 0:38:32
  16. 两行代码,给Python脚本生成命令行,你确定你都了解吗?

    有时候我们会有这样的一个需求&#xff1a; 我们定义了一个 Python 的方法&#xff0c;方法接收一些参数&#xff0c;但是调用的时候想将这些参数用命令行暴露出来。 比如说这里有个爬取方法&#xff1a; import requestsdef scrape(url, timeout10):response requests.get…...

    2024/4/20 11:36:31
  17. 迭代器模式(十六)

    文章目录行为模式之-迭代器模式19.1 看一个具体的需求19.2 传统的设计方案(类图)19.3 传统的方式的问题分析19.4 迭代器模式基本介绍19.5 迭代器模式的原理类图19.6 迭代器模式应用实例19.7 迭代器模式在 JDK-ArrayList 集合应用的源码分析19.8 迭代器模式的注意事项和细节行为…...

    2024/4/26 17:12:06
  18. 【Python】别人在认真听课的当儿,我在干什么? 【pyautogui 库模拟鼠标键盘自动操作】

    最近有次在钉钉看直播&#xff0c;发现这个直播非常之精彩。钉钉允许一人点多赞&#xff0c;于是我情不自禁地想要为主播大佬连刷一波 小心心 大拇指&#xff1a; 我发现&#xff0c;手动连击点赞速度十分不可观。气人的是&#xff0c;钉钉直播不能长按点赞&#xff01;这让我很…...

    2024/4/14 0:38:17
  19. JAVASCRIPT IE8兼容问题

    1、<label>标签for属性打开input file&#xff0c;兼容到IE9及以上 //解决方法&#xff0c;使用绝对定位和透明度使input位于上层并且透明&#xff0c;使用户实际点击input.input-parent{position: relative;overflow: hidden; } .input{position: absolute;top: 0;righ…...

    2024/4/20 5:55:00
  20. 性能(六)性能测试常用小技巧Tips

    性能测试常用小技巧Tips一、查询tips二、编辑操作tips三、常规报错&#xff08;做个笔记&#xff0c;自己以后忘了方便查找&#xff0c;会持续更新…&#xff09;一、查询tips &#xff08;1&#xff09;kafka积压查询 ./kafka-consumer-groups.sh --bootstrap-server br-zeu…...

    2024/4/14 0:38:07

最新文章

  1. Node.js在前端的妙用:打造更出色的Web体验

    在Web开发领域&#xff0c;Node.js早已成为一种不可或缺的技术。尽管Node.js最初是作为服务器端技术而闻名&#xff0c;但是在前端开发中&#xff0c;它同样有着令人惊叹的应用。本文将探讨Node.js在前端的各种用途&#xff0c;并展示如何利用它来提升Web应用的性能、可维护性和…...

    2024/4/27 21:02:32
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. audio_video_img图片音视频异步可视化加载

    最近在做即时消息&#xff0c;消息类型除了文字还有音频、视频、图片展示&#xff0c;如果消息很多&#xff0c;在切换聊天框时&#xff0c;会有明显卡顿&#xff0c;后续做了懒加载&#xff0c;方案是只加载用户能看到的资源&#xff0c;看不到的先不加载&#xff1b; LazyAud…...

    2024/4/27 13:10:31
  4. 基于深度学习的机场航拍小目标检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

    摘要&#xff1a;在本博客中介绍了基于YOLOv8/v7/v6/v5的机场航拍小目标检测系统。该系统的核心技术是采用YOLOv8&#xff0c;并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;从而进行性能指标的综合对比。我们详细介绍了国内外在机场航拍小目标检测领域的研究现状、数据集处理…...

    2024/4/26 8:13:40
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/26 20:12:18
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/26 21:56:58
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/26 22:01:59
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57