10 Java数据结构:包装类、数组(Array工具类)、ArrayList

news2024/11/22 21:16:13

文章目录

  • 前言
  • 一、包装类
    • 1、Integer
      • (1)基本用法
      • (2)JDK5前的包装类用法(了解即可,能更好帮助我们理解下面的自动装箱和自动拆箱机制)
      • (3)自动装箱与自动拆箱机制 --- 导致:int和Integer,包装类和对应的基本数据类型在不需要进集合的情况下是互通的(重要重要!!!!!)
      • (4)Integer的常用方法
        • --- 进制转换方法
    • 2 包装类实现类型转换(重要!!!)
      • (1)Integer:public static int parseInt(String s):将字符串类型的整数转换成int类型的整数
      • (2)Boolean:public static boolean parseBoolean(String s):将字符串类型的布尔转换成boolean
  • 二、数组 -- int[]、String[]...
    • 1 数组的创建与初始化
      • (1)静态初始化
      • (2)动态初始化
    • 2 数组元素访问与修改
    • 3 数组的遍历
    • 4 数组的内存图(重要!!!!!!!)
    • 5 二维数组
      • (1)静态初始化
      • (2)动态初始化
      • (3)二维数组的内存图(重要重要重要!!!!!!!!!!!)
    • 6 数组小练习
  • 三、Arrays:操作数组的工具类(极其常用)
    • 1 public static String toString(数组):把数组拼接成一个字符串
    • 2 public static int binarySearch(数组):
  • 四、集合:ArryList --- 数组列表
    • 1 ArryList对象的创建
    • 2 ArryList常见成员方法
      • (1)boolean add(E e) : 添加元素,返回值表示是否添加成功
      • (2)void add(int index, E e) :在指定索引位置插入元素。
      • (3)boolean remove(E e) : 删除第一个指定元素 e,返回值表示是否删除成功
      • (4)E remove(int index) : 删除指定索引元素,返回被删除元素
      • (5)E set(int index, E e) : 修改指定索引下的元素,返回原来的元素
      • (6)E get(int index) : 获取指定索引处的元素
      • (7)int size() : 返回集合的长度
      • (8)boolean isEmpty() :判断数组列表是否为空。
    • 3 ArryList的遍历
      • (1)使用get()方法遍历
      • (2)使用增强for循环遍历


前言

本节会总结Java中各种数据结构里面的使用方法,包括之前的学过的数组、ArrayList、还包括链表、哈希表、树等数据结构一起其中的高级实用API。本博客会详细记录各种用法,作为个人的查询文档。

在学习这些数据结构前,前面有必要先来好好学习一下包装类,由于Java基本数据类型(可变)大部分集合都是不允许放进去的,我们必须要放其对应的包装类(不可变)才被允许放进去,所以学习这些集合第一关就是对应的包装类。


一、包装类

在前面我们其实简单讲过包装类,但讲的比较简单,这里做一个详细的笔记,方便后续查阅。

  • 包装类:基本数据类型对应的引用数据累加
    将Java中的基本数据类型重新写成引用数据类型,并且是不可变的;这样就和python一样了,Python里面有一句名言,万物皆对象,有了包装类这句话是不是也可以移到Java中,Java中万物皆对象。
  • 并且Java的集合的高级数据结构里面,基本数据类型由于其可变性,是不允许存进集合的;所以我们就需要将不可变的包装类存进集合实现相同的效果。

给出Java中基本数据类型和其对象的包装类内存图就清楚二者的关系了:
在这里插入图片描述

基本数据类型对应的包装类
byteByte
shortShort
charCharacter
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean

可以看到只有char和int的包装类名有点变化要单独记一下,其余的都是首字母大写就可以了。
具体怎么用的建议先了解ArryList,下面给出示例:包装类就可以添加进集合了,表示方法和普通的写法一样,只是泛型要写包装类就是了。
下面以Integer演示包装类的用法,其他的都类似

1、Integer

(1)基本用法

// 创建 Integer
Integer a = 10;
Integer b = 11;

