Java基础补习Day6

聊聊JVM(五)从JVM角度理解线程 这篇说说如何从JVM的角度来理解线程,可以对Java的线程模型有一个更加深入的理解,对GC的一些细节也会理解地更加深刻。本文基于HotSpot的OpenJDK7实现。 我们知道JVM主要是用C++实现的,JVM定义的Thread的类继承结构如下: Class hierarchy  - Thread    - NamedThread      - VMThread      - 阅读详情

一、文件IO补充

1、Reader/Writer 字符流的基类

1.1 Reader

继承关系:
    Object父类
    Closeable Readable 父接口。
构造器:
    构造器都是protected,专门给子类设计。(抽象类)
方法:
    read() 读取字符。
    close() 关闭流。

1.2 Writer

继承关系:
    Object父类
    closeable, Flushable, Appendable 父接口。
构造器:
方法:
    append()方法
    close()关闭流
    flush()刷新
    write()写字符

1.3 实现子类:

OutputStreamWriter
    继承关系:继承Writer
    构造器:
        OutputStreamWriter(OutputStream out) :要基于OutputStream对象来创建。
InputStreamReader
    继承关系:继承Reader
    构造器:
        InputStreamReader(InputStream in) :要基于InputStream对象来创建。
注意:
java中流的分类,还可以按照是否基于别的流创建对象:
不基于别的流创建对象:节点流
基于别的流创建对象:  处理流 

2、BufferedReader

继承关系:继承Reader
构造器:BufferedReader (reader) 基于别的Reader对象,来创建。

注意:这里我们可以看到很多的流在实现功能增强时,采用了一种俄罗斯套娃形式,逐步实现了对内层流功能的增加。这种代码的编写格式就是装饰模式。

3、BufferedWriter

BufferedWriter和BufferReader相类似


BufferReader已实现了字节到字符转换的麻烦,下面两个也已实现了字节到基本数据类型数值的转换
DataInputStream
    继承关系:FilterInputStream
    接口:closeable,DataInput
DataOutpuStream
    继承关系:FilterOutputStream
    接口:Closeable, Flushable,  DataOutput

4、 对象序列化:

4.1 对象输入输出流:

ObjectInputStream/ObjectOutputStream

WriteObject():将对象写入输出流中
ReadObject():从 ObjectInputStream 读取对象

将对象转化为流:序列化。
将流转化为对象:反序列化。
4.2 属性的隐藏:
1.transient 临时会属性,让对象在序列化时,此属性不被序列化。

如果被transient修饰的属性,我们想要序列化他怎么办?

2.自定义序列化方法:
这两个方法写法固定,而且并没有用过接口来规范,所以我们通常从api中拷贝出来:
private void writeObject(java.io.ObjectOutputStream out)
        throws IOException ;
private void readObject(java.io.ObjectInputStream in)
        throws IOException, ClassNotFoundException;
他们writeObject负责对象的序列化:序列化属性。
         readObject负责对象的反序列化:取出我们保存的属性。

3.自定义序列化接口:
如果我们忘记了上面方法的写法,又必须实现自定义序列化:
Externalizable 自定义序列化接口:
        writeExternal() ;
        readExternal() ;

如果序列化和反序列化发生在了两个程序中,这个时候,java是要求我们必须显示地为序列化类型设置一个UID:
static final long serialVersionUID = 42L;

二、进程与线程:

1.定义:

进程:在每个系统中,每个系统有自己独自的定义。通常来讲进程就代表一个程序。

线程:线程是代码的执行流程。我们程序启动,会创建一个进程,在这个进程中通常都会带有一条线程,这条线程会找到main方法,并从main开始逐条执行我们的语句。

注意:
- 在java中,我们没有一个明确的api专门负责操作进程。这个java是通过JNI技术通过native方法调用本地api来执行的。
- 一个进程中可以拥有多条线程。

2.关键类

Thread 和 Runnable

