当前位置: 首页 > news >正文

重生之我要精通JAVA--第八周笔记

文章目录

  • 多线程
    • 线程的状态
    • 线程池
    • 自定义线程池
    • 最大并行数
    • 多线程小练习
  • 网络编程
    • BS架构优缺点
    • CS架构优缺点
    • 三要素
      • IP
        • 特殊IP
        • 常用的CMD命令
    • InetAddress类
    • 端口号
    • 协议
      • UDP协议(重点)
        • UDP三种通信方式
      • TCP协议(重点)
        • 三次握手
        • 四次挥手
  • 反射
    • 获取class的三种方式
    • 利用反射获取构造方法
    • 反射的作用
  • 动态代理
  • 注解
    • 自定义注解
    • 元注解
    • 什么是注解的解析?
    • 如何解析注解?

多线程

线程的状态

image-20240602185209229

新建状态(NEW)—创建线程对象

就绪状态(RUNNABLE)—start方法

阻塞状态(BLOCKED)—无法获得锁对象

等待状态(WAITING)—wait方法

计时等待(TIMED WAITING)—sleep方法

结束状态(TERMINATED)—全部代码运行完毕

线程池

  1. 创建一个池子,池子中是空的
  2. 提交任务时,池子会创建新的线程对象,任务执行完毕,线程归还给池子
    下回再次提交任务时,不需要创建新的线程,直接复用已有的线程即可
  3. 但是如果提交任务时,池子中没有空闲线程,也无法创建新的线程,任务就会排队等待

Executors:线程池的工具类通过调用方法返回不同类型的线程池对象

方法名称说明
public static ExecutorService newCachedThreadPool()创建一个没有上限的线程池
public static ExecutorService newFixedThreadPool(int nThreads)创建有上限的线程池

无上限

public class demo1 {public static void main(String[] args) throws InterruptedException {ExecutorService pool1 = Executors.newCachedThreadPool();pool1.submit(new MyRunable());Thread.sleep(1000);pool1.submit(new MyRunable());Thread.sleep(1000);pool1.submit(new MyRunable());Thread.sleep(1000);pool1.submit(new MyRunable());Thread.sleep(1000);pool1.submit(new MyRunable());pool1.shutdown();}
}
public class MyRunable implements Runnable{@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "hhh");

有上限

public class demo1 {public static void main(String[] args) throws InterruptedException {ExecutorService pool1 = Executors.newFixedThreadPool(3);pool1.submit(new MyRunable());pool1.submit(new MyRunable());pool1.submit(new MyRunable());pool1.submit(new MyRunable());pool1.submit(new MyRunable());pool1.shutdown();}
}

自定义线程池

image-20240602194733323

任务拒绝策略说明
ThreadPoolExecutor.AbortPolicy默认策略:丢弃任务并抛出RejectedExecutionException异常
ThreadPoolExecutor.DiscardPolicy丢弃任务,但是不抛出异常 这是不推荐的做法
ThreadPoolExecutor.DiscardOldestPolicy抛弃队列中等待最久的任务 然后把当前任务加入队列中
ThreadPoolExecutor.CallerRunsPolicy调用任务的run()方法绕过线程池直接执行
参数说明要求
corePoolSize核心线程数量不能小于0
maximumPoolSize最大线程数量不能小于0,最大数量 >= 核心线程数量
keepAliveTime空闲线程最大存活时间不能小于0
unit时间单位TimeUnit指定
workQueue任务队列不能为null
threadFactory创建线程工厂不能为null
handler任务的拒绝策略不能为null
public class demo1 {public static void main(String[] args) {ThreadPoolExecutor pool = new ThreadPoolExecutor(3,6,60,TimeUnit.SECONDS,new ArrayBlockingQueue<>(),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());}
}

最大并行数

public class demo1 {public static void main(String[] args) {System.out.println(Runtime.getRuntime().availableProcessors());}
}