// 进行运算
Integer sum = a + b;
System.out.println(sum);    // 21

Double d = 5.0;
Double v = a * d;
double v1 = a * d;         // 这样也可以
System.out.println(v);     // 50.0  隐式类型转换这些都还有
System.out.println(v1);    // 50.0

可以看到和基本数据类型完全一样的用法,运算也一样,并且包装类和其对于的基本数据类型之间还存在自动隐式转换,使得二者是互通的。(这里设计到了我们等下要将的自动装箱、自动拆箱机制)

再看这个ArrayList list = new ArrayList<>();的例子ArrayList只能包装类进(可以跳到自动装箱哪里)

ArrayList<Integer> list = new ArrayList<>();
list.add(1);    // 自动装箱
list.add(2);
list.add(3);

for (Integer i : list) {
    System.out.print(i + " ");   // 1 2 3

这就是典型的自动装箱机制。

(2)JDK5前的包装类用法(了解即可,能更好帮助我们理解下面的自动装箱和自动拆箱机制)

在JDK5以前创建一个Integer对象,要用到一下这些复杂的方法(部分现在都已经废弃了):
在这里插入图片描述
【注】:下面代码高版本jdk运行不了,方法已经废弃,这里只是做一个示例

Integer i1 = new Integer(1);
Integer i2 = new Integer(2);


// 如果要用上面JDK5前的这些方法创建Integer对象,进行计算需要手动拆箱,在装箱
// 因为对象之间不能直接进行运算
// 步骤:
// 1. 先将对象转换为基本数据类型(拆箱)
// 2. 进行运算
// 3. 将基本数据类型转换为对象(装箱)

int result = i1.intValue() + i2.intValue();  // 拆箱并运算
Integer i3 = new Integer(result);  // 装箱
System.out.println(i3);  

可以看到,包装类进行运算如果要手动拆箱后手动装箱,太麻烦了。没错,大佬们也觉得太麻烦了,于是JDK5以后就有了自动拆箱和自动装箱机制。

一个面试问题:

Integer i1 = Integer.valueOf(127);
Integer i2 = Integer.valueOf(127);
System.out.println(i1 == i2); // true

Integer i3 = Integer.valueOf(128);
Integer i4 = Integer.valueOf(128);
System.out.println(i3 == i4); // false

// 下面new出来的好理解,只要new出来的对象地址不同,肯定是false
Integer i5 = new Integer(127);
Integer i6 = new Integer(127);
System.out.println(i5 == i6); // false

Integer i7 = new Integer(128);
Integer i8 = new Integer(128);
System.out.println(i7 == i8); // false

关键在于前两段,为什么127的是true , 128的是false

查看源码会发现 -128到127间(闭区间)的因为在实际开发中应用的比较多,如果每次使用都new对象浪费内存,于是底层这样设计为:

  • 提前把这个[-128,127]范围之内的每一个数据都创建好对象放进一个数组存起来
  • 如果要用到了不会创建新的,而是返回已经创建好的对象,所以127地址一样的是,128地址不一样。

这是一个面试题,所以我也在这里写一下。

(3)自动装箱与自动拆箱机制 — 导致:int和Integer,包装类和对应的基本数据类型在不需要进集合的情况下是互通的(重要重要!!!!!)

Integer i1 = 100;           // 自动装箱
Integer i2 = 100;

Integer sum = i1 + i2;      // 内部会自动拆箱,然后再装箱
System.out.println(sum);

int i3 = 99;
int sum2 = i1 + i3;         // i1会自动拆箱
System.out.println(sum2);     // 199

// 注:除了部分集合只能包装类进,其他情况由于自动装箱拆箱,基本类型和包装类可以互相转换的,底层自动实现

再看这个ArrayList list = new ArrayList<>();的例子ArrayList只能包装类进

ArrayList<Integer> list = new ArrayList<>();
list.add(1);    // 自动装箱
list.add(2);
list.add(3);

for (Integer i : list) {
    System.out.print(i + " ");   // 1 2 3

这就是典型的自动装箱机制。

(4)Integer的常用方法

— 进制转换方法
方法名说明
public static String toBinaryString(int i)得到二进制
public static String toOctalString(int i)得到八进制
public static String toHexString(int i)得到十六进制
// 1 把整数转换成二进制
String str1 = Integer.toBinaryString(100);
System.out.println(str1);   // 1100100

// 2 把整数转换成八进制
String str2 = Integer.toOctalString(100);
System.out.println(str2);   // 144

// 3 把整数转换成十六进制
String str3 = Integer.toHexString(100);
System.out.println(str3);   // 64

2 包装类实现类型转换(重要!!!)

(1)Integer:public static int parseInt(String s):将字符串类型的整数转换成int类型的整数

在python中这个功能 int()就能转,但在Java中必须这样才行

int i = Integer.parseInt("123");     // 字符串转整数  (自动拆箱)
System.out.println(i);      // 123
System.out.println(i + 1);  // 124
// 细节:"123"里面必须是数字,里面有字母无法转,会报错

【注】:除了Character包装类,其他7中包装类都有其对应的paseXxx的方法进行类型转换
有了这个就可以将之前的键盘录入代码做一个规范了 包装类数据类型转换在键盘录入中的应用

(2)Boolean:public static boolean parseBoolean(String s):将字符串类型的布尔转换成boolean

String str = "true";
boolean b = Boolean.parseBoolean(str);  // 字符串转布尔
System.out.println(b);  // true

二、数组 – int[]、String[]…

【注】:java的数组和Python的列表有很大的不同之处,下面的两个不同需要特别注意一下。

  • (1)java的数组里面也可以是任意数据类型、如整数、浮点数、字符、字符串等或者对象(如类的实例),但需要注意的是,一个数组里面只能含有一种数据类型,也就是说java数组里面只能存在同一种数据类型,而Python的一个列表内却是可以同时含有多种不同数据类型,这是一个主要的小区别。
  • (2)数组长度不可变:一旦数组创建并分配了空间,其长度不可改变。这点也是和Python不同,因此,如果需要动态增删元素,建议使用ArrayList等其他动态数组类。
  • (3)java中数组这些没有切片操作这些。

1 数组的创建与初始化

(1)静态初始化

  • 初始化就是在内存中为数组容器开辟空间,并将数据存入容器中的过程

  • 注:数组一旦创建过后其长度就固定了,不可改变
    数组的长度直接访问数组的length属性即可:arr.length

其中语法有下面完整写法和简单写法两种

  • 简单格式:数组类型[] 数组名 = {元素1,元素2,元素3…}
  • 完整格式:数组类型[] 数组名 = new 数组类型[]{元素1,元素2,元素3…}
public class Business {
    public static void main(String[] args) {

        int[] arr1 = new int[]{1,2,3};   // 这种是复杂的写法,一般使用下面的简单写法即可
        int[] arr2 = {1,2,3};

        String[] arr3 = new String[]{"a","b","c"};
        String[] arr4 = {"a","b","c"};
        System.out.println(arr2);  // [I@4eec7777
        System.out.println(arr4);  // [Ljava.lang.String;@3b07d329

    }
}

上面有个小细节,在java中直接打印数组打印的是数组的地址,下面对java中的地址格式做一个解释说明。
java地址格式说明:[I@4eec7777上面的这个地址,[ 表示是数组,I表示里面数据类型是整数 。@没有固定含义,就是一个固定格式,4eec7777这个才是真正的地址值。

(2)动态初始化

动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
语法: 数据类型[] 数组名 = new 数据类型[数组长度]

【注】:和静态相比,右边大括号没有了,中括号里面变数组长度了,要注意

int[] arr = new int[100]

数组默认的初始化规律:

  • 整数类型:默认初始化为0
  • 小数类型:默认初始化为0.0
  • 字符类型:默认初始化为‘/u0000’ 其实就是空格
  • 布尔类型:默认初始化为false
  • 引用数据类型:默认初始化为 null

2 数组元素访问与修改

语法:

  • 访问: 数组名[索引]
  • 修改:数组名[索引] = 具体数据/变量

【注】:
1、java中的索引也是从0开始的
2、java中数组索引不能是负数,这和Python不一样

String[] arr4 = {"a","b","c"};
        String s = arr4[0];
        System.out.println(s);   // a

        arr4[1] = "哈哈";
        System.out.println(arr4[1]);     // 哈哈

3 数组的遍历

关于数组的变量java提供了一种增强的增强型 for 循环 (foreach)
基本语法:for (int i : arr)
以下面案例为例:定义一个数组[1,2,3,4,5],并用遍历数组求里面元素的和。

public class Business {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int sum = 0;
        for (int i:arr){
            sum += i;
        }
        System.out.println(sum);

    }
}

另外还有一种普通for循环结合数组长度来的就没有那么方便了

public class Business {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
        }
        System.out.println(sum);

    }
}

【注】:今后我们尽量使用增强型的和Python类似

4 数组的内存图(重要!!!!!!!)

由于数组前面已经有博客记录过了,这里直接给出衔接数组

5 二维数组

数组里面存数组就是二维数组了。

(1)静态初始化

  • 语法格式: 数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2},{元素1,元素2}}
  • 简化格式:数据类型[][] 数组名 = {{元素1,元素2},{元素1,元素2}}
  • 范例:int[][] arr = new int[][]{{1,2},{3.4}} 或者 int[][] arr = {{1,2},{3.4}}
  • 注意:二维数组数据类型指定了,所有数据类型都要是指定的数据类型,就算是内部的数组里面的元素也应该是最先规定的数据类型。