Thread类是Java对线程的描述。
Runnable接口是Java对线程任务的规范,其中有run()方法,线程所有执行的任务都要在run()方法里

3.启动线程

方式1:创建Thread对象,创建Runnable的子类型实现run方法,Thread启动线程start(),并回调run方法

方式2:实现Thread类型的的子类型,并扩展run方法,再由Thread启动线程start()

4.线程的调度

4.1 停止
  • 当线程的任务执行完毕,自动销毁
  • stop()和destory()方法终止线程,但不推荐
  • 抛出异常
正常来说我们要停止线程,我们采用方法1,让run方法中的任务执行完毕,线程自动销毁。
4.2 让出CPU :yield()

让出cpu的执行权,然后重新去获取。

4.3 线程的优先级

相关方法
getPriority():获取该线程的优先级
setPriority():设置该线程的优先级

4.4 sleep():
使线程进入“睡眠”状态。在规定的时间内,这个线程是不会运行的。同时让出CPU
4.5 join():
线程都是同时执行的,如果有两条线程,要实现一条线程A先执行,另一条线程B再执行,可以在B线程中调用A.join(),从而实现B等待A执行完毕,再执行。
4.6 线程所带来的问题

当多条线程对同一个数据进行操作时,可能发生数据同步问题。所以我们需要多个线程处理一个数据时,同时只允许一条线程对数据进行操作,执行完毕后,交由后面等候的一条线程执行。

如何解决上述问题,让线程同步呢?

java中提供了一个由对象实现的互斥锁,我们可以通过锁将数据进行保护,保证同一时刻,只有一条线程能操作。

锁的使用:
1.java中所有对象都持有一把同步锁。不同对象的同步锁不会互相作用。
2.多条线程要实现同步操作,必须基于同一个对象的锁实现,锁代码块,才能起作用。

锁的方式:
synchronized(锁对象){
    锁住的代码。
}
public synchronized void func(){
    锁住的代码。//锁方法是锁的this对象。
}
4.7.wait()和notify()
wait(): 锁语句块中,让线程停止。
notify() /notifyAll():在同一个锁的语句块中,让wait停止的线程重新启动。

notify()是唤醒在这个对象上等待的一条线程(随机),notifyAll()是唤醒在这个对象上等待的所有的线程。

作用:

让一条线程在一个对象A上等待(停止),需要唤醒时,由另一条线程调用对象A的唤醒方法,来唤醒在对象上等待的那条线程。

注意:

这两个方法都是Object的方法,虽然是作用于Thread,但是由于实现是基于对象来实现的,所以他们是Object的方法。

机器人轨迹规划——三次样条轨迹1(基于速度的求解方法) 三次样条轨迹是利用三次样条曲线来对给定的一系列点进行插值,从而得到一个光滑的轨迹。三次样条因为每段的多项式次数最高都是三阶的,所以可以得到2阶导数连续,也就是加速度连续的轨迹。假设给定了一系列的点q0q1q2qnq0​q1​q2​...qn​,以及每个点对应的参数t0t1t2tnt0​t1​t2​...tn​,计算一条三次样条曲线sts(t)st,该曲线通过给定的点q0q1q2qnq0​q1。 阅读详情

相关推荐

阿里云大模型ACP认证模拟考试(二)

摘要:在阿里云大模型高级工程师 ACP 认证暂无真题题库的现状下,模拟题具有重要意义。其依照真实考试设计,涵盖题型、题量与分值分布,助力考生熟悉考试框架,合理分配答题时间精力,提升效率。同时,模拟题紧扣官方课程,能帮助考生精准定位知识盲点,如大模型架构原理和通义千问应用实践等重点内容,以便针对性完善知识体系。此外,通过练习模拟题,考生可掌握不同题型的解题思维与技巧,快速洞察复杂题目本质,提高答题准确率。

davidkorhenn的博客 2070

Io及多线程

