Java2 - 数据结构
5 数据类型
5.1 整数类型
在Java中,数据类型用于定义变量或表达式可以存储的数据的类型。Java的数据类型可分为两大类:基本数据类型和引用数据类型。
- byte,字节 【1字节】表示范围:-128 ~ 127 即:
-2^7 ~ 2^7 -1
- short,短整型 【2字节】表示范围:-32768 ~ 32767
- int,整型 【4字节】表示范围:-2147483648 ~ 2147483647
- long,长整型 【8字节】表示范围:-9223372036854775808 ~ 9223372036854775807
public class Hello {public static void main(String[] args) {byte v1 = 32;short v2 = 10000;int v3 = 22221331;long v4 = 554534353424L;}
}
需要注意的是,如果直接给 long
变量赋值,Java会将该值默认视为 int
类型,并且当值超出 int
的取值范围时会编译错误。因此,当给 long
变量赋一个超过 int
范围的值时,需要在数字后面加上 L
或 l
后缀,表示这个数字是 long
类型的常量。
**提醒:**逆向时有一些字符串是通过字节数组来表示(UTF-8
编码)
v1 = "夏洛"
v2 = [-27, -92, -113, -26, -76, -101]
案例
import java.util.Arrays;public class Demo {public static void main(String[] args) {// 1.字节数组(转换为字符串) [字节,字节,字节]byte[] dataList = {97, 105, 100, 61, 50, 52, 54, 51, 56, 55, 53, 55, 49, 38, 97, 117, 116, 111, 95, 112, 108, 97, 121, 61, 48, 38, 99, 105, 100, 61, 50, 56, 57, 48, 48, 56, 52, 52, 49, 38, 100, 105, 100, 61, 75, 82, 69, 104, 69, 83, 77, 85, 74, 104, 56, 116, 70, 67, 69, 86, 97, 82, 86, 112, 69, 50, 116, 97, 80, 81, 107, 55, 87, 67, 104, 67, 74, 103, 38, 101, 112, 105, 100, 61, 48, 38, 102, 116, 105, 109, 101, 61, 49, 54, 50, 55, 49, 48, 48, 57, 51, 55, 38, 108, 118, 61, 48, 38, 109, 105, 100, 61, 48, 38, 112, 97, 114, 116, 61, 49, 38, 115, 105, 100, 61, 48, 38, 115, 116, 105, 109, 101, 61, 49, 54, 50, 55, 49, 48, 52, 51, 55, 50, 38, 115, 117, 98, 95, 116, 121, 112, 101, 61, 48, 38, 116, 121, 112, 101, 61, 51};String dataString = new String(dataList);System.out.println("字符串是:" + dataString);// 2.字符串->字节数组try {/*Python中的 name.encode("gbk") string = "夏洛"byte_list = list(string.encode("gbk"))signed_byte_list = [byte if byte < 128 else byte - 256 for byte in byte_list]print(signed_byte_list)*/String name = "夏洛";byte[] v1 = name.getBytes("GBK");System.out.println(Arrays.toString(v1)); //[-49, -60, -62, -27]// Python中的 name.encode("utf-8")byte[] v2 = name.getBytes("UTF-8");System.out.println(Arrays.toString(v2)); // [-27, -92, -113, -26, -76, -101]} catch (Exception e) {}}}
需求来了:某个app
逆向,在Java代码中得到一个字节数组 [-49, -60, -62, -27],请通过Python
代码将这个字节数组转换成字符串?
byte_list =[-49, -60, -62, -27]bs = bytearray() # python字节数组
for item in byte_list:if item < 0:item = item + 256bs.append(item)str_data = bs.decode('gbk') # data = bytes(bs)
print(str_data)
5.2 字符
char v1 = '夏';
char v2 = '洛';
String = "夏洛";
注意:字符串是由多个字符组成。
5.3 字符串
定义字符串
String
创建的字符串存储在公共池中,而 new
创建的字符串对象在堆上:
import java.io.UnsupportedEncodingException;public class Hello {public static void main(String[] args) throws UnsupportedEncodingException {String v1 = "夏洛";// 用构造函数创建字符串:String v2 = new String("夏洛");String v4 = new String(new byte[]{-27, -92, -113, -26, -76, -101});String v5 = new String(new byte[]{-49, -60, -62, -27}, "GBK");String v6 = new String(new char[]{'夏', '洛'}) ;}
}
字符串中的方法:
public static void demo2(){String origin = "请叫我靓仔AA";int len = origin.length(); // 长度for (int i = 0; i < len; i++) {char item = origin.charAt(i);}String v2 = origin.trim(); // 去除空白String v3 = origin.toLowerCase(); // 小写String v4 = origin.toUpperCase(); // 大写String[] v5 = origin.split("我"); // 分割String v6 = origin.replace("叫", "喊"); // 替换String v7 = origin.substring(2, 6); // 子字符串=切片 [2:6]// equals() 方法用于判断 Number 对象与方法的参数进是否相等boolean v8 = origin.equals("请叫我"); // // contains() 方法用于判断字符串中是否包含指定的字符或字符串。boolean v9 = origin.contains("el");// startsWith() 方法用于检测字符串是否以指定的前缀开始。boolean v10 = origin.startsWith("请");// concat() 方法用于将指定的字符串参数连接到字符串上。String v11 = origin.concat("哈哈哈");
}
字符串拼接
出现的点: 对请求参数和请求头 拼接在一起 做加密
import java.io.UnsupportedEncodingException;public class Hello {public static void main(String[] args) {// "name=alex&age=18"StringBuilder sb = new StringBuilder(); // StringBuffer线程安全sb.append("name");sb.append("=");sb.append("xialuo");sb.append("&");sb.append("age");sb.append("=");sb.append("18");String dataString = sb.toString();System.out.println(dataString);}
}
结果输出为:
name=xialuo&age=18
python中的处理方式
data = []
data.append("name")
data.append("=")
data.append("18")
data_string = "".join(data)
5.4 数组
存放固定长度的元素。
- 容器
- 固定长度
- 特定类型
import java.util.Arrays;public class Hello {public static void main(String[] args) {// [123,1,999]int[] numArray = new int[3];numArray[0] = 123;numArray[1] = 1;numArray[2] = 99;System.out.println(Arrays.toString(numArray));// 同时定义和初始化数组String[] names = new String[]{"夏洛", "aa", "bb"};System.out.println(Arrays.toString(names));String[] nameArray = {"夏洛", "aa", "bb"};System.out.println(Arrays.toString(nameArray));// nameArray[0]// nameArray.lengthfor (int idx = 0; idx < nameArray.length; idx++) {String item = nameArray[idx];}}
}
注意:数组一旦创建个数就不可调整。
5.5 关于Object
-
在Python中每个类都默认继承Object类(所有的类都是Object的子类)。
-
在Java所有的类都是默认继承Object类。
int v1 = 123; String name = "夏洛";
用基类可以泛指他的子类的类型。
import java.util.Arrays;public class Hello {public static void main(String[] args) {Object v1 = new String("xialuo");System.out.println(v1);System.out.println(v1.getClass());Object v2 = 123;System.out.println(v2);System.out.println(v2.getClass());}
}
案例一
import java.util.Arrays;public class Hello {public static void main(String[] args) {// 声明数组,数组中元素必须int类型;int[] v1 = new int[3];// 声明数组,数组中元素必须String类型;String[] v2 = new String[3];// 声明数组,数组中可以是数组中存储任何类型的对象Object[] v3 = new Object[3];v3[0] = 123;v3[1] = "xialuo";}
}
所以,如果以后想要声明的数组中想要是混合类型,就可以用Object来实现。
import java.util.Arrays;public class Hello {public static void main(String[] args) {// v1是指上字符串对象;StringString v1 = new String("xialuo");String res = v1.toUpperCase();System.out.println(res);// v2本质是字符串对象;ObjectObject v2 = new String("xialuo");String data = (String)v2;}
}
案例二
import java.util.Arrays;public class Hello {public static void func(Object v1) {// System.out.println(v1);// System.out.println(v1.getClass());if (v1 instanceof Integer) {System.out.println("整型");} else if (v1 instanceof String) {System.out.println("字符串类型");} else {System.out.println("未知类型");}}public static void main(String[] args) {func(123);func("123");}
}
6 常见数据类型
6.1 List类型
List是一个接口,接口下面有两个常见的类型(目的是可以存放动态的多个数据)
-
ArrayList
,连续的内存地址的存储(内部自动扩容)。 -
LinkedList
,底层基于链表实现(自行车链条)。 -
Java
中所有的类都继承Object
,Object
代指所有的类型。 -
自己创建关系
ArrayList v1 = new ArrayList(); // ArrayList 类实现了可变数组的大小 索引访问
LinkedList v2 = new LinkedList(); //LinkedList 类采用链表结构保存对象,这种结构的优点是便于向集合中插入或者删除元素
List v1 = new ArrayList();
List v2 = new LinkedList();
Object v1 = new ArrayList();
Object v2 = new LinkedList();
案例一
ArrayList v1 = new ArrayList();
v1.add("夏洛");
v1.add("麻子");
LinkedList v1 = new LinkedList();
v1.add("夏洛");
v1.add("麻子");
Java
中接口,是用来约束实现他的类,约束他里面的成员必须有xx
。
interface List{public void add(Object data); // 接口中的方法,不写具体的实现,只用于约束。
}// 类ArrayList实现了接口List,此时这个类就必须有一个add方法。
class ArrayList implements List{public void add(Object data){// 将数据data按照连续存储的方法放在内存。// ..}
}// 类LinkedList实现了接口List,此时这个类就必须有一个add方法。
class LinkedList implements List{public void add(Object data){// 将数据data按照链表的形式存储// ..}
}
List v1 = new ArrayList();
v1.add("夏洛");
v1.add("麻子");
ArrayList
ArrayList
是 Java 标准库中提供的一个类,它实现了 List
接口,可以用来管理一组对象。ArrayList
的特点是可以无限扩容,因此被广泛用于需要动态添加、删除元素的场景。
- 添加元素:
add(E element)
:在列表末尾添加指定元素。add(int index, E element)
:在指定位置插入指定元素。
- 获取元素:
get(int index)
:返回指定位置的元素。
- 移除元素:
remove(int index)
:移除指定位置上的元素。remove(Object obj)
:移除第一个匹配指定对象的元素。
- 修改元素:
set(int index, E element)
:替换指定位置上的元素。
- 查询和判断:
size()
:返回列表中的元素数量。isEmpty()
:判断列表是否为空。contains(Object obj)
:判断列表是否包含指定对象。
- 清空和重置:
clear()
:清空列表,将列表的大小重置为0。
- 转换为数组:
toArray()
:将列表转换为数组。
- 遍历:
- 使用传统的
for
循环、增强的for-each
循环、迭代器等方式进行遍历。
- 使用传统的
import java.util.ArrayList;
import java.util.Arrays;public class Hello {public static void main(String[] args) {// ArrayList,默认内部存放的是混合数据类型。// ArrayList<String> data = new ArrayList<String>();// ArrayList<Object> data = new ArrayList<Object>();ArrayList data = new ArrayList();data.add("夏洛");data.add("aa");data.add(666);data.add("貂蝉");String value = data.get(1);value.length// String value = (String) data.get(1);Object temp = data.get(1);String value = (String) temp; // 转化可转换的数据System.out.println(value);int xo = (int) data.get(2);System.out.println(xo);data.set(0, "哈哈哈哈");System.out.println(data);data.remove("eric");data.remove(0);System.out.println(data);int size = data.size();System.out.println(size);boolean exists = data.contains("莹莹");System.out.println(exists);for (Object item : data) {System.out.println(item);}for (int i = 0; i < data.size(); i++) {Object item = data.get(i);System.out.println(item);}}
}
LinkedList
LinkedList
是 Java 中的链表实现类,它实现了 List
接口和 Deque
接口,提供了对链表结构的支持。下面是一些 LinkedList
常用的方法:
- 添加元素:
add(E element)
:在链表末尾添加指定元素。add(int index, E element)
:在指定位置插入指定元素。
- 获取元素:
get(int index)
:返回指定位置的元素。getFirst()
:返回链表的第一个元素。getLast()
:返回链表的最后一个元素。
- 移除元素:
remove(int index)
:移除指定位置上的元素。remove(Object obj)
:移除第一个匹配指定对象的元素。removeFirst()
:移除链表的第一个元素。removeLast()
:移除链表的最后一个元素。
- 修改元素:
set(int index, E element)
:替换指定位置上的元素。
- 查询和判断:
size()
:返回链表中的元素数量。isEmpty()
:判断链表是否为空。contains(Object obj)
:判断链表是否包含指定对象。
- 清空和重置:
clear()
:清空链表。
- 队列操作:
offer(E element)
:将元素添加到链表末尾,相当于队列的入队操作。poll()
:移除并返回链表第一个元素,相当于队列的出队操作。
- 栈操作:
push(E element)
:将元素添加到链表的开头,相当于栈的入栈操作。pop()
:移除并返回链表的第一个元素,相当于栈的出栈操作。
- 遍历:
- 使用传统的
for
循环、增强的for-each
循环、迭代器等方式进行遍历。
- 使用传统的
import java.util.LinkedList;public class Hello {public static void main(String[] args) {LinkedList<Integer> v1 = new LinkedList<Integer>();v1.add(11);v1.add(22);LinkedList<Object> v2 = new LinkedList<Object>();v2.add("有阪深雪");v2.add("大桥未久");v2.add(666);v2.add(123);//v2.remove(1);//v2.remove("哈哈");v2.set(2, "苍老师");v2.push("哈哈哈");// v2.addFirst(11);for (int i = 0; i < v2.size(); i++) {Object item = v2.get(i);System.out.println(item);}for (Object item : v2) {System.out.println(item);}}
}
关于迭代器:
在Java中,迭代器(Iterator)是用于遍历集合(Collection)或数据结构中元素的接口。通过使用迭代器,我们可以按顺序访问集合中的每个元素,而无需了解底层集合的内部实现。
import java.util.ArrayList;
import java.util.Iterator;public class IteratorExample {public static void main(String[] args) {// 创建一个ArrayList集合ArrayList<String> list = new ArrayList<>();list.add("Apple");list.add("Banana");list.add("Orange");// 获取集合的迭代器Iterator<String> iterator = list.iterator();// 使用迭代器遍历集合元素while (iterator.hasNext()) {String element = iterator.next();System.out.println(element);}}
}
在上面的代码中,我们创建了一个ArrayList
集合并添加了一些元素。然后,通过调用iterator()
方法获取了集合的迭代器对象,并使用hasNext()
和next()
方法进行迭代遍历。hasNext()
方法用于检查是否还有下一个元素,next()
方法用于返回当前元素并移动到下一个元素。
需要注意的是,在使用迭代器遍历集合时,如果在遍历过程中修改了集合的结构(例如添加或删除元素),会抛出ConcurrentModificationException
异常。因此,建议在使用迭代器遍历集合时不要对集合进行修改操作。
迭代器是Java中常用的遍历集合的方式,它提供了一种统一的、可移植的遍历接口,并且支持在遍历过程中删除元素,是Java集合框架中重要的一部分。
6.2 set系列
Set是一个接口,常见实现这个接口的有两个类,用于实现不重复的多元素集合。
- HashSet,去重,无序。
- TreeSet,去重,内部默认排序(ascii、unicode)【不同的数据类型,无法进行比较】。
import java.util.*;public class Hello {public static void main(String[] args) {/*
方式一:"HashSet s1 = new HashSet();" 使用具体的HashSet类作为声明类型,创建一个HashSet对象。这种方式限定了变量s1的类型为HashSet,只能调用HashSet类特有的方法。方式二:"Set s1 = new HashSet();" 使用Set接口作为声明类型,创建一个HashSet对象。这种方式使用了接口类型Set,可以调用Set接口中定义的所有方法,但无法直接调用HashSet类特有的方法。这种方式更加灵活,便于后续切换到其他实现Set接口的类,如TreeSet或LinkedHashSet。方式三:"HashSet<String> s1 = new HashSet<String>();" 使用泛型来指定集合中元素的类型。这种方式将HashSet限定为存储String类型的元素,可以确保在编译时期进行类型检查,避免插入不合法的元素类型到集合中。*/// HashSet s1 = new HashSet();// Set s1 = new HashSet();// HashSet<String> s1 = new HashSet<String>();HashSet s1 = new HashSet();s1.add("P站");s1.add("B站");s1.add("A站");s1.add("P站");s1.add(666);System.out.println(s1); // [B站, A站, P站,666]// s2 = {"东京热","东北热","南京热"}HashSet s2 = new HashSet(){{add("东京热");add("东北热");add("南京热");}};System.out.println(s2); // [B站, A站, P站]// Set s2 = new TreeSet();// TreeSet<String> s2 = new TreeSet<String>();TreeSet s3 = new TreeSet();s3.add("P站");s3.add("B站");s3.add("A站");s3.add("P站");// s3.add(666); //不可以System.out.println(s3); // [B站, A站, P站]TreeSet s4 = new TreeSet(){{add("P站");add("B站");add("A站");add("P站");}};System.out.println(s4); // [B站, A站, P站]}
}
关于交并差:
import java.util.*;public class Hello {public static void main(String[] args) {// Set s1 = new HashSet();HashSet s1 = new HashSet();s1.add("P站");s1.add("B站");s1.add("A站");s1.remove("P站");System.out.println(s1); // [B站, A站, P站]boolean exists = s1.contains("B站");System.out.println(exists);HashSet s2 = new HashSet();s2.add(123);s2.add(456);HashSet v1 = new HashSet(); // 空 v1.addAll(s1);v1.retainAll(s2); // 交集 & System.out.println(v1);HashSet v2 = new HashSet();v2.addAll(s1);v2.addAll(s2); // 并集 |System.out.println(v2);HashSet v3 = new HashSet();v3.addAll(s1);v3.removeAll(s2); // 差集 s1 - s2System.out.println(v3);HashSet v4 = new HashSet();v4.addAll(s2);v4.removeAll(s1); // 差集 s2 - s1System.out.println(v4);}
}
关于循环获取:
import java.util.*;public class Hello {public static void main(String[] args) {TreeSet s1 = new TreeSet();s1.add("P站");s1.add("B站");s1.add("A站");for (Object item : s1) {System.out.println(item);}}
}
关于迭代器:
使用Set集合的iterator()
方法获取一个迭代器对象
使用hasNext()
方法检查迭代器是否有下一个元素。如果有,则执行相应的操作;如果没有,则退出循环。
在循环内部,可以通过next()
方法获取当前迭代器指向的元素
import java.util.*;public class Hello {public static void main(String[] args) {TreeSet s1 = new TreeSet();s1.add("P站");s1.add("B站");s1.add("A站");Iterator it = s1.iterator();while (it.hasNext()) {String item = (String) it.next();System.out.println(item);}}
}
6.3 map系列
Map是一个接口,常见实现这个接口的有两个类,用于存储键值对。
-
HashMap,是基于哈希表实现的Map,它提供了快速的插入、查找和删除操作。键值对的存储是无序的,在大部分情况下是最常用的Map实现类。
-
TreeMap,默认根据key排序。(常用)
HashMap
import java.util.*;public class Hello {public static void main(String[] args) {HashMap h1 = new HashMap();h1.put("name","xialuo");h1.put("age",18);h1.put("hobby","男");System.out.println(h1); // 特定数据类型 字符串HashMap<String,String> h2 = new HashMap<String,String>();h2.put("name","xialuo");h2.put("age","18");h2.put("hobby","男");System.out.println(h2); // 声明 初始化值 HashMap<String,String> h3 = new HashMap<String,String>(){{put("name","xialuo");put("age","18");put("hobby","男");}};System.out.println(h3);}
}
TreeMap
TreeMap
是 Map
接口的一个实现类,它基于红黑树(Red-Black Tree)实现,可以保持键的有序性。相比于 Map
接口中通用的方法,TreeMap
中具有以下一些特有的方法:
firstKey()
:返回最小键。lastKey()
:返回最大键。floorKey(K key)
:返回小于等于指定键的最大键,如果不存在这样的键,则返回 null。ceilingKey(K key)
:返回大于等于指定键的最小键,如果不存在这样的键,则返回 null。lowerKey(K key)
:返回小于指定键的最大键,如果不存在这样的键,则返回 null。higherKey(K key)
:返回大于指定键的最小键,如果不存在这样的键,则返回 null。descendingKeySet()
:返回按逆序遍历此映射中的键所构成的集合。
import java.util.*;public class Hello {public static void main(String[] args) {TreeMap h1 = new TreeMap(); // 改为了TreeMaph1.put("name","xialuo");h1.put("age",18);h1.put("hobby","男");System.out.println(h1); // {age=18, hobby=男, name=xialuo}// 固定类型TreeMap<String,String> h2 = new TreeMap<String,String>();h2.put("name","xialuo");h2.put("age","18");h2.put("hobby","男");System.out.println(h2); // 声明 初始化值 TreeMap<String,String> h3 = new TreeMap<String,String>(){{put("name","xialuo");put("age","18");put("hobby","男");}};System.out.println(h3);// 只能调用 Map 接口中定义的方法,不能直接调用 TreeMap 特有的方法Map h4 = new TreeMap();h4.put("name","xialuo");h4.put("age",18);h4.put("hobby","男");System.out.println(h4);// h4.firstKey();}
}
python中使用需要排序处理
在Python中需要自己处理key排序的问题。
v4 = {"aid":123,"xx":999,"wid":888
}# 1.python 根据key进行排序
# data = ["{}={}".format(key,v4[key]) for key in sorted(v4.keys())]# 2.再进行拼接
# result = "&".join(data)result = "&".join(["{}={}".format(key,v4[key]) for key in sorted(v4.keys())])
TreeMap常见操作:
import java.util.*;public class Hello {public static void main(String[] args) {TreeMap h1 = new TreeMap(); // 改为了TreeMaph1.put("name", "xialuo");h1.put("age", "18");h1.put("hobby", "男");h1.put("hobby", "女人");h1.remove("age");int size = h1.size();Object value = h1.get("name"); // 不存在,返回nullSystem.out.println(value);boolean existsKey = h1.containsKey("age");boolean existsValue = h1.containsValue("xialuo");// 替换h1.replace("name", "李杰");System.out.println(h1);// 循环: 示例1// { ("name", "xialuo"),("age", "18"), }Set<Map.Entry<String, String>> s1 = h1.entrySet();Iterator it1 = s1.iterator();while (it1.hasNext()) {// ("name", "xialuo")Map.Entry<String, String> entry = (Map.Entry<String, String>) it1.next();String k = (String) entry.getKey();String v = (String) entry.getValue();}// 循环: 示例2Set s2 = h1.entrySet();Iterator it2 = s2.iterator();while (it2.hasNext()) {Map.Entry entry = (Map.Entry) it2.next();String k = (String) entry.getKey();String v = (String) entry.getValue();}// 循环: 示例3TreeMap<String, String> h2 = new TreeMap<String, String>(); // 改为了TreeMaph2.put("name", "xialuo");h2.put("age", "18");for (Map.Entry<String, String> entry : h2.entrySet()) {String k = entry.getKey();String v = entry.getValue();}// 循环: 示例4TreeMap h3 = new TreeMap(); // 改为了TreeMaph3.put("name", "xialuo");h3.put("age", 18);for (Object entry : h3.entrySet()) {Map.Entry<String, Object> entryMap = (Map.Entry<String, Object>) entry;String k = entryMap.getKey();Object v = entryMap.getValue(); // 18 "xialuo"if (v instanceof Integer) {System.out.println("数字:" + Integer.toString((Integer) v));} else if (v instanceof String) {System.out.println("字符串:" + (String) v);} else {System.out.println("未知类型:" + v.toString());}}}
}
尝试用python还原
相关文章:

Java2 - 数据结构
5 数据类型 5.1 整数类型 在Java中,数据类型用于定义变量或表达式可以存储的数据的类型。Java的数据类型可分为两大类:基本数据类型和引用数据类型。 byte,字节 【1字节】表示范围:-128 ~ 127 即:-2^7 ~ 2^7 -1 sho…...

精解括号匹配问题与极致栈设计:揭开最大栈和最小栈的奥秘
目录 括号匹配问题最小栈最大栈 最大栈和最小栈是极致栈的两个重要变种。最大栈用于存储当前匹配的最大值,而最小栈用于存储当前匹配的最小值。 括号匹配问题 这个问题我们来看力扣20题的描述: 给定一个只包括 ‘(’,‘)’,‘{’…...

云存储/视频监控管理平台EasyCVR,使用sqlite数据库出现卡顿该如何优化?
视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…...

实战!工作中常用的设计模式
文章目录 前言一、策略模式1.1、 业务场景1.2 、策略模式定义1.3、 策略模式使用1.3.1、一个接口,两个方法1.3.2、不同策略的差异化实现1.3.3、使用策略模式 二、责任链模式2.1、业务场景2.2、责任链模式定义2.3、责任链模式使用2.3.1、一个接口或者抽象类2.3.2、每…...

MySQL进阶_1.逻辑架构和SQL执行流程
文章目录 第一节、逻辑架构剖析1.1、服务器处理客户端请求1.2、Connectors1.3、第1层:连接层1.4、第2层:服务层1.5、 第3层:引擎层1.6、 存储层1.7、小结 第二节、SQL执行流程2.1、查询缓存2.2、解析器2.3、优化器2.4、执行器 第三节、数据库…...

基于GCC的工具objdump实现反汇编
一:objdump介绍 在 Linux中,一切皆文件。 Linux 编程实际上是编写处理各种文件的代码。系统由许多类型的文件组成,但目标文件具有一种特殊的设计,提供了灵活和多样的用途。 目标文件是包含带有附加地址和值的助记符号的路线图。这…...

排序算法的空间复杂度和时间复杂度
一、排序算法的时间复杂度和空间复杂度 排序算法 平均时间复杂度 最坏时间复杂度 最好时间复杂度 空间复杂度 稳定性 冒泡排序 O(n) O(n) O(n) O(1) 稳定 直接选择排序 O(n) O(n) O(n) O(1) 不稳定 直接插入排序 O(n) O(n) O(n) O(1) 稳定 快速排序 O(n…...

【电路笔记】-基尔霍夫电路定律
基尔霍夫电路定律 文章目录 基尔霍夫电路定律1、框架和定义2、基尔霍夫电流定律3、基尔霍夫电压定律4、基尔霍夫定律应用5、基尔霍夫定律的局限性6、总结 在本文中,将介绍最基本、最重要的电路定律之一。 这些法律由德国医生古斯塔夫基尔霍夫 (Gustav Kirchoff) 于 …...

从零开始搭建React+TypeScript+webpack开发环境-基于axios的Ajax请求工具
什么是axios axios是一款基于Promise的HTTP客户端,适用于浏览器和Node.js环境。它的特点包括: 支持浏览器和Node.js环境。支持Promise API。支持拦截请求和响应。支持取消请求。自动转换JSON数据。支持CSRF保护。 使用axios可以更方便地发送HTTP请求&…...

【uniapp小程序下载】调用uni.uploadfile方法在调试工具里是没有问题的,但是线上版本和体验版就调用不成功,真机调试也没问题
把你的下载地址前缀添加到合法域名就解决了 在调试工具里成功了是因为勾选了下面这项 下面是我的下载并打开函数 methods: {// 下载downloadFileFn(data) {if (this.detailsObj.currentUserBuy) {uni.downloadFile({// data是路径url: https:// data,success(res) {//保存到本…...

chatGLM中GLM设计思路
GLM是结合了MLM和CLM的一种预训练方式,其中G为general;在GLM中,它不在以某个token为粒度,而是一个span(多个token),这些span之间使用自编码方式,而在span内部的token使用自回归的方式…...

卡牌游戏类型定制开发微信卡牌小程序游戏
卡牌类型的游戏开发具有一些独特的特点和挑战,以下是一些主要的特点: 卡牌设计和平衡:卡牌游戏的核心是卡牌设计和平衡。开发团队需要设计各种卡牌,确保它们在游戏中相互平衡,以便提供有趣的游戏体验。卡牌的特性、效…...

web —— css(1)
Web —— css基础 1. CSS样式表2. CSS的三种引入方式3. CSS 语法4. CSS 选择器4.1 元素选择器4.2 类选择器4.3 ID选择器4.4 属性选择器4.5 后代选择器4.6 子元素选择器4.7 伪类选择器4.8 分组选择器 5. 颜色和字体6. 显示方式display7. 盒子模型7.1 盒子模型 - 外边距塌陷7.2 盒…...

站群服务器的特性和好处是什么
站群服务器的特性和好处是什么 站群服务器的特性是什么?站群服务器是一种为一个网站或多个网站配置独立IP的服务器。因而相比一般的服务器,站群服务器最大的特性就是IP数量是非常的多。那么租用站群服务器使用有什么好处呢? 多网站优化 大…...

竞赛 行人重识别(person reid) - 机器视觉 深度学习 opencv python
文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习行人重识别(person reid)系统 该项目…...

软件设计模式的意义
软件设计模式的意义 所有开发人员都应该接触过软件设计模式这个概念,看过《设计模式-可复用的对象软件的基础》这本书,在面试中都被问过: 你用过哪些设计模式这种问题。但很大可能也就仅此而已了。 为什么好像只能从框架中找到设计模式的应用…...

vue基础知识十八:说说你对keep-alive的理解是什么?
一、Keep-alive 是什么 keep-alive是vue中的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM keep-alive 包裹动态组件时,会缓存不活动的组件实例,而不是销毁它们 keep-alive可以设置以下props属性:…...

Linux CentOS配置阿里云yum源
一:先备份文件,在配置失败时可以恢复 cd /etc/yum.repos.d mkdir back mv *.repo back 二:下载阿里云yum源 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo wget -O /etc/yum.repos.d/epel…...

ESP32网络开发实例-Web服务器以仪表形式显示传感器计数
Web服务器以仪表形式显示传感器计数 文章目录 Web服务器以仪表形式显示传感器计数1、应用介绍2、软件准备3、硬件准备4、代码实现4.1 Web页面文件4.2 Web服务器代码实现在本文中,我们将介绍使用服务器发送事件 (SSE) 构建 ESP32 仪表 Web 服务器。服务器将自动向所有连接的网络…...

@Bean有哪些属性
直接看原文 原文链接:Spring中bean标签的作用和属性的详解-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- Bean的配置一般都在XML文件进行配置Bean相关包为:or…...

【Qt之绘制兔纸】
效果 代码 class drawRabbit: public QWidget { public:drawRabbit(QWidget *parent nullptr) : QWidget(parent) {}private:void paintEvent(QPaintEvent *event) {QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing, true);// 绘制兔子的耳朵painter.s…...

JS+CSS随机点名详细介绍复制可用(可自己添加人名)
想必大家也想拥有一个可以随机点名的网页,接下来我为大家介绍一下随机点名,可用于抽人,哈哈 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>* {margin: 0;…...

西瓜书笔记
周志华老师亲讲-西瓜书全网最详尽讲解-1080p高清原版《机器学习初步》 周志华机器学习(西瓜书)学习笔记(持续更新) 周志华《Machine Learning》学习笔记 绪论 基本术语 数据集(data set):一堆…...

学算法常用刷题网站
学算法常用刷题网站 AcWing : 北大报送生,NOI金牌得主—yxc创办 CodeForces: 简称CF,俄罗斯的网站 hduoj: 杭州电子科技大学的在线评测系统 vjudge:用户可以自己举办比赛 POJ: 北京大学的在线评测系统 洛谷:很火的刷题网站 计蒜客…...

hdlbits系列verilog解答(always块条件语句)-37
文章目录 一、问题描述二、verilog源码三、仿真结果一、问题描述 Verilog 有一个三元条件运算符 ( ? : ) 很像 C语言: (condition ? if_true : if_false) 这可用于根据一行上的条件(多路复用器!)选择两个值之一,而无需在组合 always 块中使用 if-then。 举例: (0…...

智能井盖生产商家,万宾科技井盖传感器产品详情
市政府管理水平决定城市人民幸福程度,所以在智慧城市推进过程中,市政府也在加快城市信息基础设施建设,希望提高公共服务水平,以此来满足城市居民的需求,进一步推进城市信息化智能化发展。作为城市生命线的一个组成部分…...

开启AWS的ubuntu服务器的root用户登录权限
设置root用户密码 输入以下命令修改root用户密码 sudo passwd root输入以下命令切换到root用户 su root仅允许root用户用密码登录 输入以下命令编辑ssh配置文件 vi /etc/ssh/sshd_config新增以下配置允许root用户登录 PermitRootLogin yes把PasswordAuthentication修改为…...

ES6模块介绍—module的语法import、export简单介绍及用法
ES6模块语法 模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。 一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。如果你希望外部能够读取模块内部的…...

【设计模式】工厂模式总结
工厂模式 定义一个创建对象的接口,让子类决定实例化哪个类,而对象的创建统一交由工厂去生产。 工厂模式大致可以分为三类:简单工厂模式、工厂方法模式、抽象工厂模式。 简单工厂模式 简单工厂模式提供一个工厂类,根据传入的参…...

网络安全管理员高级工理论题库(持续更新中)
一. 单选题(共16题) 1.【单选题】职业是由于社会分工和生产内部的()而形成的具有特定专业和专门职责的工作。 A、劳动分工 B、智力分工 C、生产分工 D、社会分工 正确答案:A 2.【单选题】职业是在人类社会出现分工之后…...