public class Business {
    public static void main(String[] args) {
        // int[][] arr = new int[][]{{1,2,3},{4,5,6,7,8}};
        int[][] arr = {{1,2,3},{4,5,6,7,8}};

        //数组访问
        System.out.println(arr[0][0]);  // 1

        // 二维数组的遍历,也可以使用增强for循环
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j]+" ");
            }
        }

        System.out.println();
        // 二维数组的遍历,增强for循环
        for (int[] a : arr) {
            for (int i : a) {
                System.out.print(i+" ");
            }
        }
    }
}

(2)动态初始化

  • 语法格式:数据类型[][] 数组名 = new 数据类型[m][n]
    其中,m,n理解成m行n列就可以了。所以没有静态初始化那么灵活可以内部数组长度不一样,不为二维数组不就是为了处理矩阵问题,够用就行。如果要动态初始化内部数组长度不同的怎么办,也有办法,由于并不常用,就放在下面的内存图中顺便作为介绍内存图的案例了。
  • 范例: int[][] arr = new int[2][3];
public class Business {
    public static void main(String[] args) {
        // int[][] arr = new int[][]{{1,2,3},{4,5,6,7,8}};
        int[][] arr = new int[2][3];
        arr[0][0] = 100;

        // 遍历
        for (int[] row : arr){
            for (int data : row){
                System.out.print(data + " ");
            }
            System.out.println();
        }
    }
}
/* 输出:
100 0 0
0 0 0 
*/