IO流 1.概念 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流,输出流。 流按操作类型分为两种:字节流与字符流。  字节流可以操作任何数据,字符流只能操作纯字符数据,比较方便。 2.IO流常用父类 字节流的抽象父类: InputStream ,OutputSt

小么飞刀的博客 996

AutoLisp文件(.lsp)从编写到加载运行:一份给CAD新手的避坑指南

本文为CAD新手提供了一份AutoLisp文件(.lsp)从编写到加载运行的完整指南,涵盖编写环境配置、文件加载流程、调试技巧及工程化实践建议。通过详细的步骤和常见错误解决方案,帮助用户避免常见陷阱,提升AutoLisp脚本的开发效率和应用效果。

weixin_29228203的博客 893

Java基础总结(二)----集合、多线程、io、虚拟机等

Java集合java集合框架的结构List接口List接口通常表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,常用实现类为ArrayList和LinkedList,另外还有不常用的Vector。另外,LinkedList还是实现了Queue接口,因此也可以作为队列使用。Set接口Set接口通常表示一个集合,其中的元素不允许重复(通过hashcode和equals函数保证),常用实现类有H

高远的博客 9594

海思Hi3516DV300实战:从yolov5模型训练到Sort跟踪算法的完整部署流程

本文详细介绍了在海思Hi3516DV300芯片上部署YOLOv5目标检测与Sort多目标跟踪算法的完整流程。内容涵盖从特定场景数据训练YOLOv5模型、模型格式转换(PyTorch到ONNX再到Caffe),到利用海思NNIE引擎生成WK模型并进行端侧集成与优化的全链路实战经验,旨在解决嵌入式设备上实时人流量统计等实际应用挑战。

weixin_29034963的博客 336

VSCode+PlatformIO新建工程卡成狗?3步提速大法实测有效(附镜像源配置)

针对VSCode+PlatformIO新建工程时因依赖下载缓慢导致的加载慢问题,本文提供了三步核心提速方案。通过配置Python环境变量、修改PlatformIO插件设置以使用国内镜像源,并优化pip配置文件,实测可大幅缩短工程创建时间,有效解决创建工程卡顿的痛点。

delta的博客 708

Java基础补习Day1

一、Java安装及环境的搭建1、Java的下载:jdk的下载地址2、Java的安装: 根据提示逐步安装,可以选择默认安装位置也可以更改安装位置,注意安装的位置一定要记住。 3、环境变量的配置: 设置系统环境变量 添加JAVA_HOME变量(可以不加),值为Java的安装目录的路径例如:F:\java_path 在Path中添加Java安装目录下的jdk目录下的bin目录,例如F:\jav

IOT Dream_Maker 451

RPA机器人技术原理初探

RPA初步

曲折旅程,艰难人生 2137

Java基础补习---Day 01

来华清java基础补习第一天

qq_49544301的博客 343

C#上位机实战:Modbus RTU串口通信(CRC校验+超时重发完整实现)

在工业自动化上位机开发中,Modbus RTU是串口通信的事实标准协议,SerialPort是 .NET 平台操作串口的原生类,无需依赖第三方库即可实现基础通信。实际项目中,工控现场存在电磁干扰、串口丢包、设备响应延迟等问题,CRC 数据校验用于保证报文完整性,超时重发机制用于提升通信稳定性。本文从零封装一套可直接落地的 Modbus RTU 通信组件,包含完整的校验算法、超时控制、重发逻辑,并配套 WinForm 演示界面。本文基于 C# 原生SerialPort类,实现了一套生产可用。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 384

手把手教你学 Simulink (1.3):探索Simulink模块库的奇妙世界

Simulink模块库按照功能分为多个类别,每个类别包含专门用于特定任务的模块。% 打开Simulink库浏览器% 或者以编程方式获取库列表disp('可用的库列表:');end常用模块(Simulink):最基础和最常用的模块信号处理模块(DSP System Toolbox):专业信号处理工具通信模块(Communications Toolbox):通信系统设计控制系统模块(Control System Toolbox):控制系统设计与分析% 创建自定义模块库。

