JAVA的学习心路历程之JDK基础入门(下)

news2025/2/27 21:39:31

        这篇是本人JAVA基础学习的下篇,上篇链接在:

JAVA的学习心路历程之JDK基础入门(上)_Thomas_Lbw的博客-CSDN博客_jdk学习

目录

一、字符流 

1.1 字符流基类

二、文件操作

2.1 文件操作

三、Swing 

四、多线程编程

4.1 多线程概念

4.2 创建线程


一、字符流 

        字符流的相关内容在java.io包中。

1.1 字符流基类

        java.io 包中专门用于字符流处理的类,是以 Reader 和 Writer 为基础派生的一系列类。字符流以字符为单位,根据码表映射字符,一次可能读多个字节,只能处理字符类型的数据。同类 InputStream 和 OutputStream 一样,Reader 和 Writer 也是抽象类,只提供了一系列用于字符流处理的接口。它们的方法与类 InputStream 和 OutputStream 类似,只不过其中的参数换成字符或字符数组。Reader 是所有的输入字符流的父类,它是一个抽象类。我们先来看一看基类 Reader 的方法,其用法与作用都与 InputStream 和 OutputStream 类似,就不做过多的说明了。

方法返回值
close()void
mark (int readAheadLimit)void
markSupported()boolean
read()int
read(char[] cbuf, int off,int len)int
ready()boolean
reset()void
skip(long n)long

        Writer 是所有的输出字符流的父类,它是一个抽象类。 Writer 的方法:

        

方法返回值
close()void
flush()void
write(char[] cbuf)void
write(char[] cbuf, int off,int len)void
write(int c)void
write(String str)void
write(String str, int off, int len)

void

         InputStreamReader 和 OutputStreamWriter 是 java.io 包中用于处理字符流的最基本的类,用来在字节流和字符流之间作为中介:从字节输入流读入字节,并按编码规范转换为字符;往字节输出流写字符时先将字符按编码规范转换为字节。使用这两者进行字符处理时,在构造方法中应指定一定的平台规范,以便把以字节方式表示的流转换为特定平台上的字符表示。

InputStreamReader(InputStream in); //缺省规范说明

//指定规范 enc
InputStreamReader(InputStream in, String enc);

OutputStreamWriter(OutputStream out); //缺省规范说明

//指定规范 enc
OutputStreamWriter(OutputStream out, String enc);

        如果读取的字符流不是来自本地时(比如网上某处与本地编码方式不同的机器),那么在构造字符输入流时就不能简单地使用缺省编码规范,而应该指定一种统一的编码规范“ISO 8859_1”,这是一种映射到 ASCCII 码的编码方式,能够在不同平台之间正确转换字符。

InputStreamReader ir = new InputStreamReader(is,"8859_1");

        同样的,为了提高字符流处理的效率,java.io 中也提供了缓冲流 BufferedReader 和 BufferedWriter。其构造方法与 BufferedInputStream 和 BufferedOutPutStream 相类似。另外,除了 read() 和 write() 方法外,它还提供了整行字符处理方法:

  1. public String readLine():BufferedReader 的方法,从输入流中读取一行字符,行结束标志\n\r或者两者一起(这是根据系统而定的)。
  2. public void newLine():BufferedWriter 的方法,向输出流中写入一个行结束标志,它不是简单地换行符\n\r,而是系统定义的行隔离标志(line separator)。

eg:

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class FileToUnicode {
    public static void main(String args[]) {
        try {
            FileInputStream fis = new FileInputStream("file1.txt");
            InputStreamReader dis = new InputStreamReader(fis);
            BufferedReader reader = new BufferedReader(dis);
            String s;
            //每次读取一行,当改行为空时结束
            while((s = reader.readLine()) != null){
                System.out.println("read:" + s);
            }
            dis.close();
        }
        catch(IOException e) {
            System.out.println(e);
        }
    }
}

        在这里我就列举一下有哪些类:

  1. 对字符数组进行处理: CharArrayReader、CharArrayWrite
  2. 对文本文件进行处理:FileReader、FileWriter
  3. 对字符串进行处理:StringReader、StringWriter
  4. 过滤字符流:FilterReader、FilterWriter
  5. 管道字符流:PipedReader、PipedWriter
  6. 行处理字符流:LineNumberReader
  7. 打印字符流:PrintWriter

        类有千万,方法更是不计其数,所以没有必要去掌握所有的方法和类,只需要知道常见常用的就行了,而大多数的类和方法,希望大家有一个印象,当我们在实际开发的时候,能够想到,并且借助其他工具去查询我们需要的方法的应用方式就可以了。 