(3)二维数组的内存图(重要重要重要!!!!!!!!!!!)

由于数组前面已经有博客记录过了,这里直接给出衔接数组

6 数组小练习

(1)求最值

public class Business {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        int max = arr[0];     // 初始化最大值为数组第一个元素,一定要是数组中的元素,不能是0
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        System.out.println("Max: " + max);
    }
}

(2)按索引交换数组对应元素
在Python中交换两个变量的值直接 a,b = b,a即可,但是java不行,中间必须用一个中间变量过度。

int a = 10;
int b = 5;

int tem = a;
a = b;
b = tem;

System.out.println("a = " + a);  // 5
System.out.println("b = " + b);  // 10

知道上面那个,数组内部元素交换就按上面技巧来就是了。
其实还有一些其他花里胡哨的骚套路可以节省tem的内存消耗。

看下面这个题目:
在这里插入图片描述
思路:用双指针,while(i!= j)

public class Business {
    public static void main(String[] args) {
        int[] arr = new int[]{1,2,3,4,5};

        int i = 0;
        int j = arr.length - 1;
        while(i!=j){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i++;
            j--;
        }
        for(int k=0; k<arr.length; k++){
            System.out.println(arr[k]);
        }
    }
}

三、Arrays:操作数组的工具类(极其常用)