QQ_778132974的博客 381

Java基础补习---Day 02

来华清java基础补习的第二天

qq_49544301的博客 167

微信开发 - 最新第三方网站接入微信登录、微信支付时,本地 redirect_uri 参数错误导致无法调试的解决方案(微信开放平台)完美解决每次都需要部署到线上测试,在本地使用本地 ip 就能轻松调试

redirect_uri参数错误,微信第三方登录,没有服务器时的测试方法,微信开放平台的回调域名怎么设置为本地域名IP,微信登录微信支付每次调试都需要放到服务器上怎么办,微信登录支付业务在本地调试不了怎么办,在本地怎么测试微信支付和登录,微信第三方登陆本地测试,怎么在本地进行测试,微信回调域怎么设置为本地IP,微信扫码登录redirect_uri参数错误,微信开放平台,微信开放平台开发的第三方登录和支付,vue2,nuxt2,vue3,nuxt3,uniapp,微信开放平台,公众号,微信支付,微信登录授权,

🏆 前端领域优质创作者 8791

Java基础补习---Day 11

来华清java基础补习的第十一天

qq_49544301的博客 140

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java基础补习Day5

一、Iterable接口1、作用:提供iterator方法,这个方法返回迭代器(iterator)。 2、意义:迭代器是java为Collection集合容器类提供的一个统一的遍历方式。其中foreach循环就是利用iterator方法来实现的 3、使用:1.方法hasNext()判断后面是否还有数据 2.方法next()获取后面的一个数据 后面,是由于我们的迭代器不是指向数据的,而是指向数据的前面

IOT Dream_Maker 463

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java基础补习---Day 09

来华清java基础补习的第九天

qq_49544301的博客 291

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java基础补习Day4

一、数组1.数组的创建方式: 静态创建:(使用{}来设置数组) Object[] array = {1, true, "A"} ; String[] str = new String[]{"abc","123"}; 动态创建:(通过new关键字创建,数组是在内存上分配的一个固定长度的区间,所以一定要确定内容的长度) Object[] array = new Object[5] ;

IOT Dream_Maker 411

Java基础补习Day3

异常处理 Java为了保证程序的健康运行,通过异常处理机制,来让代码更加完善。Throwable是所有异常信息的基类Error:非常严重的错误,当前Java层面无法解决,让程序终止 Exception:异常 RuntimeException是Exception的子类补充: RunTimeException 运行时异常 Exception 非运行时异常 如何处理异常

IOT Dream_Maker 480

Java基础补习---Day 07

来华清java基础补习的第七天

qq_49544301的博客 168

Java基础补习---Day 10

来华清java基础补习的第十天

qq_49544301的博客 207

Java基础补习---Day 06

来华清java基础补习的第六天

qq_49544301的博客 165

Java基础补习---Day 05

来华清java基础补习的第5天

qq_49544301的博客 158

Java基础补习---Day 08

来华清java基础补习的第八天

qq_49544301的博客 243

Java基础补习---Day 12

来华清java基础补习的第十二天

qq_49544301的博客 103

Java基础补习Day2

一、面向对象的介绍从以前面向过程的编程方式,我们编写程序先整理流程图,以流程图来编写程序 但是面向对象的编程方式,首先我们不再去整理业务流程,而是先找寻业务执行主体。进而创建业务主体。 然后整个程序都由这些业务主体自主完成 注意:一个空的对象占8个字节,增加一个属性,就增加这个属性所占的空间大小,增加一个int型的变量,就增加4个字节 eg. /** *矩形是名称,也就是这个业务的执行主体,将

IOT Dream_Maker 459

Java基础补习---Day 04

来华清java基础补习的第四天

qq_49544301的博客 160
上一篇: Java基础补习Day5
下一篇: Linux 系统调用号
CharyPro
博客等级 码龄11年 21粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值