day08-Java常用API
day08——Java常用API
一、今日内容介绍、API概述
各位同学,我们前面已经学习了面向对象编程,使用面向编程这个套路,我们需要自己写类,然后创建对象来解决问题。但是在以后的实际开发中,更多的时候,我们是利用面向编程这种套路,使用别人已经写好的类来编程的。
这就是我们今天要学习的内容——常用API(全称是Application Program Interface 应用程序接口),说人话就是:别人写好的一些程序,给咱们程序员直接拿去调用。
Java官方其实已经给我们写好了很多很多类,每一个类中又提供了一系列方法来解决与这个类相关的问题。
- 比如String类,表示字符串,提供的方法全都是对字符串操作的。
- 比如ArrayList类,表示一个容器,提供的方法都是对容器中的数据进行操作的。
像这样的类还有很多,Java把这些类是干什么用的、类中的每一个方法是什么含义,编写成了文档,我们把这个文档称之为API文档。
1. 我们为什么要学习别人写好的程序呢?
在行业中有这么一句话:“不要重复造轮子”。这里所说的轮子就是别人已经写过的程序。意思就是不要写重复的程序,因为程序是用来解决问题的,如果这个问题别人已经解决过,并且这个解决方案也得到了市场认可,那就不用再自己重复写这个程序了。
Java已经发展了20多年,在这20多年里,已经积累类了很多问题的解决方案,基本上现在我们遇到的问题,在这20多年里,早就有人解决过。
所以我们把面向对象的高级知识学习完之后,Java语言的语法知识就已经学习完了。剩下的所有内容都是是学习一个一个的API,通过调用API提供的方法来解决实际问题。
2. 我们要学习哪些API
Java的API文档中,有那么多的类,是所有的类都要学习吗?并不是 ,虽然Java提供了很多个类,但是并不是所有类都得到了市场认可,我们只学习一些在工作中常用的就行。
除了Java官方提供的API,还一些第三方的公司或者组织也会提供一些API,甚至比Java官方提供的API更好用,在需要的时候我们也会告诉大家怎么用。
3. 今天我们主要学习两个类,一个是String类、还有一个是ArrayList类。
字符串的应用场景是非常多的,可以说是无处不在。
比如,在用户登录时,需要对用户名和密码进行校验,这里的用户名和密码都是String
再比如,在和网友聊天时,其实输入的文字就是一个一个字符串
再比如,在百度上搜索时,搜素的关键词,也是字符串
学习完String类之后,还会学习一个类ArrayList
大家知道数组是一个容器,有数组干嘛还要集合呢? 因为数字的长度是固定的,一旦创建不可改变。
比如数组的长度为3,想要存储第4个元素就存不进去了。
使用集合就可以解决上面的问题,集合可以根据需要想存多少个元素就存多少个元素。
二、包
1. 什么是包
在学习API类之前,我们先要学习包。因为Java官方提供的类有很多,为了对这些类进行分门别类的管理,别人把写好的类都是放在不同的包里的。
包其实类似于文件夹,一个包中可以放多个类文件。如下图所示
建包的语法格式:
//类文件的第一行定义包
package com.zhushanglin.javabean;public class 类名{}
2. 在自己的程序中,调用其他包中的程序,需要注意下面一个问题
-
如果当前程序中,要调用自己所在包下的其他程序,可以直接调用。(同一个包下的类,互相可以直接调用)
-
如果当前程序中,要调用其他包下的程序,则必须在当前程序中导包, 才可以访问!
导包格式:
import 包名.类名
-
如果当前程序中,要调用Java.lang包下的程序,不需要我们导包的,可以直接使用。
-
如果当前程序中,要调用多个不同包下的程序,而这些程序名正好一样,此时默认只能导入一个程序,另一个程序必须带包名访问。
三、String类
1. String类概述
各位同学,接下来我们学习String这个类,也就是学对字符串进行处理。为什么要学习字符串处理呢?因为在开发中对于字符串的处理还是非常常见的。
比如:在用户登录时,用户输入的用户名和密码送到后台,需要和正确的用户名和密码进行校验,这就需要用到String类提供的比较功能。
再比如:同学们在直播留言时,有些小伙伴可能不太文明说了一些脏话,后台检测到你输入的是脏话,就会用***
把脏话屏蔽掉。这也需要用到String类提供的替换功能
Java为了方便我们处理字符串,所以给我们提供了一个String类来代表字符串,这个类就是java.lang
包下。
按照面向对象的编程思想,对于字符串的操作,只需要创建字符串对象,用字符串对象封装字符串数据,然后调用String类的方法就可以了。
2. String创建对象
接下来我们打开String类的API,看一下String类的对象如何创建。如下图所示
String类的API中,有这么一句话:“Java程序中的所有字符串字面值(如"abc")都是字符串的实例实现”。这里所说的实例实现,其实指的就是字符串对象。
意思就是:所有Java的字符串字面值,都是字符串对象。
- 所以创建String对象的第一种方式就有了
String s1 = "abc"; //这里"abc"就是一个字符串对象,用s1变量接收String s2 = "小朱程序员"; //这里的“小朱程序员”也是一个字符串对象,用s2变量接收
- 创建String对象还有第二种方式,就是利用String类的构造方法创建String类的对象。
我们前面学习过类的构造方法,执行构造方法需要用到new关键字。new String(参数)
就是在执行String类的构造方法。
下面我们演示通过String类的构造方法,创建String类的对象
// 1、直接双引号得到字符串对象,封装字符串数据
String name = "小朱666";
System.out.println(name);// 2、new String创建字符串对象,并调用构造器初始化字符串
String rs1 = new String();
System.out.println(rs1); // ""String rs2 = new String("zhushanglin");
System.out.println(rs2);char[] chars = {'a', '小', '朱'};
String rs3 = new String(chars);
System.out.println(rs3);byte[] bytes = {97, 98, 99};
String rs4 = new String(bytes);
System.out.println(rs4);
关于String类是用来干什么的,以及String类对象的创建我们就学习到这里。最后总结一下
1. String是什么,可以做什么?答:String代表字符串,可以用来创建对象封装字符串数据,并对其进行处理。2.String类创建对象封装字符串数据的方式有几种?方式一: 直接使用双引号“...” 。方式二:new String类,调用构造器初始化字符串对象。
3. String类的常用方法
各位同学,在上一节课中,我们学习了如何通过字符串对象封装数据,接下来我们学习调用String类的方法对象字符串数据进行处理。
这里已经将String类的常用方法,给同学们挑出来了,我们先快速的认识一下。为什么是快速认识一下呢?因为API真正的作用是来解决业务需求的,如果不解决业务需求,只是记API是很难记住的。
所以API的正确打开方式是,先找到这个类,把这个类中的方法先用代码快速过一遍,有一个大概印象就行。然后再具体的案例中,选择你需要的方法来用就行。
下面我们就把String类中的方法,按照方法的调用规则,先快速过一遍。(注意:第一次调用API方法,都是看着API方法来调用用的,不是背的)
public class StringDemo2 {public static void main(String[] args) {//目标:快速熟悉String提供的处理字符串的常用方法。String s = "挑战100天学会Java";// 1、获取字符串的长度System.out.println(s.length());// 2、提取字符串中某个索引位置处的字符char c = s.charAt(1);System.out.println(c);// 字符串的遍历for (int i = 0; i < s.length(); i++) {// i = 0 1 2 3 4 5char ch = s.charAt(i);System.out.println(ch);}System.out.println("-------------------");// 3、把字符串转换成字符数组,再进行遍历char[] chars = s.toCharArray();for (int i = 0; i < chars.length; i++) {System.out.println(chars[i]);}// 4、判断字符串内容,内容一样就返回trueString s1 = new String("小朱");String s2 = new String("小朱");System.out.println(s1 == s2); // falseSystem.out.println(s1.equals(s2)); // true// 5、忽略大小写比较字符串内容String c1 = "34AeFG";String c2 = "34aEfg";System.out.println(c1.equals(c2)); // falseSystem.out.println(c1.equalsIgnoreCase(c2)); // true// 6、截取字符串内容 (包前不包后的)String s3 = "Java是最好的编程语言之一";String rs = s3.substring(0, 8);System.out.println(rs);// 7、从当前索引位置一直截取到字符串的末尾String rs2 = s3.substring(5);System.out.println(rs2);// 8、把字符串中的某个内容替换成新内容,并返回新的字符串对象给我们String info = "这个电影简直是个垃圾,垃圾电影!!";String rs3 = info.replace("垃圾", "**");System.out.println(rs3);// 9、判断字符串中是否包含某个关键字String info2 = "Java是最好的编程语言之一,我爱Java,Java不爱我!";System.out.println(info2.contains("Java"));System.out.println(info2.contains("java"));System.out.println(info2.contains("Java2"));// 10、判断字符串是否以某个字符串开头。String rs4 = "张三丰";System.out.println(rs4.startsWith("张"));System.out.println(rs4.startsWith("张三"));System.out.println(rs4.startsWith("张三2"));// 11、把字符串按照某个指定内容分割成多个字符串,放到一个字符串数组中返回给我们String rs5 = "张无忌,周芷若,殷素素,赵敏";String[] names = rs5.split(",");for (int i = 0; i < names.length; i++) {System.out.println(names[i]);}}
}
演示完String类的这些方法之后,我们对字符串有哪些方法,就已经有一个大致印象了。至少知道String字符串能干哪些事情。
至于String类的这些方法是否都记住了,这个还需要通过一些案例训练,在用的过程中去找哪个方法能够解决你的实际需求,就用哪个方法。同一个方法用的次数多个,自然就记住了。
4. String的注意事项
在上一节,我们学习了字符串的一些常用方法,在实际工作中用这些方法解决字符串的常见问题是完全足够的,但是在面试时可能会问一些原理性的东西。
所以把字符串原理性的内容,就当做注意事项来学习一下。一共有下面的2点:
- 注意事项1:String类的对象是不可变的对象
我们先看一段代码,分析这段代码的结果
以上代码中,先定义了一个String变量 name第一次赋值为“小朱”;
然后对name
变量记录的字符串进行两次拼接,第一次拼接“是一个”
,第二次拼接“程序员”
;我们发现得到的结果是:小朱是一个程序员
这里问题就来了,你不是是说:**String类的对象是不可变的字符串对象吗?**我看name的值变了呀!!!
下面我们就解释一下,String是不可变对象到底是什么含义。
需要注意的是:只要是以“”
方式写出的字符串对象,会在堆内存中的字符串常量池中存储。
执行第一句话时,会在堆内存的常量池中,创建一个字符串对象“小朱”
,然后把“小朱”
的地址赋值给String name
当执行第二句话时,又会再堆内存的常量池中创建一个字符串“是一个”
,和“小朱”
拼接,拼接之后还会产生一个新的字符串对象”小朱是一个“
,然后将新产生的“小朱是一个”
对象的地址赋值给String name
变量。
此时你会发现,之前创建的字符串对象“小朱”
内容确实是没有改变的。所以说String的对象是不可变的。
- 注意事项2:字符串字面量和new出来字符串的区别
- 只要是以
“...”
方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份。如下图一所示 - 但通过
new
方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。如下图二所示
- 只要是以
- 总结一下,字符串的注意事项。
1. String是不可变字符串对象
2. 只要是以“...”方式写出的字符串对象,会存储到字符串常量池,且相同内容的字符串只存储一份;
3. 但通过new方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。
5. String案例一:用户登录案例
接下来给大家做一个案例,使用字符串的功能完成登录案例。案例需求如下:
分析一下完成案例的步骤:1.首先,从登录界面上可以得出,需要让用户输入登录名和密码2.设计一个登录方法,对用户名和密码进行校验3.调用登录方法,根据方法的返回结果,判断登录是否成功。4.如果登录失败,循环登录3次,结束循环;如果登录成功,跳出循环;
案例分析的步骤完成代码
/**目标:完成用户的登录案例。*/
public class StringTest4 {public static void main(String[] args) {// 1、开发一个登录界面for (int i = 0; i < 3; i++) {Scanner sc = new Scanner(System.in);System.out.println("请您输入登录名称:");String loginName = sc.next();System.out.println("请您输入登录密码:");String passWord = sc.next();// 5、开始调用登录方法,判断是否登录成功boolean rs = login(loginName, passWord);if(rs){System.out.println("恭喜您,欢迎进入系统~~");break; // 跳出for循环,代表登录完成}else {System.out.println("登录名或者密码错误,请您确认~~");}}}/**2、开发一个登录方法,接收用户的登录名和密码,返回认证的结果*/public static boolean login(String loginName, String passWord){// 3、准备一份系统正确的登录名和密码String okLoginName = "zhushanglin";String okPassWord = "123456";// 4、开始正式判断用户是否登录成功/*if(okLoginName.equals(loginName) && okPassWord.equals(passWord)){// 登录成功的return true;}else {return false;}*/return okLoginName.equals(loginName) && okPassWord.equals(passWord);}
}
6. String案例二:随机产生验证码
接下来学习一个再工作中也比较常见的案例,使用String来开发验证码。需求如下:
根据需求分析,步骤如下:1.首先,设计一个方法,该方法接收一个整型参数,最终要返回对应位数的随机验证码。2.方法内定义2个字符串变量:1个用来记住生成的验证码,1个用来记住要用到的全部字符。3.定义for循环控制生成多少位随机字符4.每次得到一个字符范围内的随机索引5.根据索引提取该字符,把该字符交给code变量连接起6.循环结束后,在循环外返回code即可。7.在主方法中调用生成验证码的方法
根据步骤完成代码
import java.util.Random;
/**目标:完成随机产生验证码,验证码的每位可能是数字、大写字母、小写字母*/
public class StringTest5 {public static void main(String[] args) {System.out.println(createCode(4));System.out.println(createCode(6));}/**1、设计一个方法,返回指定位数的验证码*/public static String createCode(int n){// 2、定义2个变量 //一个是记住最终产生的随机验证码 //一个是记住可能用到的全部字符String code = "";String data = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";Random r = new Random();// 3、开始定义一个循环产生每位随机字符for (int i = 0; i < n; i++) {// 4、随机一个字符范围内的索引。int index = r.nextInt(data.length());// 5、根据索引去全部字符中提取该字符code += data.charAt(index); // code = code + 字符}// 6、返回code即可return code;}
}
关于String的案例,我们先练习到这里。以后遇到对字符串进行操作的需求,优先找String类有没有提供对应的方法。
四、ArrayList类
1. ArrayList快速入门
学习完String类之后,接下来再学习一个类——叫ArrayList。
ArrayList表示一种集合,它是一个容器,用来装数据的,类似于数组。那有了数组,为什么要有集合呢?
因为数组一旦创建大小不变,比如创建一个长度为3的数组,就只能存储3个元素,想要存储第4个元素就不行。而集合是大小可变的,想要存储几个元素就存储几个元素,在实际工作中用得更多。
然后集合有很多种,而ArrayList只是众多集合中的一种,跟多的集合我们在就业班的课程中再学习。如下图所示:
集合该怎么学呢?1. 首先你要会创建集合对象,2. 然后能够调用集合提供的方法对容器中的数据进行增删改查,3. 最后知道集合的一些特点就可以了。
2. ArrayList常用方法
想要使用ArrayList存储数据,并对数据进行操作:
-
第一步:创建ArrayList容器对象。一般使用空参数构造方法,如下图所示:
-
第二步:调用ArrayList类的常用方法对容器中的数据进行操作。常用方法如下:
接下来我们把ArrayList集合的这些方法快速的熟悉一下:
/**
目标:要求同学们掌握如何创建ArrayList集合的对象,并熟悉ArrayList提供的常用方法。*/
public class ArrayListDemo1 {public static void main(String[] args) {// 1、创建一个ArrayList的集合对象// ArrayList<String> list = new ArrayList<String>();// 从jdk 1.7开始才支持的ArrayList<String> list = new ArrayList<>();list.add("小朱");list.add("小朱");list.add("Java");System.out.println(list);// 2、往集合中的某个索引位置处添加一个数据list.add(1, "MySQL");System.out.println(list);// 3、根据索引获取集合中某个索引位置处的值String rs = list.get(1);System.out.println(rs);// 4、获取集合的大小(返回集合中存储的元素个数)System.out.println(list.size());// 5、根据索引删除集合中的某个元素值,会返回被删除的元素值给我们System.out.println(list.remove(1));System.out.println(list);// 6、直接删除某个元素值,删除成功会返回true,反之System.out.println(list.remove("Java"));System.out.println(list);list.add(1, "html");System.out.println(list);// 默认删除的是第一次出现的这个小朱的数据的System.out.println(list.remove("小朱"));System.out.println(list);// 7、修改某个索引位置处的数据,修改后会返回原来的值给我们System.out.println(list.set(1, "小朱是程序员"));System.out.println(list);}
}
3. ArrayList应用案例1
接下来,我们学习一个ArrayList的应用案例,需求如下:
我们分析一下这个案例的步骤该如何实现:
1.用户可以选购多个商品,可以创建一个ArrayList集合,存储这些商品
2.按照需求,如果用户选择了"枸杞"批量删除,应该删除包含"枸杞"的所有元素1)这时应该遍历集合中每一个String类型的元素2)使用String类的方法contains判断字符串中是否包含"枸杞"3)包含就把元素删除
3.输出集合中的元素,看是否包含"枸杞"的元素全部删除
按照分析的步骤,完成代码
public class ArrayListTest2 {public static void main(String[] args) {// 1、创建一个ArrayList集合对象ArrayList<String> list = new ArrayList<>();list.add("枸杞");list.add("Java入门");list.add("宁夏枸杞");list.add("黑枸杞");list.add("人字拖");list.add("特级枸杞");list.add("枸杞子");System.out.println(list);//运行结果如下: [Java入门, 宁夏枸杞, 黑枸杞, 人字拖, 特级枸杞, 枸杞子]// 2、开始完成需求:从集合中找出包含枸杞的数据并删除它for (int i = 0; i < list.size(); i++) {// i = 0 1 2 3 4 5// 取出当前遍历到的数据String ele = list.get(i);// 判断这个数据中包含枸杞if(ele.contains("枸杞")){// 直接从集合中删除该数据list.remove(ele);}}System.out.println(list);//删除后结果如下:[Java入门, 黑枸杞, 人字拖, 枸杞子]}
}
运行完上面代码,我们会发现,删除后的集合中,竟然还有黑枸杞
,枸杞子
在集合中。这是为什么呢?
枸杞子被保留下来,原理是一样的。可以自行分析。
那如何解决这个问题呢?这里打算给大家提供两种解决方案:
- 集合删除元素方式一:每次删除完元素后,让控制循环的变量
i--
就可以了;如下图所示
具体代码如下:
// 方式一:每次删除一个数据后,就让i往左边退一步
for (int i = 0; i < list.size(); i++) {// i = 0 1 2 3 4 5// 取出当前遍历到的数据String ele = list.get(i);// 判断这个数据中包含枸杞if(ele.contains("枸杞")){// 直接从集合中删除该数据list.remove(ele);i--;}
}
System.out.println(list);
- 集合删除元素方式二:我们只需要倒着遍历集合,在遍历过程中删除元素就可以了
具体代码如下:
// 方式二:从集合的后面倒着遍历并删除
// [Java入门, 人字拖]
// i
for (int i = list.size() - 1; i >= 0; i--) {// 取出当前遍历到的数据String ele = list.get(i);// 判断这个数据中包含枸杞if(ele.contains("枸杞")){// 直接从集合中删除该数据list.remove(ele);}
}
System.out.println(list);
4. ArrayList应用案例2
各位同学,上一个ArrayList应用案例中,我们往集合存储的元素是String类型的元素,实际上在工作中我们经常往集合中自定义存储对象。
接下来我们做个案例,用来往集合中存储自定义的对象,先阅读下面的案例需求:
分析需求发现:
- 在外卖系统中,每一份菜都包含,菜品的名称、菜品的原价、菜品的优惠价、菜品的其他信息。那我们就可以定义一个菜品类(Food类),用来描述每一个菜品对象要封装那些数据。
- 接着再写一个菜品管理类(FoodManager类),提供展示操作界面、上架菜品、浏览菜品的功能。
- 首先我们先定义一个菜品类(Food类),用来描述每一个菜品对象要封装那些数据。
public class Food {private String name; //菜品名称private double originalPrice; //菜品原价private double specialPrice; //菜品优惠价private String info; //菜品其他信息public Food() {}public Food(String name, double originalPrice, double specialPrice, String info) {this.name = name;this.originalPrice = originalPrice;this.specialPrice = specialPrice;this.info = info;}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getOriginalPrice() {return originalPrice;}public void setOriginalPrice(double originalPrice) {this.originalPrice = originalPrice;}public double getSpecialPrice() {return specialPrice;}public void setSpecialPrice(double specialPrice) {this.specialPrice = specialPrice;}public String getInfo() {return info;}public void setInfo(String info) {this.info = info;}
}
- 接下来写一个菜品管理类,提供上架菜品的功能、浏览菜品的功能、展示操作界面的功能。
public class FoodManager{//为了存储多个菜品,预先创建一个ArrayList集合;//上架菜品时,其实就是往集合中添加菜品对象//浏览菜品时,其实就是遍历集合中的菜品对象,并打印菜品对象的属性信息。private ArrayList<Food> foods = new ArrayList<>(); //为了在下面的多个方法中,能够使用键盘录入,提前把Scanner对象创建好;private Scanner sc = new Scanner(System.in);/**1、商家上架菜品*/public void add(){System.out.println("===菜品上架==");// 2、提前创建一个菜品对象,用于封装用户上架的菜品信息Food food = new Food();System.out.println("请您输入上架菜品的名称:");String name = sc.next();food.setName(name);System.out.println("请您输入上架菜品的原价:");double originalPrice = sc.nextDouble();food.setOriginalPrice(originalPrice);System.out.println("请您输入上架菜品的优惠价:");double specialPrice = sc.nextDouble();food.setSpecialPrice(specialPrice);System.out.println("请您输入上架菜品的其他信息:");String info = sc.next();food.setInfo(info);// 3、把菜品对象添加到集合容器中去foods.add(food);System.out.println("恭喜您,上架成功~~~");}/**2、菜品;浏览功能*/public void printAllFoods(){System.out.println("==当前菜品信息如下:==");for (int i = 0; i < foods.size(); i++) {Food food = foods.get(i);System.out.println("菜品名称:" + food.getName());System.out.println("菜品原价:" + food.getOriginalPrice());System.out.println("菜品优惠价:" + food.getSpecialPrice());System.out.println("其他描述信息:" + food.getInfo());System.out.println("------------------------");}}/**3、专门负责展示系统界面的*/public void start(){while (true) {System.out.println("====欢迎进入商家后台管理系统=====");System.out.println("1、上架菜品(add)");System.out.println("2、浏览菜品(query)");System.out.println("3、退出系统(exit)");System.out.println("请您选择操作命令:");String command = sc.next();switch (command) {case "add":add();break;case "query":printAllFoods();break;case "exit":return; // 结束当前方法!default:System.out.println("您输入的操作命令有误~~");}}}
}
- 最后在写一个测试类Test,在测试类中进行测试。其实测试类,只起到一个启动程序的作用。
public class Test {public static void main(String[] args) {FoodManager manager = new FoodManager();manager.start();}
}
运行结果如下:需要用户输入add、query或者exit,选择进入不同的功能。
好了,如果你能够把这个案例写出来,说明你对面向对象的思维封装数据,以及使用ArrayList容器存储数据,并对数据进行处理这方面的知识已经运用的很熟悉了。
相关文章:

day08-Java常用API
day08——Java常用API 一、今日内容介绍、API概述 各位同学,我们前面已经学习了面向对象编程,使用面向编程这个套路,我们需要自己写类,然后创建对象来解决问题。但是在以后的实际开发中,更多的时候,我们是…...
设计模式--建造者模式
建造者模式是一种创建型设计模式,它允许用户通过一步一步地构建对象来创建复杂的对象。这种模式在许多应用场景中非常有用,例如在创建具有多个可选参数的对象、构建具有多种配置的对象以及生成具有多个部分的对象时。 应用场景 创建具有多个可选参数的…...
运行时间比较
subprocess.run() 函数参数的含义: shell_command:这是要执行的命令。它可以是一个字符串,也可以是一个包含命令和参数的列表。例如,“ls -l” 或 [“ls”, “-l”]。shellTrue:这是一个布尔值参数,指示是…...

【系统架构师】-案例篇(十四)数据库与分布式
1、规范化 不满足3NF,导致的存储异常 原关系模式 航班(航班编号,航空公司,起飞地,起飞时间,目的地,到达时间,剩余票数,票价) 代理商(代理商编号…...

Golang实现递归复制文件夹
代码 package zdpgo_fileimport ("errors""os""path/filepath""strings" )// CopyDir 复制文件夹 // param srcPath 源文件夹 // param desPath 目标文件夹 // return error 错误信息 func CopyDir(srcPath, desPath string) error {…...

【漏洞复现】用友U8 CRM uploadfile 文件上传致RCE漏洞
0x01 产品简介 用友U8 Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友 U8 CRM客户关系管理系统 uploadfle.php 文件存在任意文件上传漏洞,未经身份验证的攻击者通过漏洞上传…...

键盘盲打是练出来的
键盘盲打是练出来的,那该如何练习呢?很简单,看着屏幕提示跟着练。屏幕上哪里有提示呢?请看我的截屏: 截屏下方有8个带字母的方块按钮,这个就是提示,也就是我们常说的8个基准键位,我…...
构建sqli-labs学习环境与掌握SQL注入技术教程
根据提供的文档内容,以下是关于安装sqli-labs学习环境和SQLI-LABS教学的详细步骤和知识点: 安装sqli-labs学习环境 环境准备 操作系统:CentOS 7.6主机名:xuegod63IP地址:192.168.1.63 关闭防火墙和SELinux 禁用并…...

力扣HOT100 - 1143. 最长公共子序列
解题思路: 动态规划 class Solution {public int longestCommonSubsequence(String text1, String text2) {int m text1.length(), n text2.length();int[][] dp new int[m 1][n 1];for (int i 1; i < m; i) {char c1 text1.charAt(i - 1);for (int j 1…...

【贪心算法题目】
1. 柠檬水找零 这一个题目是一个比较简单的模拟算法,只需要根据手里的钱进行找零即可,对于贪心的这一点,主要是在20元钱找零的情况下,此时会出现两种情况:10 5 的组合 和 5 5 5 的组合,根据找零的特点&a…...
yarn常用命令
Yarn 是一个快速、可靠且安全的依赖管理工具,用于替代 npm。以下是一些常用的 Yarn 命令,用于不同的包管理和项目依赖安装场景: 初始化一个新的项目 yarn init这个命令会引导你创建一个 package.json 文件。 安装依赖 yarn add [package]…...

nginx+nginx-http-flv-module在Linux服务器搭建
需求 在服务器搭建点播/视频平台的话需要在服务器搭建nginx和rtmp模块 rtmp模块 rtmp 模块有 nginx-rtmp-module ,但是我们这里使用 nginx-http-flv-module 来替代。因为后者是基于前者开发的,前者拥有的功能后者都有,后者是国内的开发开…...

多线程(八)
一、wait和notify 等待 通知 机制 和join的用途类似,多个线程之间随机调度,引入 wait notify 就是为了能够从应用层面上,干预到多个不同线程代码的执行顺序.( 这里说的干预,不是影响系统的线程调度策略 内核里的线程调度,仍然是无序的. 相当于是在应用程序…...

投骰子——(随机游戏的控制)
精华点在于:利用封装,函数之间的良好调用,从而清晰明了的解决问题。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> # include<stdlib.h> # include<time.h> # include"math.h" # define ARR_LEN 10 # d…...
找出最长等值子数组
问题 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 如果子数组中所有元素都相等,则认为子数组是一个 等值子数组 。注意,空数组是 等值子数组 。 从 nums 中删除最多 k 个元素后,返回可能的最长等值子数组的长度。 子数组 是数…...

Go 切片常用操作与使用技巧
1.什么是切片 在 Go 语言中的切片(slice)是一种灵活的动态数组,它可以自动扩展和收缩,是 Go 语言中非常重要的数据结构之一。切片是基于数组实现的,它的底层是数组,可以理解为对底层数组的抽象。它会生成一…...

2024 中青杯高校数学建模竞赛(A题)数学建模完整思路+完整代码全解全析
你是否在寻找数学建模比赛的突破点?数学建模进阶思路! 作为经验丰富的数学建模团队,我们将为你带来2024 长三角高校数学建模竞赛(A题)的全面解析。这个解决方案包不仅包括完整的代码实现,还有详尽的建模过…...
开源与闭源:AI模型发展的双重路径之争
前言 随着人工智能(AI)技术的飞速发展,AI模型的应用已经渗透到各行各业,从医疗、金融到制造、教育,无不受到AI技术的深刻影响。在讨论一个AI模型“好不好”“有没有发展”时,绕不过“开源”和“闭源”两条…...

微信小程序---小程序文档配置(2)
一、小程序文档配置 1、小程序的目录结构 1.1、目录结构 小程序包含一个描述整体程序的 app 和多个描述各自页面的 page 一个小程序主体部分由三个文件组成,必须放在项目的根目录 比如当前我们的《第一个小程序》项目根目录下就存在这三个文件: 1…...

15:00面试,15:08就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到8月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...