有没有发现数组里面没有什么方法吗?只有一个arr.length访问长度属性的属性访问手段。不要担心,这里就有这么一个操作数组的工具类,里面提供大量的静态方法操作数组,所以这个工具类用到的场景极其广泛。
下面同样给出常用的操作方法

1 public static String toString(数组):把数组拼接成一个字符串

2 public static int binarySearch(数组):

四、集合:ArryList — 数组列表

查阅帮助文档可以发现这个类在 java.util包下面

在之前创建数组我们采用的构造方式是 数组类型[] 数组名 = new 数组类型[]{元素1,元素2,元素3…}这种方式,这是独属于数组的构造方式。今后我们大多集合(还有些其他集合使用其他构造方式)都是使用 new + 泛型这种构造方式来创建集合对象。什么是泛型,打开ArryList的帮助文档:
在这里插入图片描述
上面这个<数据类型>括号就是泛型,用来指定集合里面的数据类型的。
了解了泛型就可以往下学习了

  • ArryList基本数据类型不能进,必须是对应的包装类才行
  • ArryList的长度是可以变的,理解成一个长度可变的动态数组
  • ArryList提供了一个subList(int fromIndex, int toIndex)方法可以达到类似切片的效果 — 有兴趣可以查看API帮助文档(具体是浅复制还是深复制还得查阅资料),由于重点不在切片,所以这里就不详细说明,用到查资料即可。

1 ArryList对象的创建

  • jdk7前的语法: Array<数据类型> 变量名 = new Array<数据类型> ()
  • jdk7以后的语法: Array<数据类型> 变量名 = new Array<> ()
// ArrayList<String> ls = new ArrayList<String>();
ArrayList<String> ls = new ArrayList<>();
 ls.add("a");
 ls.add("b");
 System.out.println(ls);    // [a, b]

【注】:这个就和Python列表很像了

2 ArryList常见成员方法

【注】:其中E表示ArryList里面元素数据类型 , e表示具体数据元素

(1)boolean add(E e) : 添加元素,返回值表示是否添加成功

(2)void add(int index, E e) :在指定索引位置插入元素。

(3)boolean remove(E e) : 删除第一个指定元素 e,返回值表示是否删除成功

(4)E remove(int index) : 删除指定索引元素,返回被删除元素

(5)E set(int index, E e) : 修改指定索引下的元素,返回原来的元素

(6)E get(int index) : 获取指定索引处的元素

(7)int size() : 返回集合的长度

// ArrayList<String> ls = new ArrayList<String>();
ArrayList<String> ls = new ArrayList<>();
ls.add("aaa");
ls.add("bbb");
ls.add("ccc");
ls.add("aaa");
System.out.println(ls);    // [aaa, bbb, ccc, aaa]

ls.remove("aaa");    // 删除第一个aaa
System.out.println(ls);    // [bbb, ccc, aaa]

ls.remove(1);    // 删除索引为1的元素
System.out.println(ls);    // [bbb, aaa]

ls.set(1, "ddd");    // 修改索引为1的元素
System.out.println(ls);    // [bbb, ddd]

System.out.println(ls.get(1));    // ddd
System.out.println(ls.size());    // 2

(8)boolean isEmpty() :判断数组列表是否为空。

这个判断为空有专门方法,没有Python那么方便。
【注】:java中的 逻辑运算符 ! 和Python中的not有同样效果

ArrayList<String> list = new ArrayList<>();
list.add("Apple");  // 添加一个元素,使列表非空

// 判断是否非空
if (!list.isEmpty()) {
    System.out.println("List is not empty");
} else {
    System.out.println("List is empty");
}

3 ArryList的遍历

(1)使用get()方法遍历

(2)使用增强for循环遍历

ArrayList<String> list = new ArrayList<>();
list.add("Apple");  // 添加一个元素,使列表非空
list.add("Banana");
list.add("Orange");