image-20240602203344613

多线程小练习

一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒
(要求:请用多线程模拟卖票过程并打印剩余电影票的数量)

package practices.a01;public class MyThread extends Thread{static int ticket = 1000;@Overridepublic void run() {while (true){synchronized (MyThread.class) {if (ticket == 0)break;else{ticket--;System.out.println(getName() + "卖出了一张票,还剩" + ticket + "张");}}}}
}
public class demo {public static void main(String[] args) {MyThread t1 = new MyThread();MyThread t2 = new MyThread();t1.setName("窗口1");t2.setName("窗口2");t1.start();t2.start();}
}

网络编程

在网络通信协议下,不同计算机上运行的程序,进行的数据传输。

  • 应用场景:即时通信、网游对战、金融证券、国际贸易、邮件、等等。
    不管是什么场景,都是计算机跟计算机之间通过网络进行数据传输,
  • Java中可以使用java.net包下的技术轻松开发出常见的网络应用程序。

image-20240602212454403

BS架构优缺点

  1. 不需要开发客户端,只需要页面+服务端
  2. 用户不需要下载,打开浏览器就能使用
  3. 如果应用过大,用户体验受到影响

CS架构优缺点

  1. 画面可以做的非常精美,用户体验好
  2. 需要开发客户端,也需要开发服务端
  3. 用户需要下载和更新的时候太麻烦

三要素

IP:设备在网络中的地址,是唯一的标识。

端口号:应用程序在设备中唯一的标识。

协议:数据在网络中传输的规则,常见的协议有UDP、TCP、http、https、ftp。

IP

全称:Internet Protocol,是互联网协议地址,也称IP地址。
是分配给上网设备的数字标签

通俗理解:上网设备在网络中的地址,是唯一的

常见的IP分类为 :IPv4、IPv6

image-20240602214923011

特殊IP

127.0.0.1,也可以是localhost:是回送地址也称本地回环地址,也称本机IP,永远只会寻找当前所在本机。

常用的CMD命令

ipconfig:查看本机IP地址
ping:检查网络是否连通

InetAddress类

public class MyInetAddressDemo1 {public static void main(String[] args) throws UnknownHostException {//1.获取InetAdderss对象// 获取本地主机的 InetAddress 对象InetAddress address1 = InetAddress.getLocalHost();System.out.println("本地主机信息:" + address1);System.out.println("本地主机名:" + address1.getHostName());System.out.println("本地 IP 地址:" + address1.getHostAddress());// 根据主机名获取 InetAddress 对象InetAddress address2 = InetAddress.getByName("xuanlaptop");System.out.println("指定主机信息:" + address2);System.out.println("主机名:" + address2.getHostName());System.out.println("IP 地址:" + address2.getHostAddress());}
}

端口号

应用程序在设备中唯一的标识。

端口号:由两个字节表示的整数,取值范围:0~65535
其中0~1023之间的端口号用于一些知名的网络服务或者应用
我们自己使用1024以上的端口号就可以了

注意:一个端口号只能被一个应用程序使用。

协议

计算机网络中,连接和通信的规则被称为网络通信协议

  • OSI参考模型:世界互联协议标准,全球通信规范,单模型过于理想化,未能在因特网上进行广泛推广
  • TCP/IP参考模型(或TCP/IP协议):事实上的国际标准。

image-20240603173404859

image-20240603173607941

UDP协议(重点)