二、文件操作

2.1 文件操作

        java.io 定义的大多数类都是流式操作,但 File 类不是。它直接处理文件和文件系统。File 类没有指定信息怎样从文件读取或向文件存储;它描述了文件本身的属性。File 对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。此外,File 还浏览子目录层次结构。Java 中的目录当成 File 对待,它具有附加的属性——一个可以被 list() 方法检测的文件名列表。

        File 的构造方法:

//根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File(File parent, String child)

//通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例
File(String pathname)

// 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例
File(String parent, String child)

//通过将给定的 file: URI 转换为一个抽象路径名来创建一个新的 File 实例
File(URI uri)

eg:

//一个目录路径参数
File f1 = new File("/Users/mumutongxue/");

//对象有两个参数——路径和文件名
File f2 = new File("/Users/mumutongxue/","a.bat");

//指向 f1 文件的路径及文件名
File f3 = new File(f1,"a.bat");

        再来看看 File 的一些方法:

方法说明
boolean canExecute()测试应用程序是否可以执行此抽象路径名表示的文件
boolean canRead()测试应用程序是否可以读取此抽象路径名表示的文件
boolean canWrite()测试应用程序是否可以修改此抽象路径名表示的文件
int compareTo(File pathname)按字母顺序比较两个抽象路径名
boolean createNewFile()当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件
static File createTempFile(String prefix, String suffix)在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称
static File createTempFile(String prefix, String suffix, File directory)在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称
boolean delete()删除此抽象路径名表示的文件或目录
void deleteOnExit()在虚拟机终止时,请求删除此抽象路径名表示的文件或目录
boolean equals(Object obj)测试此抽象路径名与给定对象是否相等
boolean exists()测试此抽象路径名表示的文件或目录是否存在
File getAbsoluteFile()返回此抽象路径名的绝对路径名形式
String getAbsolutePath()返回此抽象路径名的绝对路径名字符串
File getCanonicalFile()返回此抽象路径名的规范形式
String getCanonicalPath()返回此抽象路径名的规范路径名字符串
long getFreeSpace()返回此抽象路径名指定的分区中未分配的字节数
String getName()返回由此抽象路径名表示的文件或目录的名称
String getParent()返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null
File getParentFile()返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null
String getPath()将此抽象路径名转换为一个路径名字符串
long getTotalSpace()返回此抽象路径名指定的分区大小
long getUsableSpace()返回此抽象路径名指定的分区上可用于此虚拟机的字节数
int hashCode()计算此抽象路径名的哈希码
boolean isAbsolute()测试此抽象路径名是否为绝对路径名
boolean isDirectory()测试此抽象路径名表示的文件是否是一个目录
boolean isFile()测试此抽象路径名表示的文件是否是一个标准文件
boolean isHidden()测试此抽象路径名指定的文件是否是一个隐藏文件
long lastModified()返回此抽象路径名表示的文件最后一次被修改的时间
long length()返回由此抽象路径名表示的文件的长度
String[] list()返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录
String[] list(FilenameFilter filter)返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录
File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件
File[] listFiles(FileFilter filter)返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录
File[] listFiles(FilenameFilter filter)返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录
static File[] listRoots()列出可用的文件系统根
boolean mkdir()创建此抽象路径名指定的目录
boolean mkdirs()创建此抽象路径名指定的目录,包括所有必需但不存在的父目录
boolean renameTo(File dest)重新命名此抽象路径名表示的文件
boolean setExecutable(boolean executable)设置此抽象路径名所有者执行权限的一个便捷方法
boolean setExecutable(boolean executable, boolean ownerOnly)设置此抽象路径名的所有者或所有用户的执行权限
boolean setLastModified(long time)设置此抽象路径名指定的文件或目录的最后一次修改时间
boolean setReadable(boolean readable)设置此抽象路径名所有者读权限的一个便捷方法
boolean setReadable(boolean readable, boolean ownerOnly)设置此抽象路径名的所有者或所有用户的读权限
boolean setReadOnly()标记此抽象路径名指定的文件或目录,从而只能对其进行读操作
boolean setWritable(boolean writable)设置此抽象路径名所有者写权限的一个便捷方法
boolean setWritable(boolean writable, boolean ownerOnly)设置此抽象路径名的所有者或所有用户的写权限
String toString()返回此抽象路径名的路径名字符串
URI toURI()构造一个表示此抽象路径名的 file: URI

 eg代码:

import java.io.File;
import java.io.IOException;

public class  FileDemo {
    public static void main(String[] args){
        //同学们可以根据自己的路径进行更改
        File f1 =new
        File("/home/project/1.txt");
        //File(String parent,String child)
        File f2 =new File("/home/project","2.txt");
        //separator 跨平台分隔符
        File f3 =new File("/home"+File.separator+"project");
        File f4 =new File(f3,"3.txt");

        try {
             System.out.println(f1);
                //当文件存在时返回 false;不存在时返回 true
                System.out.println(f2.createNewFile());
                //当文件不存在时返回 false
                System.out.println(f3.delete());
        }catch(IOException e) {
                e.printStackTrace();
        }

        //列出磁盘下的文件和文件夹
        File[] files =File.listRoots();
        for(File file:files){
            System.out.println(file);
            if(file.length()>0){
                String[] filenames =file.list();
                for(String filename:filenames){
                    System.out.println(filename);
                }
            }
        }

    }

}

        对于 FileInputStream/FileOutputStream、FileReader/FileWriter 来说,它们的实例都是顺序访问流,即只能进行顺序读/写。而类 RandomAccessFile 则允许文件内容同时完成读和写操作,它直接继承 object,并且同时实现了接口 DataInput 和 DataOutput。

        随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针。输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用。输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。

        RandomAccessFile 提供了支持随机文件操作的方法:

  1. readXXX() 或者 writeXXX(): 如 ReadInt(),ReadLine(),WriteChar(),WriteDouble() 等
  2. int skipBytes(int n): 将指针向下移动若干字节
  3. length(): 返回文件长度
  4. long getFilePointer(): 返回指针当前位置
  5. void seek(long pos): 将指针调用所需位置

        在生成一个随机文件对象时,除了要指明文件对象和文件名之外,还需要指明访问文件的模式。

        我们来看看 RandomAccessFile 的构造方法:

RandomAccessFile(File file,String mode)
RandomAccessFile(String name,String mode)

eg: 

import java.io.IOException;
import java.io.RandomAccessFile;

public class  RandomFileDemo {
    public static void main(String[] args){

        int data_arr[] = {12, 32, 43, 45, 1, 5};
        try {
            RandomAccessFile randf=new RandomAccessFile("temp.dat","rw");
            for(int i = 0; i < data_arr.length; i++){
                randf.writeInt(data_arr[i]);
            }
            for(int i = data_arr.length-1 ; i >= 0; i--){
                //int 数据占 4 个字节
                randf.seek(i * 4L);
                System.out.println(randf.readInt());
            }
            randf.close();
        }catch(IOException e){
            System.out.println("File access error" + e);
        }
    }
}

三、Swing 

        带你初步进入图形用户界面(GUI)的世界,让你学会如何编写屏幕上那些具有特定大小和位置的窗体程序,并在其中添加文本,处理用户的输入。可以让你的程序真正地“有头有脸”——具有更好的人机交互性能。

        下图表示了 MVC 组件类型的关系和功能。

四、多线程编程

4.1 多线程概念

        作为一名开发者,你可能已经很熟悉操作系统中的多任务。这种在同一时刻同时运行多个程序的能力有效地提高了系统的利用率。

        首先你应该知道什么是线程:

线程:程序执行流的最小单元。它是进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派 CPU 的基本单位。

        如同大自然中的万物,线程也有“生老病死”的过程,下图表示了一个线程从创建到消亡的过程,以及过程中的状态。

        结合线程的生命周期,我们再来看看多线程的定义:

多线程:从软件或者硬件上实现多个线程并发执行的技术。在单个程序中同时运行多个线程完成不同的工作。

        在 Java 中,垃圾回收机制就是通过一个线程在后台实现的,这样做的好处在于:开发者通常不需要为内存管理投入太多的精力。反映到我们现实生活中,在浏览网页时,浏览器能够同时下载多张图片。

        从专业的角度来看,多线程编程是为了最大限度地利用 CPU 资源——当处理某个线程不需要占用 CPU 而只需要利用 IO 资源时,允许其他的那些需要 CPU 资源的线程有机会利用 CPU。这或许就是多线程编程的最终目的。当然,你也可以进一步了解 为什么使用多线程。

        对于多线程和线程之间的关系,你可以这样理解:一个使用了多线程技术的程序,包含了两条或两条以上并发运行的线程(Thread)。

        Java 中的 Thread 类就是专门用来创建线程和操作线程的类,我们来具体学习一下。

4.2 创建线程

        根据我们前面所学,我们可以自定义一个类,然后继承 Thread 类来使其成为一个线程类。

        那么我们要把线程要做的事情放在哪里呢?在 Java 中,run() 方法为线程指明了它要完成的任务,你可以通过下面两种方式来为线程提供 run 方法:

  1. 继承 Thread 类并重写它的 run() 方法,然后用这个子类来创建对象并调用 start() 方法。
  2. 通过定义一个类,实现 Runnable 接口,实现 run() 方法。

        概括一下,启动线程的唯一的方法便是 start(),而你需要把待完成的工作(功能代码)放入到 run() 方法中。

        我们来创建两个线程试试。新建一个带有主方法的类 CreateThread

        代码片段如下:

public class CreateThread {

    public static void main(String[] args)
    {
        Thread1 thread1 = new Thread1();
        //声明一个 Thread1 对象,这个 Thread1 类继承自 Thread 类的

        Thread thread2 = new Thread(new Thread2());
        //传递一个匿名对象作为参数

        thread1.start();
        thread2.start();
        //启动线程
    }
}

class Thread1 extends Thread
{
    public void run()
    {
        //在 run() 方法中放入线程要完成的工作

        //这里我们把两个线程各自的工作设置为打印 100 次信息
        for (int i = 0; i < 100; ++i)
        {
            System.out.println("Hello! This is " + i);
        }

        //在这个循环结束后,线程便会自动结束
    }
}

class Thread2 implements Runnable {
    //与 Thread1 不同,如果当一个线程已经继承了另一个类时,就建议你通过实现 Runnable 接口来构造

    public void run()
    {
        for (int i = 0; i < 100; ++i)
        {
            System.out.println("Thanks. There is " + i);
        }
    }
}

        线程的状态共有 6 种,分别是:新建 New、运行(可运行)Runnable、阻塞 Blocked、计时等待 Timed Waiting、等待 Waiting 和终止 Terminate。 

        当你声明一个线程对象时,线程处于新建状态,系统不会为它分配资源,它只是一个空的线程对象。 调用 start() 方法时,线程就成为了可运行状态,至于是否是运行状态,则要看系统的调度了。 调用了 sleep() 方法、调用 wait() 方法和 IO 阻塞时,线程处于等待、计时等待或阻塞状态。 当 run() 方法执行结束后,线程也就终止了。

        我们通过一个例子来加深对于这些状态的理解。新建 ThreadState 类,用于自定义线程的状态。主要的代码如下:

public class ThreadState implements Runnable {

    public synchronized void waitForAMoment() throws InterruptedException {

        wait(500);
        //使用 wait() 方法使当前线程等待 500 毫秒
        //或者等待其他线程调用 notify() 或 notifyAll() 方法来唤醒
    }

    public synchronized void waitForever() throws InterruptedException {

        wait();
        //不填入时间就意味着使当前线程永久等待,
        //只能等到其他线程调用 notify() 或 notifyAll() 方法才能唤醒
    }

    public synchronized void notifyNow() throws InterruptedException {

        notify();
        //使用 notify() 方法来唤醒那些因为调用了 wait() 方法而进入等待状态的线程
    }