// 使用get方法遍历列表
for (int i = 0; i < list.size(); i++) {
    System.out.print(list.get(i) + " ");
}

System.out.println();

// 使用增强for循环遍历列表
for (String str : list) {
    System.out.print(str + " ");
}

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

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

相关文章

bbr 收敛动力学背后的数学原理

我进一步把 bbr 模型简化为更一般的形式。设 x 为 bbr 流的 estimated bw&#xff0c;wₓ 为 bbr 流的 inflight&#xff0c;C 为瓶颈带宽&#xff0c;R 为传播时延&#xff0c;R_s 为总时延&#xff0c;pacing_rate 增益为 g&#xff1a; I ( t ) t o t a l _ i n f l i g h …

火绒使用详解 为什么选择火绒?使用了自定义规则及其高级功能的火绒,为什么能吊打卡巴斯基,360,瑞星,惠普联想戴尔的电脑管家等?

目录 前言 必看 为什么选择火绒&#xff1f; 使用了自定义规则及其高级功能的火绒&#xff0c;为什么能吊打卡巴斯基&#xff0c;360&#xff0c;瑞星&#xff0c;惠普联想戴尔的电脑管家等&#xff1f; 原因如下&#xff1a; 火绒的主要优势 1. 轻量化设计 2. 强大的自…

CocosCreator 3.8 IOS 热更新失败问题解决方案

CocosCreator 3.8 IOS 热更新失败问题解决方案 问题描述 Creator 版本&#xff1a; 3.8.0目标平台&#xff1a; ios 模拟器/真机重现方式&#xff1a;安卓构建版本生成的热更新包&#xff0c;上传到OSS&#xff0c;使用ios进行更新。 19:18:36 [ERROR]: [ERROR] file /Applica…

自动化测试—等待方式详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在自动化测试中&#xff0c;等待是一个重要的技术&#xff0c;用于处理页面加载、元素定位、元素状态改变等延迟问题。 等待能够确保在条件满足后再进行后续操作…

Web前端:CSS篇(三)盒子模型,弹性盒子

CSS 盒子模型 所有HTML元素可以看作盒子&#xff0c;在CSS中&#xff0c;"box model"这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子&#xff0c;封装周围的HTML元素。 盒模型允许我们在其它元素和周围元素边框之间的空间放置元素。 盒子模型的作用…

8.18 day bug

bug1 搞懂了用法和特性&#xff0c;bug自然而然就没了 Git branch -a 列出所以分支 git branch&#xff1a; 输入该命令后&#xff0c;会列出当前仓库中所有的分支。当前所在的分支会以星号(*)标记出来 gitpod /workspace/project (reset-orphan-branch|CHERRY-PICKING) $ g…

C# SolidWorks 二次开发-103.模拟库拖拽

最近躺平状态&#xff0c;所有没有更新。 为了搜索量再高一点&#xff0c;我决定让排名上升一个名次&#xff0c;今天来写一篇关于如何假装自己有个库。 如上图&#xff0c;进行一个拖拽示例&#xff0c;从自己的窗体中将文件带入solidworks中打开 或者 装配动作。与手动从文…

Jenkins汉化配置详解

Window安装构建神器Jenkins Window安装构建神器Jenkins详细教程-CSDN博客DevOps&#xff0c;CI&#xff0c;CD&#xff0c;自动化简单介绍选择其他需要和Jenkins一起安装的服务&#xff0c;点击Next。https://blog.csdn.net/qq_37237487/article/details/141299623 登录进入J…

从新手到专家必读书籍:官方推荐.NET技术体系架构指南

前言 Microsoft 官方推荐了一系列有关 .NET 体系结构的指南&#xff0c;旨在帮助开发人员掌握最新的技术和最佳实践。这些资源覆盖了从微服务架构到云原生应用开发等多个主题&#xff0c;是开发高质量 .NET 应用程序不可或缺的参考资料。 通过这些指南&#xff0c;可以深入了…

图纸操作权限守护者:彩虹图纸管理系统的权限功能详解