  • 用户数据报协议(User Datagram Protocol)
  • UDP是面向无连接通信协议。
    速度快,有大小限制一次最多发送64K,数据不安全,易丢失数据

发送数据

package udpPractices.a01;import java.io.IOException;
import java.net.*;public class demo1 {public static void main(String[] args) throws IOException {//创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket();//打包数据String str = "嘿嘿嘿哈!";byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//发送数据ds.send(dp);//释放资源ds.close();}
}

接收数据

package udpPractices.a01;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;public class demo2 {public static void main(String[] args) throws IOException {//创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket(10086);//接收数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);ds.receive(dp);//解析数据包byte[] data = dp.getData();int len = dp.getLength();InetAddress address = dp.getAddress();int port = dp.getPort();System.out.println("接收到数据:" + new String(data, 0, len) + '\n' + "该数据是从" + address + "这台电脑" + port + "这个端口发出的");//释放资源ds.close();}
}

聊天室

  • 发送消息

    package udpPractices.a01;import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.util.Scanner;public class demo1 {public static void main(String[] args) throws IOException {//创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket();Scanner sc = new Scanner(System.in);//打包数据while (true) {System.out.print("请输入您要说的话:");String str = sc.nextLine();if ("886".equals(str)) {break;}byte[] bytes = str.getBytes();InetAddress address = InetAddress.getByName("127.0.0.1");int port = 10086;DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);//发送数据ds.send(dp);}//释放资源ds.close();}
    }
    
  • 接收数据

    package udpPractices.a01;import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;public class demo2 {public static void main(String[] args) throws IOException {//创建DatagramSocket对象(快递公司)DatagramSocket ds = new DatagramSocket(10086);//接收数据包byte[] bytes = new byte[1024];DatagramPacket dp = new DatagramPacket(bytes, bytes.length);while (true) {ds.receive(dp);//解析数据包byte[] data = dp.getData();int len = dp.getLength();String ip = dp.getAddress().getHostAddress();String name = dp.getAddress().getHostName();System.out.println("ip为:" + ip + ",主机名为:" + name + "的人,发送了数据:" + new String(data, 0, len));}//释放资源}
    
UDP三种通信方式
  • 单播:以前的代码就是单播

  • 组播:组播地址:224.0.0.0~239.255.255.255

    其中224.0.0.0~224.0.0.255 为预留的组播地址

  • 广播:广播地址:255.255.255.255

TCP协议(重点)

  • 传输控制协议TCP(Transmission Control Protocol)
  • TCP协议是面向连接的通信协议,
    速度慢,没有大小限制,数据安全,

image-20240603185716605

发送

package udpPractices.a02;import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;public class Client {public static void main(String[] args) throws IOException {//创建Socket对象Socket socket = new Socket("127.0.0.1", 10000);//从连接通道中获取输出流OutputStream os = socket.getOutputStream();//写出数据os.write("aaa".getBytes());//释放资源os.close();socket.close();}
}

接收

package udpPractices.a02;import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;public class Server {public static void main(String[] args) throws IOException {//创建对象ServerSockerServerSocket ss = new ServerSocket(10000);//监听客户端的连接Socket sorket = ss.accept();//从连接通道中获取输入流读取数据InputStream is = sorket.getInputStream();int b;while((b = is.read()) != -1) {System.out.println((char) b);}//释放资源sorket.close();ss.close();}
}
三次握手

确保连接建立

image-20240603215725218

四次挥手

确保连接断开,且数据处理完毕

image-20240603215507890

反射

反射允许对封装类的字段,方法和构造函数的信息进行编程访问

image-20240603220604931

获取class的三种方式

  1. Class.forName("全类名");
  2. 类名.class;
  3. 对象.getclass();
public class demo1 {public static void main(String[] args) throws ClassNotFoundException {//1.全类名:包名 + 类名Class clazz1 = Class.forName("myreflect.a01.Student");//2.Class clazz2 = Student.class;//3.Student s = new Student();Class clazz3 = s.getClass();}
}

利用反射获取构造方法

Class类中用于获取构造方法的方法:

方法功能
Constructor<?>[] getConstructors()返回所有公共构造方法对象的数组
Constructor<?>[]getDeclaredConstructors()返回所有构造方法对象的数组
Constructor<T>getConstructor(Class<?>...parameterTypes)返回单个公共构造方法对象
Constructor<T>getDeclaredConstructor(Class<?>... parameterTypes)返回单个构造方法对象
package myreflect.a02;import java.lang.reflect.Constructor;public class demo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException {//1.过去class字节码文件对象Class clazz = Class.forName("myreflect.a02.Student");//2.获取构造方法(公有)Constructor[] cons1 = clazz.getConstructors();for (Constructor con : cons1) {System.out.println(con);}System.out.println("---------------------------");//(所有)Constructor[] cons2 = clazz.getDeclaredConstructors();for (Constructor con : cons2) {System.out.println(con);}System.out.println("---------------------------");//单个.空参Constructor con3 = clazz.getDeclaredConstructor();System.out.println(con3);System.out.println("---------------------------");//单个.实参Constructor con4 = clazz.getDeclaredConstructor(String.class);System.out.println(con4);int modifiers = con4.getModifiers();System.out.println(modifiers);Parameter[] parameters = con4.getParameters();for (Parameter parameter : parameters) {System.out.println(parameter);}}
}

Constructor类中用于创建对象的方法:

方法功能
T newlnstance(Object...initargs)根据指定的构造方法创建对象
setAccessible(boolean flag)设置为true,表示取消访问检查
package myreflect.a02;import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;public class demo2 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {Class clazz = Class.forName("myreflect.a02.Student");Constructor con = clazz.getDeclaredConstructor(String.class, int.class);//表示临时取消权限校验con.setAccessible(true);Student stu = (Student) con.newInstance("张三", 23);System.out.println(stu);}
}

Class类中用于获取成员变量的方法

方法说明
Field[] getFields()返回所有公共成员变量对象的数组
Field[] getDeclaredFields()返回所有成员变量对象的数组
Field getField(String name)返回单个公共成员变量对象
Field getDeclaredField(String name)返回单个成员变量对象

Field类中用于创建对象的方法

方法说明
void set(Object obj, Object value)赋值
Object get(Object obj)获取值
public class demo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {//1.获取class字节码文件的对象Class clazz = Class.forName("myreflect.a03.Student");//2.获取所有的成员变量Field[] fields = clazz.getDeclaredFields();for(Field field : fields) {System.out.println(field);}//3.获取单个成员变量Field name = clazz.getDeclaredField("name");System.out.println(name);//获取权限修饰符int modifiers = name.getModifiers();System.out.println(modifiers);//获取成员变量的名字String n = name.getName();System.out.println(n);//获取成员变量的数据类型Class<?> type = name.getType();System.out.println(type);//获取成员变量记录的值Student s = new Student("zhangsan", 23, "男");name.setAccessible(true);String value = (String) name.get(s);System.out.println(value);//修改对象里面记录的值name.set(s, "lisi");System.out.println(s);}
}

Class类中用于获取成员方法的方法

方法说明
Method[] getMethods()返回所有公共成员方法对象的数组,包括继承的
Method[] getDeclaredMethods()返回所有成员方法对象的数组,不包括继承的
Method getMethod(String name, Class<?>... parameterTypes)返回单个公共成员方法对象
Method getDeclaredMethod(String name, Class<?>... parameterTypes)返回单个成员方法对象

Method类中用于创建对象的方法

方法说明
Object invoke(Object obj, Object... args)运行方法
参数一: 用obj对象调用该方法
参数二: 调用方法的传递的参数(如果没有就不写)
返回值: 方法的返回值(如果没有就不写)
public class demo1 {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {//1.获取class字节码文件对象Class clazz = Class.forName("myreflect.a04.Student");//获取所有方法对象Method[] methods = clazz.getMethods();for (Method method : methods) {System.out.println(method);}//获取指定单一方法Method m = clazz.getDeclaredMethod("eat", String.class, int.class);System.out.println(m);//获取方法的修饰符int modifiers =m.getModifiers();System.out.println(modifiers);//获取方法的名字String name = m.getName();System.out.println(name);//获取方法的形参Parameter[] parameters = m.getParameters();for(Parameter parameter : parameters) {System.out.println(parameter);}//获取方法的抛出的异常Class[] exceptionTypes = m.getExceptionTypes();for(Class exceptionType : exceptionTypes){System.out.println(exceptionType);}//方法运行Student s = new Student();m.setAccessible(true);String result = (String) m.invoke(s, "111", 11);System.out.println(result);}
}

反射的作用

  1. 获取一个类里面所有的信息,获取到了之后,再执行其他的业务逻辑
  2. 结合配置文件,动态的创建对象并调用方法

动态代理

特点:无侵入式的给代码增加额外的功能

  1. 为什么需要代理?
    代理可以无侵入式的给对象增强其他的功能
    调用者->代理->对象
  2. 代理长什么样?
    代理里面就是对象要被代理的方法
  3. Java通过什么来保证代理的样子?
    通过接口保证,后面的对象和代理需要实现同一个接口
    接口中就是被代理的所有方法

注解

  • 就是java代码里的特殊标记,比如:@Override、@Test等,作用是:让其他程序根据注解信息来决定怎么执行该程序。
  • 注意:注解可以用在类上、构造器上、方法上、成员变量上、参数上、等位置处。

自定义注解

  • 自己定义注解
public @interface 注解名称 {public 属性类型 属性名() default 默认值;
}
  • 注解本质是一个接口,Java中所有注解都是继承了Annotation接口的。
  • @注解(…):其实就是一个实现类对象,实现了该注解以及Annotation接口。

元注解

  • 指的是:修饰注解的注解。

image-20240605192142190

image-20240605192524044

什么是注解的解析?

  • 就是判断类上、方法上、成员变量上是否存在注解,并把注解里的内容给解析出来

如何解析注解?

  • 指导思想:要解析谁上面的注解,就应该先拿到谁。
  • 比如要解析类上面的注解,则应该先获取该类的Class对象,再通过Class对象解析其上面的注解。
  • 比如要解析成员方法上的注解,则应该获取到该成员方法的Method对象,再通过Method对象解析其上面的注解。
  • Class、 Method、Field,Constructor、都实现了AnnotatedElement接口,它们都拥有解析注解的能力。
构造方法说明
public Annotation[] getDeclaredAnnotations()获取当前对象上面的注解
public <T extends Annotation> T getDeclaredAnnotation(Class<T> annotationClass)获取指定的注解对象
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass)判断当前对象上是否存在某个注解

已经到底啦!!

相关文章:

重生之我要精通JAVA--第八周笔记

文章目录 多线程线程的状态线程池自定义线程池最大并行数多线程小练习 网络编程BS架构优缺点CS架构优缺点三要素IP特殊IP常用的CMD命令 InetAddress类端口号协议UDP协议&#xff08;重点&#xff09;UDP三种通信方式 TCP协议&#xff08;重点&#xff09;三次握手四次挥手 反射…...

51单片机独立按键控制LED灯,按键按一次亮,再按一次灭

1、功能描述 独立按键控制LED灯&#xff0c;按键按一次亮&#xff0c;再按一次灭 2、实验原理 轻触按键:相当于是一种电子开关&#xff0c;按下时开关接通&#xff0c;松开时开关断开&#xff0c;实现原理是通过轻触按键内部的金属弹片受力弹动米实现接通和断开&#xff1b;…...

【上海大学计算机组成原理实验报告】七、程序转移机制

一、实验目的 学习实现程序转移的硬件机制。 掌握堆栈寄存器的使用。 二、实验原理 根据实验指导书的相关内容&#xff0c;实验箱系统的程序转移硬件机制在于&#xff0c;当LDPC有效时&#xff0c;如果此时DUBS上的值就是转移的目标地址&#xff0c;则此目标地址被打入PC&am…...

LLVM Cpu0 新后端7 第一部分 DAG调试 dot文件 Machine Pass

想好好熟悉一下llvm开发一个新后端都要干什么&#xff0c;于是参考了老师的系列文章&#xff1a; LLVM 后端实践笔记 代码在这里&#xff08;还没来得及准备&#xff0c;先用网盘暂存一下&#xff09;&#xff1a; 链接: https://pan.baidu.com/s/1yLAtXs9XwtyEzYSlDCSlqw?…...

修复www服务trace漏洞

验证方式&#xff1a;curl -v -X TRACE ip:port&#xff0c;或使用其他接口调试工具如Postman 响应&#xff1a;状态行405 Method Not Allowed且响应体无内容 方案一&#xff1a;使用过滤器 若webserver是tomcat, 添加过滤器的方式有很多 Component public class TraceHttpMe…...

算法:101. 对称二叉树

对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提示&#xff1a; 树中节…...

wordpress 使用api发布文章

1.安装插件 在/wp-content/plugins/目录执行以下命令 $ sudo git clone https://github.com/WP-API/Basic-Auth.git 2.Python脚本 import requestsurl http://www.ziyuanwang.online/wp-json/wp/v2/postsuser adminpassword xxxxxheaders {Content-Type: application/j…...

《Brave New Words 》2.2 阅读理解的未来,让文字生动起来!

Part II: Giving Voice to the Social Sciences 第二部分&#xff1a;为社会科学发声 The Future of Reading Comprehension, Where Literature Comes Alive! 阅读理解的未来&#xff0c;让文字生动起来&#xff01; Saanvi, a ninth grader in India who attends Khan World S…...

基于Java的超市进销存管理系统

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; Java JSP Servlet JavaBean 工具&#xff1a; IDEA/Eclipse、…...

Oracle 日志挖掘

oracle 11g 日志挖掘测试 需要开启补充日志 alter database add supplemental log data; SELECT SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;在用户下执行一些删除&#xff0c;插入等操作 SQL> create table zxy( …...

翻转二叉树-力扣

翻转二叉树&#xff0c;通过前序遍历的顺序&#xff0c;从根节点开始&#xff0c;将节点的左右子节点一次进行交换即可。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), …...

办公风云颜值背后的职场正能量

办公风云&#xff1a;颜值背后的职场正能量当我们提到职场&#xff0c;脑海中浮现的往往是严肃的面孔、忙碌的身影和堆积如山的文件。但在这个看似单调的舞台上&#xff0c;总有一些人&#xff0c;用他们的颜值和才华&#xff0c;为我们上演了一场场别开生面的“大戏”。今天&a…...

ffmpeg将一个视频中的音频合并到另一个视频

ffmpeg -i input1.mp4 -i input2.mp4 -map 1:v -map 0:a -c:v copy -c:a aac -strict experimental output.mp4解释如下&#xff1a; -i input1.mp4&#xff1a;指定第一个输入文件input1.mp4&#xff0c;这是你要提取音频的文件。-i input2.mp4&#xff1a;指定第二个输入文件…...

Web前端管理系统项目:深度解析与实现之道

Web前端管理系统项目&#xff1a;深度解析与实现之道 在当今数字化时代&#xff0c;Web前端管理系统项目已成为企业信息化建设的核心组成部分。这类项目不仅涉及技术的深度和广度&#xff0c;更考验开发者的综合素质和创新能力。本文将从四个方面、五个方面、六个方面和七个方…...

C语言最终讲:预处理详解

C语言最终讲&#xff1a;预处理详解 1.预定义符号2.#define定义常量3.#define定义宏4.带有副作用的宏参数5.宏替换的规则6.宏和函数的对比6.1宏的优势6.1.1\符号 6.2宏的劣势 7.#和##7.1#运算符7.2##运算符 8.命名约定9.#undef10.命令行定义11.条件编译12.头文件的包含12.1本地…...

Mysql的底层实现逻辑

Mysql5.x和Mysql8性能的差异 整体性能有所提高&#xff0c; 在非高并发场景下&#xff0c;他们2这使用区别不大&#xff0c;性能没有明显的区别。 只有高并发时&#xff0c;mysql8才体现他的优势。 2. Mysql数据存储结构Innodb逻辑结构 数据选用B树结构存储数据&#xff0…...

Node安装配置

一、下载 Node官网下载地址&#xff1a;https://nodejs.org/en/ 二、安装 双击上面的msi扩展安装包开始安装&#xff0c;基本一路Next就行了 推荐安装目录自定义&#xff0c;最好不要放在C盘 检查安装是否成功 Win R 快捷键&#xff0c;输入 cmd 打开命令窗口输…...

Django里的ModelForm组件

ModelForm组件 自动生成HTML标签 自动读取关联数据表单验证 保留之前提交的数据 错误提示数据库进行&#xff1a;新建&#xff0c;修改 步骤如下&#xff1a; 创建类 # 在 views.py 文件里# 创建一个类 class AssetModelForm(forms.ModelForm):class Meta:model models.…...

深入理解C语言:main函数的奥秘

在C语言中&#xff0c;main函数是每个程序的入口点&#xff0c;起着至关重要的作用。本文将深入探讨main函数的工作原理&#xff0c;包括其参数、返回值、以及如何从main启动程序的执行。通过实际代码示例&#xff0c;读者将更深入地理解main函数在C语言编程中的核心地位。 第一…...

selenium自动化测试入门 —— Alert/Confirm/Prompt 弹出窗口处理!

一、Alert/Confirm/Prompt弹出窗口特征说明 Alert弹出窗口&#xff1a; 提示用户信息只有确认按钮&#xff0c;无法通过页面元素定位&#xff0c;不关闭窗口无法在页面上做其他操作。 Confirm 弹出窗口&#xff1a; 有确认和取消按钮&#xff0c;该弹出窗口无法用页面元素定…...

探索JavaScript 18:新特性全解析

JavaScript&#xff0c;作为全球最广泛使用的编程语言之一&#xff0c;每年的更新都备受开发者社区的关注。2023年&#xff0c;JavaScript的新版标准——ECMAScript 2023&#xff08;也称为JavaScript 18&#xff09;引入了多项激动人心的新特性&#xff0c;这些特性不仅优化了…...

Python第二语言(七、Python模块)

目录 1. 什么是模块 2. 基本语法 2.1 模块的导入方式 2.2 基本语法 import 模块名 2.3 基本语法 from 模块名 import 功能名 2.4 基本语法as 别名 3. 自定义模块 4. 调用自定义模块时&#xff0c;如何让其模块中的函数不被调用&#xff08;__name__&#xff09; 5. 调…...

介绍单例模式

描述 保证一个类只有一个实例&#xff0c;并且提供一个全局访问点 场景&#xff1a; 重量级的对象&#xff0c;不需要多个实例&#xff0c;如线程池&#xff0c;数据库连接池 实现 1. 懒汉模式 延迟加载的方式 只有在真正使用的时候&#xff0c;才开始实例化线程安全问题…...

【C++修行之道】类和对象(五)日期类的实现、const成员、取地址及const和取地址操作符重载

目录 一、 日期类的实现 Date.h 1.1 GetMonthDay函数&#xff08;获取某年某月的天数&#xff09; 问&#xff1a;这个函数为什么不和其他的函数一样放在Date.cpp文件中实现呢&#xff1f; 1.2 CheckDate函数&#xff08;检查日期有效性&#xff09;、Print函数&#xff08;…...

来腾讯第4天,我已经焦虑昏了啊!

大家好&#xff0c;我是白露啊。 今天在看到一个实习生在抱怨&#xff0c;给我笑惨了。 标题是&#xff1a;“腾讯实习第4天&#xff0c;焦虑昏了”&#xff01; 他写道&#xff1a;“怎么办啊牛爷爷们&#xff0c;什么都不会。业务看不懂&#xff0c;文档看不懂&#xff0c;…...

MacOS升级ruby版本

MacOS自带ruby版本是2.x&#xff0c;可以通过“ruby -v”查看版本号 $ ruby -v ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.x86_64-darwin22]homebrew安装的ruby版本号可以通过“brew info ruby”命令参看 $ brew info ruby > ruby: stable 3.3.2 (bottled)…...

【MySQL数据库基础】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …...

QT系列教程(9) 主窗口学习

简介 任何界面应用都有一个主窗口&#xff0c;今天我们谈谈主窗口相关知识。一个主窗口包括菜单栏&#xff0c;工具栏&#xff0c;状态栏&#xff0c;以及中心区域等部分。我们先从菜单栏说起 菜单栏 我们创建一个主窗口应用程序, 在ui文件里的菜单栏里有“在这里输入”的一个…...

【C++进阶】深入STL之 栈与队列:数据结构探索之旅

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;模拟实现list与迭代器 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀stack和queue &#x1f4…...

SpringBoot发邮件服务如何配置?怎么使用?

SpringBoot发邮件需要的参数&#xff1f;邮件发送性能如何优化&#xff1f; 在SpringBoot项目中配置发邮件服务是一个常见的需求&#xff0c;它允许我们通过应用程序发送通知、验证邮件或其他类型的邮件。AokSend将详细介绍如何在SpringBoot中配置发邮件服务。 SpringBoot发邮…...

响应式网站的字体设置/成都品牌推广

前言 设计模式能够帮助我们设计出健壮&#xff0c;低耦合性的代码&#xff0c;从此和高耦合的代码say goodbye&#xff01;在所有的的设计模式中&#xff0c;简单工厂算是我们平时接触比较多的吧&#xff0c;多线程中的消费者工厂类与生产者工厂类应该算是接触最早的设计模式&a…...

该网站暂时无法访问404/谷歌官方网站登录入口

因为目前java非常火&#xff0c;应用非常的广泛&#xff0c;是目前最火的行业之一&#xff0c;竞争很大&#xff0c;工资很高&#xff0c;未来发展也极好。 我个人建议&#xff1a; 如条件还可以&#xff0c;负担不是那么大&#xff0c;可以选择培训&#xff0c;培训一定会比你…...

大理建设工程信息网站/seo报名在线咨询

介绍 一名高一高二OIer&#xff0c;每天在巨佬的光辉下兢兢业业地苟着。 虽然很假&#xff0c;但是在努力变更假。 大概也是个老二次元&#xff1f; 当然不算啦&#xff0c;要看的番越来越多&#xff0c;越来越觉得自己阅番量太少了…… 学OI的现状也是这样&#xff0c;要学…...

网站运营建站优化专家/网站百度关键词seo排名优化

学习时长30h代码量1000博客数量7篇学习内容Android不同页面间的数据传递等转载于:https://www.cnblogs.com/liyuchao/p/10849937.html...

学校建设外文网站情况/微博推广有用吗

其实社会上有非常多的软文营销&#xff0c;现在好的软文营销能够为企业带来巨大的利益&#xff0c;那么为什么软文营销对于企业这么重要呢&#xff1f; 1.随着互联网的飞速发展&#xff0c;传统媒体逐渐衰落&#xff0c;移动新媒体快速崛起&#xff0c;这是时代的转变&#xff…...

南宁网站推广手段/百色seo外包

环境&#xff1a;VirtualBox6,Ubuntu16.04 虚拟机&#xff1a;controller&#xff0c;compute 首先出现的情况是主机与虚拟机之间不能互相ping通&#xff1a; 上网搜了一些资料&#xff0c;发现我的虚拟机设置成桥接的模式&#xff0c;但是未和主机配置统一网段的ip 参考ht…...