    public void run() {

        //这里用异常处理是为了防止可能的中断异常
        //如果任何线程中断了当前线程,则抛出该异常

        try {
            waitForAMoment();
            // 在新线程中运行 waitMoment() 方法

            waitForever();
            // 在新线程中运行 waitForever() 方法

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

        然后再新建一个测试类 ThreadTest,用于输出这些状态。

        接下来会用到 sleep() 方法,下面给出了这个方法的使用方法。

sleep(),在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。填入的参数为休眠的时间(单位:毫秒)。

         调用代码:

public class ThreadTest {
    public static void main(String[] args) throws InterruptedException {
        ThreadState state = new ThreadState();
        //声明并实例化一个 ThreadState 对象

        Thread thread = new Thread(state);
        //利用这个名为 state 的 ThreadState 对象来创建 Thread 对象

        System.out.println("Create new thread: " + thread.getState());
        //使用 getState() 方法来获得线程的状态,并进行输出

        thread.start();
        //使用 thread 对象的 start() 方法来启动新的线程

        System.out.println("Start the thread: " + thread.getState());
        //输出线程的状态

        Thread.sleep(100);
        //通过调用 sleep() 方法使当前这个线程休眠 100 毫秒,从而使新的线程运行 waitForAMoment() 方法

        System.out.println("Waiting for a moment (time): " + thread.getState());
        //输出线程的状态

        Thread.sleep(1000);
        //使当前这个线程休眠 1000 毫秒,从而使新的线程运行 waitForever() 方法

        System.out.println("Waiting for a moment: " + thread.getState());
        //输出线程的状态

        state.notifyNow();
        // 调用 state 的 notifyNow() 方法

        System.out.println("Wake up the thread: " + thread.getState());
        //输出线程的状态

        Thread.sleep(1000);
        //使当前线程休眠 1000 毫秒,使新线程结束

        System.out.println("Terminate the thread: " + thread.getState());
        //输出线程的状态
    }
}

五、总结

        JAVA的基础学习就到此为止吧。

        阿根廷加油啊!梅西进球吧。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法刷题打卡第27天:省份数量---深度优先搜索

省份数量 难度&#xff1a;中等 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相连的城市&#xff0c;组内不…

干测试这些年,去过阿里也去过小公司,给年轻测试员们一个忠告....

前言 你眼中的软件测试岗位是怎样的&#xff1f;大部分人可能会给出这样的回答&#xff1a;“测试&#xff1f;简单啊&#xff0c;没什么技术含量&#xff0c;无非就是看需求、看业务手册、看设计文档、然后点点功能是否实现&#xff0c;麻烦点的就是测试下部署安装是否出现兼…

二十三、CANdelaStudio深入-SnapshotData编辑

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的SnapshotData编辑,欢迎各位朋友订阅、评…

C#语言实例源码系列-实现滚动字幕

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

考虑储能电池参与一次调频技术经济模型的容量配置方法matlab程序

考虑储能电池参与一次调频技术经济模型的容量配置方法matlab程序 参考文献&#xff1a;考虑储能电池参与一次调频技术经济模型的容量配置方法 摘要 &#xff1a;规模间歇电源并网引起的电网频率问题&#xff0c;导致对引入储能辅助调频的研究越发迫切。提出一种考虑储能电池参…

网安学习Day14(web漏洞-SQL注入类型及提交注入)

SQL注入类型及提交注入简要明确参数类型简要明确请求方法参数字符型注入测试>sqlilabs less 5 6sqlilabs less 5在这里插入图片描述sqlilabs less 6POST数据提交注入测试>sqlilabs less 11参数JSON数据注入测试>本地环境代码演示COOKIE数据提交注入测试>sqlilabs l…

解决Windows 10 家庭中文版没有组策略编辑器的问题

解决Windows 10 家庭中文版无法打开组策略编辑器的问题 &#xff08;以下为解决效果&#xff09; 今天在工作时发现电脑无法打开组策略编辑器&#xff0c;即WinR输入gpedit.msc不能正常调出组策略编辑器&#xff1b; 查看了电脑为Windows 10 家庭中文版&#xff0c;查资料后发…

《恋上数据结构与算法》第1季:双向链表实现(超详细笔记,图文并茂)

数据结构与算法的学习笔记目录&#xff1a;《恋上数据结构与算法》的学习笔记 目录索引双向链表一、双向链表补充【List接口 和 AbstractList抽象类】二、设计双向链表三、双向链表的实现1. 查询节点2. 插入节点3. 删除节点4. 清空节点四、双向链表 vs 动态数组一、双向链表 与…

JUC包(java.util.concurrent)下的常用子类

文章目录前言一、对象锁juc.locks包二、原子类三、四个常用工具类3.1 信号量 Semaphore3.2 CountDownLatch总结前言 博主个人社区&#xff1a;开发与算法学习社区 博主个人主页&#xff1a;Killing Vibe的博客 欢迎大家加入&#xff0c;一起交流学习~~ 一、对象锁juc.locks包 …

单元测试入门篇

一、单元测试是什么&#xff1f; 单元测试&#xff08;unit testing&#xff09;&#xff0c;是指对软件中的最小可测试单元进行检查和验证。在测试金字塔模型中处于最底层&#xff1a; 整个金字塔模型代表着越上层的测试集成度越高&#xff0c;执行速度越慢&#xff0c;越下层…

2014-2020年国有大型商业银行和全国股份制商业银行绿色信贷数据

数据集名称&#xff1a;国有大型商业银行和全国股份制商业银行绿色信贷数据 时间范围&#xff1a;2014-2020年 数据来源&#xff1a;商业银行历年业绩报告和社会责任报告 相关说明&#xff1a;绿色金融是指为支持环境改善、应对气候变化和资源节约高效利用的经济活动&#x…

C语言练习之递归实现n的k次方

文章目录前言一、思路二、代码以及运行截图1.代码2.运行截图总结前言 使用C语言递归计算N的k次方 一、思路 求n的k次方的原理就是&#xff1a; n^k nn……*n&#xff08;k个n进行相乘&#xff09; 可以得到一个公式&#xff1a; f(k){1k0n∗f(k)k>0f(k) \left\{\begin{…

利用Redis来实现分布式锁

Redis命令 SET 命令有个 NX 参数可以实现「key不存在才插入」&#xff0c;可以用它来实现分布式锁&#xff1a; 如果 key 不存在&#xff0c;则显示插入成功&#xff0c;可以用来表示加锁成功&#xff1b;如果 key 存在&#xff0c;则会显示插入失败&#xff0c;可以用来表示…

PLC中ST编程的自定义功能块

右键单击——添加对线——程序组织单元 弹出对话框 修改名称&#xff0c;选择功能块&#xff1b; VAR_INPUT&#xff1a;输入变量&#xff1b;VAR_OUTPUT:输出变量&#xff1b;VAR&#xff1a;局部变量&#xff1b; 创建一个闪烁功能块&#xff0c;可输入亮和灭的时间&#xff…

基于SSM的高校共享单车管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86468380 主要使用技术 SpringSpringMVCMybatisEasyUIJqueryMysql 功能介绍 系统用户管理&#xff1a; 用户管理&#xff1a;可以添加、修改、删除、检索用户信息&#xff08;头像、用户账…

PSO粒子群算法微电网优化调度(微电网孤岛运行优化调度)matlab程序

PSO粒子群算法微电网优化调度&#xff08;微电网孤岛运行优化调度&#xff09;matlab程序 【含风电、光伏、微型燃机、储能蓄电池、燃料电池】 参考文献&#xff1a;基于改进粒子群算法的微电网优化调度 摘 要&#xff1a;当今全球普遍面临着能源危机和环境污染的加重&#xf…

全国工企专利匹配数据(1998-2014)

1、数据来源&#xff1a;国家统计局&#xff08;工业企业数据&#xff09;、专利数据来源于国家知识产权局。 2、时间跨度&#xff1a;1998-2014 3、区域范围&#xff1a;全国 4、指标说明&#xff1a; 包含以下指标&#xff1a; 公开&#xff08;公告&#xff09;日、申请…

基于SSM的毕业设计管理系统【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86469261 主要使用技术 SpringSpringMVCMybatisBootstrapJqueryMysql 功能介绍 本系统的用户可以分为三种&#xff1a;管理员、教师、学生。 管理员&#xff1a;导师管理、学生管理&#x…

【雷达通信】合成孔径雷达地面运动目标检测技术研究(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

第九章 持续集成CI:基于GitHub的Action回归验证

第九章 持续集成CI&#xff1a;基于GitHub的Action回归验证 持续集成可以认为是一种优秀的开发实践&#xff0c;它可以在代码变更的时候及时反映代码状态。持续集成需要服务器的支持&#xff0c;可以考虑通过 gitlib ci 或者 jenkins 自己搭建持续集成服务器&#xff0c;更好的…