在产品研发设计过程中&#xff0c;图纸作为核心机密资料&#xff0c;其安全性与保密性至关重要。一旦图纸发生泄密或丢失&#xff0c;将给企业带来不可估量的损失。因此&#xff0c;图纸管理系统的权限功能成为保障数据安全的重要防线。彩虹图纸管理系统凭借其强大的权限管理功…

不同主机之间的网络通信学习

IPC 进程间通信方式 共享内存 //最高效的进程间通信方式 共享内存: 1.是一块&#xff0c;内核预留的空间 2.最高效的通信方式 //避免了用户空间 到 内核空间的数据拷贝 IPC通信方式 ---操作流程类似的 操作: system v &#xff1a; …

全面解析去中心化应用,深入了解 DApps 构建与发展,掌握区块链核心知识!

来源&#xff1a;https://cointelegraph.com/learn/what-are-dapps-everything-there-is-to-know-about-decentralized-applications 编译&#xff1a;TinTinLand 社区 关键要点 ➤ 去中心化应用程序&#xff08;DApps&#xff09;类似于人们每天使用的应用程序&#xff0c;但…

ArcGIS Pro基础:设置2个窗口同步联动界面

如上所示&#xff0c;通过1步骤&#xff0c;新建了2个地图窗口&#xff0c;得到2和3所表示的【地图1】、【地图2】&#xff0c;一个是影像图&#xff0c;另一个是地形图&#xff0c; 假如有个需求&#xff0c;是将2个窗口联动起来&#xff1a;在观察影像的同时&#xff0c;也同…

dockdaemon远程管理

1.启动和查看服务 2.查看版本 管理步骤 1.关闭docker守护进程 2.修改dock daemon的进程⽂件 发现docker 虽然关闭了&#xff0c;依然有sock⽂件 创建时间也⾮常早 进⼊配置⽂件 删除相关sock的⽂件 再次启动&#xff0c;发现有提示 3.加载配置⽂件、 4.重新开启docker守护进程、…

计算机毕业设计选题推荐-付费自习室管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

【论文分享】Heterogeneous Isolated Execution for Commodity GPUs 2019‘ASPLOS

Heterogeneous Isolated Execution for Commodity GPUs 2019’ASPLOS 目录 AbstractIntroductionContributions BackgroundIntel Software Guard Extensions (SGX)PCI Express Architecture Threat ModelAttacker Model and AssumptionsOut of Scope HIX ArchitectureArchite…

初识C++以及安装C++学习工具

C的发展史 C是由Bjarne Stroustrup在20世纪80年代初期于贝尔实验室开发的一种编程语言。它的设计初衷是作为C语言的一个超集&#xff0c;通过添加面向对象编程的特性来增强C语言。C支持多种编程范式&#xff0c;包括过程化编程、面向对象编程和泛型编程。 C的历史可以追溯到1…

鹏哥C语言自定义笔记重点(29-)

29.函数指针数组 30.void指针是不能直接解引用&#xff0c;也不能-整数。 void*是无具体类型的指针&#xff0c;可以接受任何类型的地址。 31.qsort:使用快速排序的思想实现一个排序函数(升序) 32. 33.地址的字节是4/8 34.char arr[]{a,b} sizeof(arr[0]1)答案是4&#xff0…

万象公文常见问题的处理方法

在万象公文试用阶段&#xff0c;我们收集并汇总了用户反馈的一系列问题。现在我们针对这些问题进行一一解答&#xff0c;希望可以帮助大家提升万象公文的使用体验。 1、信创版插件在WPS中不显示或显示不全 安装前&#xff0c;如果WPS未彻底关闭&#xff0c;插件不会触发加载&a…

在家办公如何远程公司电脑

随着远程办公和居家办公的普及&#xff0c;如何高效、安全地远程控制办公室电脑成为许多职场人士的需求。Splashtop作为一款专业的远程控制软件&#xff0c;提供了强大的功能&#xff0c;使用户能够随时随地访问和操作办公室的电脑&#xff0c;实现高效的远程办公体验。 Splas…