当前位置: 首页 > news >正文

Java实现数据结构——顺序表

目录

一、前言

二、实现

2.1 增

2.2 删

2.3 查 

 2.4 改

 2.5 销毁顺序表

三、Arraylist

3.1 构造方法

 3.2 常用操作

3.3 ArrayList遍历

四、 ArrayList具体使用  

4.1 杨辉三角

4.2 简单洗牌算法


一、前言

笔者在以前的文章中实现过顺序表

本文在理论上不会有太详细的讲述

如有需要可以翻看笔者之前的文章

http://t.csdnimg.cn/G5TpF


Java 中已经封装好了顺序表的类

但在使用之前

先自己实现一遍 

二、实现

将顺序表作为一个类进行实现

public class MyArrayList {private int[] array ;//以整形数组示例private static int defaultspace = 10;//默认数组大小private int usespace = 0;//顺序表有效数据个数// 构造方法public MyArrayList() {this.array = new int[defaultspace];//不指定大小就默认大小}public MyArrayList(int size) {this.array = new int[size] ;//用户自己指定大小}
}

再给一个方法让用户可以知晓表中有效数据个数

  public int size(){return this.usespace;}

2.1 增

这里进行一个方法的重载

   public void add(int data){
//     不指定位置就默认是数组尾插入数据}public void add(int data ,int pos){
//指定位置就插入到指定位置

在进行数据插入时

需要判断顺序表中是否还有足够的空间

给一个方法

检查操作不需要用户来使用

那就用 private 来修饰

   private boolean IsFull() {
//        检查顺序表空间是否还有剩余return usespace == this.array.length;}

如果顺序表空间没有剩余

就需要扩容这个顺序表

这里选择使用 Arrays 类中的 copyOf 方法

    public void add(int data) {
//     不指定位置就默认是数组尾插入数据if (IsFull(array)) {this.array = Arrays.copyOf(array, array.length * 2);}array[usespace] =  data;usespace++;

 将上述操作封装进一个方法 checkspace

 private void checkspace() {if (IsFull()) {array = Arrays.copyOf(array, array.length * 2);}}
   public void add(int data) {
//     不指定位置就默认是数组尾插入数据checkspace();this.array[usespace++] = data;}


而在指定位置的 add 方法中

 则是需要检查插入位置是否合法

这个下标的合法区间是 0~顺序表有效数据个数

那么不止在增删查改中都会有操作涉及到检查要进行操作的位置是否合法

不妨将操作位置不合法作为异常处理

自定义一个异常类

public class Pos_IllegalityException extends RuntimeException{public Pos_IllegalityException(String message) {super(message);}
}

检查操作不需要用户来使用

那就用 private 来修饰

  private void checkPos(int pos) throws Pos_IllegalityException {//检查插入位置是否合法if(pos < 0 || pos > usespace){throw new Pos_IllegalityException("输入的下标不合法:"+pos);}}

指定位置插入数据后

需要将原 pos及其以后得数据向后移动

    public void add(int data, int pos) {
//指定位置就插入到指定位置try {checkPos_add(pos);} catch (Pos_IllegalityException e) {e.printStackTrace();}checkspace();for (int i = usespace; i >= pos; i--) {this.array[i + 1] = this.array[i];}this.array[pos] = data;this.usespace++;}

在实现一个打印方法

便于测试

  public void print() {for (int i = 0; i < usespace; i++) {System.out.println(array[i]);}}

测试

  public static void main(String[] args) {MyArrayList arr1 = new MyArrayList();arr1.add(1);arr1.add(2,0);arr1.add(3,1);arr1.add(4);arr1.add(5);arr1.print();}
}


测试是否能捕捉到异常

 public static void main(String[] args) {MyArrayList arr1 = new MyArrayList();arr1.add(1);arr1.add(2,0);arr1.add(3,10);arr1.add(4);arr1.add(5);arr1.print();}

 

 符合预期

2.2 删

在进行删除操作的时候

这个顺序表肯定不能为空

就要先判断

   private boolean IsEmpty() {return this.usespace == 0;}
public void remove(int pos){}

在进行指定位置删除时,同样需要判断进行操作的位置是否合法

删除操作中

pos 合法范围是[0,usespace)

  private void chechPos_remove(int pos) throws Pos_IllegalityException {//检查删除位置是否合法if (pos < 0 || pos >= this.usespace) {throw new Pos_IllegalityException("输入的下标不合法:" + pos);}}

删除 pos 位置的数据就是将 pos 位置后的数据向前移动一位

pos + 1 位置开始向前覆盖

public void remove(int pos) {//删除指定位置的数据if (IsEmpty()) {System.out.println("当前没有可以删除的数据");}try {chechPos_remove(pos);} catch (Pos_IllegalityException e) {e.printStackTrace();}for (int i = pos; i < this.usespace - 1; i++) {this.array[i] = this.array[i + 1];}this.usespace--;}

测试

public static void main(String[] args) {MyArrayList arr1 = new MyArrayList();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);arr1.add(5);arr1.print();System.out.println("===========================");arr1.remove(0);arr1.remove(arr1.size() - 1);arr1.print();}


测试是否能捕捉异常

public static void main(String[] args) {MyArrayList arr1 = new MyArrayList();arr1.add(1);arr1.add(2);arr1.add(3);arr1.add(4);arr1.add(5);arr1.print();System.out.println("===========================");arr1.remove(0);arr1.remove(arr1.size() );arr1.print();}

符合预期

2.3 查 

用两个方法

一个叫 indexOf 

  public int indexOf(int data)

找到对应数据返回对应下标

找不到返回 -1

一个叫 get

public int get(int pos)

查找对应下标的数据


先说 indexOf

同样的

在查找时

也需要判断顺序表中是否有数据

public int indexOf(int data) {if (IsEmpty()) {}return -1;}

为空或者表中没这个数据都返回-1

找到了就返回对应的下标

   public int indexOf(int data) {
//        查找数据对应的下标if (IsEmpty()) {return -1;}for (int i = 0; i < this.usespace; i++) {if (this.array[i] == data) {return i;}}return -1;}


现在说 get

public int get(int pos)throws {
//        查找对应下标的数据if (IsEmpty()) {}}

那么在这里遇到了一个小问题

在这个顺序表为空的情况下

返回值该是什么呢

似乎任意一个整数都不太适合进行返回

那么干脆将顺序表为空作为一种异常处理

public class MyArrayListEmptyException extends RuntimeException{public MyArrayListEmptyException(String message) {super(message);}
}

再将前文中删操作时也应用这个异常

 public void remove(int pos) throws MyArrayListEmptyException {//删除指定位置的数据if (IsEmpty()) {throw new MyArrayListEmptyException("当前顺序表为空!");}try {chechPos_remove(pos);} catch (Pos_IllegalityException e) {e.printStackTrace();}for (int i = pos; i < this.usespace - 1; i++) {this.array[i] = this.array[i + 1];}this.usespace--;}

然后完成 get 的逻辑

同样的

需要检查传入下标的合法性

这里传入下标的合法性与删除操作的合法范围相同

那么就可以调用 chechPos_remove 这个方法

为了方便就改个名

 private void chechPos_remove_and_get(int pos) throws Pos_IllegalityException {//检查删除位置是否合法if (pos < 0 || pos >= this.usespace) {throw new Pos_IllegalityException("输入的下标不合法:" + pos);}}
   public int get(int pos) throws MyArrayListEmptyException {
//        查找对应下标的数据chechPos_remove_and_get(pos);if (IsEmpty()) {throw new MyArrayListEmptyException("当前顺序表为空");}return this.array[pos];}

测试

 public static void main(String[] args) {MyArrayList arr1 = new MyArrayList();arr1.add(99);arr1.add(2);arr1.add(3);System.out.println(arr1.indexOf(3));System.out.println(arr1.indexOf(4));System.out.println(arr1.get(0));}

这里看起来好像没问题

需要注意的是

如果是顺序表中所存数据是引用数据类型

那么

就不能使用 == 号判断

需要重写 equals 方法

 2.4 改

通过一个 set 方法来实现

public void set(int data ,int pos){}

类似的

顺序表不能为空

判断 pos 是否合法

合法区间也是[0,usespace)

那再改个名

private void checkPos_remove_get_set(int pos) throws Pos_IllegalityException {//检查删除位置是否合法if (pos < 0 || pos >= this.usespace) {throw new Pos_IllegalityException("输入的下标不合法:" + pos);}}

完成 set 的实现

public void set(int data, int pos) throws MyArrayListEmptyException{//修改表中数据if(IsEmpty()){throw new MyArrayListEmptyException("当前顺序表为空");}checkPos_remove_get_set(pos);this.array[pos] = data;}

测试

 public static void main(String[] args) {MyArrayList arr1 = new MyArrayList();arr1.add(99);arr1.add(2);arr1.add(3);arr1.set(199,0);arr1.set(299,1);arr1.print();}

 2.5 销毁顺序表

顺序表在使用完成之后需要进行销毁

如果顺序表存的是基本数据类型

可以直接让 usespace = 0

 public void clear(){this.usespace = 0;}

但是如果是引用数据类型

采用这种方法会造成内存泄漏

JVM 中的自动回收算法有一个要求便是没引用这个数据

而这里虽然将 usespacez 置为0了

但数组中的对象仍然是存储在内存当中的

0下标确实还在引用这个对象

那么最粗暴的方法

就是直接将数组置空

  public void clear(){this.array = null;}

平和一点就是写一个循环

让每一项都置空

public void clear(){for (int i = 0; i <this. usespace; i++) {this.array[i] = null;}}

那为什么基本数据类型不需要回收呢

比如这里的 int

就算不主动向表中插入数据

表中对应下标位置仍会有默认的 0

到这里

自己实现的一个简单顺序表就完成了

下面来看看 Java 中实现的 Arraylist

三、Arraylist

接下来来看一下 Java 中已经封装好的 Arraylist

这里只展示部分方法


3.1 构造方法

 来看看提供的构造方法


其中这个构造方法是由使用者指定顺序表大小

指定空间大小不合法就抛出一个异常


现在来看看这个无参构造方法 

可以看到的是

如果调用无参构造方法

并没有给数组分配内存空间

public static void main(String[] args) {ArrayList arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);for (int i = 0; i < arrayList.size(); i++) {System.out.println(arrayList.get(i));}}

 

但是可以看到的是

往这个表中插入数据

还是可以成功插入

这时候就去看看方法 add 中是怎么执行的

 就是通过上述步骤

elementData 指定了一片内存空间

能够完成 add 操作


 

public static void main(String[] args) {ArrayList<Integer> arrayList1 = new ArrayList<>();ArrayList<Number> arrayList2 = new ArrayList<>(arrayList1);}

 

 public static void main(String[] args) {ArrayList<Integer> arrayList1 = new ArrayList<>();ArrayList<Number> arrayList2 = new ArrayList<>(arrayList1);LinkedList<Number> linkedList = new LinkedList<>(arrayList1);Vector<Number> vector = new Vector<>(arrayList1);}

 

都是可以的

而不满足上述条件

  public static void main(String[] args) {ArrayList<String> arrayList1 = new ArrayList<>();ArrayList<Number> arrayList2 = new ArrayList<>(arrayList1);}

 

 3.2 常用操作

方法作用
boolean add (E e)
尾插 e
void add (int index, E element)
e 插入到 index 位置
boolean addAll (Collection<? extends E> c)
尾插 c 中的元素
E remove (int index)
删除 index 位置元素
boolean remove (Object o)
删除遇到的第一个 o
E set (int index, E element)
将下标 index 位置元素设置为 element
void clear ()
清空
boolean contains (Object o)
判断 o 是否在线性表中
int indexOf (Object o)
返回第一个 o 所在下标
int lastIndexOf (Object o)
返回最后一个 o 的下标
List<E> subList (int fromIndex, int toIndex)
截取部分list
…………

这里主要说说重载的 remove 方法

    public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);for (int i = 0; i < arrayList.size(); i++) {System.out.print(arrayList.get(i)+" ");}arrayList.remove(3);System.out.println();for (int i = 0; i < arrayList.size(); i++) {System.out.print(arrayList.get(i)+" ");}}

如果只传一个整形数字

删除的是对应下标的值 

如果想要具体删除某一个数据

那就要 new 一个对象

  public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);for (int i = 0; i < arrayList.size(); i++) {System.out.print(arrayList.get(i)+" ");}arrayList.remove(new Integer(3));System.out.println();for (int i = 0; i < arrayList.size(); i++) {System.out.print(arrayList.get(i)+" ");}}


以及 subList 方法

public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);List<Integer> list = arrayList.subList(0,3);for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i)+" ");}arrayList.set(0,99);System.out.println();for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i)+" ");}}

截取后并不是产生新的对象

而是将截取的地址返回

所以在修改 arraylist 的值后

list 也会被修改

3.3 ArrayList遍历

ArrayList 可以使用三方方式遍历: for循环+ 下标 foreach 使用迭代器
for循环+ 下标在前文已经使用,这里就不再赘述
public  static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);for (Integer integer:arrayList){System.out.println(integer);}}


迭代器

使用方法

  public  static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(5);Iterator<Integer> integerIterator = arrayList.iterator();while (integerIterator.hasNext()){System.out.println(integerIterator.next());}}

 

四、 ArrayList具体使用  

4.1 杨辉三角

题目来源

https://leetcode.cn/problems/pascals-triangle/description/


 这段代码表示

指定 对象 list 中存放的类型是 List<Integer>

 public static void main(String[] args) {List<List<Integer>> list = new ArrayList<>();ArrayList<Integer> arrayList = new ArrayList<>();ArrayList<Integer> arrayList2 = new ArrayList<>();list.add(arrayList);list.add(arrayList2);System.out.println();}

打个断点观察一下

可以看到其中存放的确实是 ArrayList 类型的对象


在本题中可以将整个杨辉三角看成是一个 List< List<Integer>> 对象

每一行就是单独的一个 Arraylist 对象 

就可以将 numRows Arraylist 对象增加到 List< List<Integer>> 对象中

完成这个杨辉三角


每一个 Arraylist 对象首元素和尾元素都是 1

就只需要给 (0,Arraylist 对象.length()) 下标处进行计算赋值

  public List<List<Integer>> generate(int numRows) {List<List<Integer>> list = new ArrayList<>();//        第一行只有一个元素 1List<Integer> firstrow = new ArrayList<>();firstrow.add(1);list.add(firstrow);//插入listfor (int i = 1; i < numRows; i++) {List<Integer> currow = new ArrayList<>();//当前行currow.add(1);//当前行的首元素for (int j = 1; j < i; j++) {
//                只进行(0,尾元素下标)之间的值赋值}currow.add(1);//尾元素赋值list.add(currow);//插入list}return list;}

而处于这个范围内的值等于

上一行同一列的值+上一行前一列的值

而对于当前代码来说

以第三行为例

list 中的第二个存储的对象

通过 get 方法将获取

public List<List<Integer>> generate(int numRows) {List<List<Integer>> list = new ArrayList<>();//        第一行只有一个元素 1List<Integer> firstrow = new ArrayList<>();firstrow.add(1);list.add(firstrow);//插入listfor (int i = 1; i < numRows; i++) {List<Integer> currow = new ArrayList<>();//当前行currow.add(1);//当前行的首元素for (int j = 1; j < i; j++) {
//                只进行(0,尾元素下标)之间的值赋值List<Integer> lastrow = list.get(i - 1);//上一行int num = lastrow.get(j) + lastrow.get(j - 1);currow.add(num);}currow.add(1);//尾元素赋值list.add(currow);//插入list}return list;}

现在来提交一下

可以看到是可行的

4.2 简单洗牌算法

假设有三人正在玩扑克牌

设计一个洗牌算法

这里不计入大小王

总共有五十二张牌

花色有四种

♠(黑桃)、♥(红桃)、♦(方块)、♣(梅花)

每种花色各有13张

J Q K A 用数字 11,12,13,1代替

大概逻辑如下


可以把每一张牌看成是一个对象

那就需要一个牌类

public class Card {private String color;//花色 ♠(黑桃)、♥(红桃)、♦(方块)、♣(梅花)private int point;//点数 1,2,3,4,5,6,7,8,9,10,11,12,13public  Card(){}public Card(String color, int point) {this.color = color;this.point = point;}public void setColor(String color) {this.color = color;}public void setPoint(int point) {this.point = point;}@Overridepublic String toString() {return "[" +color + '\''+ point +"]";}
}

那么 Card 类实例化出来的 52 个对象放到一个牌组 CardList

public class CardList {
//牌组public static List<Card> BuyCard(){List<Card> cardList = new ArrayList<>();return cardList;}
}

再创建一个 Colors 类表示花色

Points 类表示点数

public class Colors {//花色private static String[] colors = {"♠","♥","♦","♣"};public static String getColors(int index) {return colors[index];}public static int size(){return colors.length;}}
public class Points {//点数private static int[] points = {1,2,3,4,5,6,7,8,9,10,11,12,13};public static int getPoints(int index) {return points[index];}public static int size(){return points.length;}
}

通过这个类的静态方法返回一个 List<Card> 类对象

public static List<Card> BuyCard(){List<Card> cardList = new ArrayList<>();for (int i = 0; i < Colors.size(); i++) {for (int j = 0; j < Points.size(); j++) {Card card = new Card(Colors.getColors(i),Points.getPoints(j));cardList.add(card);}}return cardList;}

在通过循环给每张牌进行 colorpoint 的赋值

public static List<Card> BuyCard(){List<Card> cardList = new ArrayList<>();for (int i = 0; i < Colors.size(); i++) {for (int j = 0; j < Points.size(); j++) {Card card = new Card(Colors.getColors(i),Points.getPoints(j));cardList.add(card);}}return cardList;}

再将牌放入数组中

打印出来看看

public static void main(String[] args) {List<Card> cardList = CardList.BuyCard();System.out.println(cardList);}

 (仅展示部分)

那么生成一副牌的逻辑就完成了


现在要洗乱这副牌

其实就是交换 cardlist 中存放的牌的位置

即两个下标的数据互换

而要随机洗乱就要生成随机数

可以使用 Random

Random random = new Random();random.nextInt();

random.nextInt() 传入一个整形 n 可以限制只生成 0~n 之间的整数

那么可以遍历 cardlist 

将遍历过程中的下标作为限制传入

这里选择从尾部开始遍历

private static void shuffle(List<Card> cardList) {Random random = new Random();for (int i = cardList.size() - 1; i > 0; i--) {int index = random.nextInt(i);}}

然后需要有一个交换的操作

可以通过 List 中的 set 方法

将交换的操作封装成一个方法

  private static void swap(List<Card> cardList, int index1, int index2) {Card tmp = new Card();tmp = cardList.get(index1);cardList.set(index1, cardList.get(index2));cardList.set(index2, tmp);}

放到生成牌的方法中 

   public static List<Card> BuyCard() {List<Card> cardList = new ArrayList<>();for (int i = 0; i < Colors.size(); i++) {for (int j = 0; j < Points.size(); j++) {Card card = new Card(Colors.getColors(i), Points.getPoints(j));cardList.add(card);}}shuffle(cardList);return cardList;}

测试一下看下行不行

public static void main(String[] args) {List<Card> cardList = CardList.BuyCard();System.out.println(cardList);}

(仅展示部分)

可以看到顺序确实是被洗乱了


发给三个人,每人一开始有五张

可以把玩家看成是一个专门存放 List<Card> 类对象的 List

cardlist 中摸牌就是 add

    public static void main(String[] args) {List<Card> cardList = CardList.BuyCard();List<List<Card>> player= new ArrayList<>();//人for (int i = 0; i < 3 ; i++) {//i表示人List<Card> list = new ArrayList<>();for (int j = i * 5; j < i * 5 + 5; j++) {list.add(cardList.get(j));}player.add(list);System.out.println(player.get(i));}}

感谢观看

相关文章:

Java实现数据结构——顺序表

目录 一、前言 二、实现 2.1 增 2.2 删 2.3 查 2.4 改 2.5 销毁顺序表 三、Arraylist 3.1 构造方法 3.2 常用操作 3.3 ArrayList遍历 四、 ArrayList具体使用 4.1 杨辉三角 4.2 简单洗牌算法 一、前言 笔者在以前的文章中实现过顺序表 本文在理论上不会有太详细…...

线程知识点总结

Java线程是Java并发编程中的核心概念之一&#xff0c;它允许程序同时执行多个任务。以下是关于Java线程的一些关键知识点总结&#xff1a; 1. 线程的创建与启动 继承Thread类&#xff1a;创建一个新的类继承Thread类&#xff0c;并重写其run()方法。通过创建该类的实例并调用st…...

计算机网络:数据链路层 - 扩展的以太网

计算机网络&#xff1a;数据链路层 - 扩展的以太网 集线器交换机自学习算法单点故障 集线器 这是以前常见的总线型以太网&#xff0c;他最初使用粗铜轴电缆作为传输媒体&#xff0c;后来演进到使用价格相对便宜的细铜轴电缆。 后来&#xff0c;以太网发展出来了一种使用大规模…...

视频修复工具,模糊视频变清晰!

老旧视频画面效果差&#xff0c;视频效果模糊。我们经常找不到一个好的工具来让视频更清晰&#xff0c;并把它变成高清画质。相信很多网友都会有这个需求&#xff0c;尤其是视频剪辑行业的网友&#xff0c;经常会遇到这个问题。今天给大家分享一个可以把模糊视频修复清晰的工具…...

协程库——面试问题

1 同步、异步 1.1 同步 代码顺序执行&#xff0c;完全由用户控制. 同步阻塞 等待可读、可写的时候阻塞&#xff0c;不让出cpu。读、写之后&#xff0c;下面的代码才能执行、 同步非阻塞 等待可读、可写时&#xff0c;不会阻塞cpu&#xff0c;返回失败&#xff0c;设置错误码为…...

数据结构与算法题目集(中文)6-2顺序表操作集

题目地址 https://pintia.cn/problem-sets/15/exam/problems/type/6?problemSetProblemId725&page0 注意审题&#xff0c;返回false的时候不要返回ERROR&#xff0c;否则答案错误&#xff0c;机器规则是死的。 位置一般指数组下标&#xff0c;位序一般指数组下标1。但是思…...

8086 汇编笔记(十二):int 指令 端口 直接定址表

一、int 指令 int 指令的格式为:int n&#xff0c;n 为中断类型码&#xff0c;它的功能是引发中断过程 CPU 执行 intn 指令&#xff0c;相当于引发一个n号中断的中断过程&#xff0c;执行过程如下&#xff1a; (1) 取中断类型码 n; (2) 标志寄存器入栈&#xff0c;IF0&…...

揭开FFT时域加窗的奥秘

FFT – Spectral Leakage 假设用于ADC输出数据分析的采样点数为N&#xff0c;而采样率为Fs&#xff0c;那我们就知道&#xff0c;这种情况下的FFT频谱分辨率为δf&#xff0c;那么δfFs/N。如果此时我们给ADC输入一个待测量的单频Fin&#xff0c;如果此时Fin除以δf不是整数&a…...

【AI基础】第二步:安装AI运行环境

开局一张图&#xff1a; ​ 接下来按照从下往上的顺序来安装部署。 规则1 注意每个层级的安装版本&#xff0c;上层的版本由下层版本决定 比如CUDA的版本&#xff0c;需要看显卡安装了什么版本的驱动&#xff0c;然后CUDA的版本不能高于这个驱动的版本。 这个比较好理解&…...

【MySQL】聊聊唯一索引是如何加锁的

首先我们要明确&#xff0c;加锁的对象是索引&#xff0c;加锁的基本单位是next-key lock&#xff0c;由记录锁和间隙锁组成。next-key是前开后闭区间&#xff0c;间隙锁是前开后开区间。根据不同的查询条件next-key 可能会退化成记录锁或间隙锁。 在能使用记录锁或者间隙锁就…...

k8s-CCE使用node节点使用VIP--hostNetworkhostPort

CCE使用node节点使用VIP 背景:想在节点上使用VIP,将nodeport服务做到高可用。启动VIP后发现访问失败 部署 ! Configuration File for keepalived global_defs { router_id master-node }vrrp_instance VI_1 {state BACKUPinterface eth0mcast_src_ip 10.1.0.60virtual_rou…...

18、关于优化中央企业资产评估管理有关事项的通知

一、加强重大资产评估项目管理 (一)中央企业应当对资产评估项目实施分类管理,综合考虑评估目的、评估标的资产规模、评估标的特点等因素,合理确定本集团重大资产评估项目划分标准,原则上,企业对外并购股权项目应纳入重大资产评估项目。中央企业应当研究制定重大资产评估…...

AI大模型日报#0610:港大等1bit大模型“解决AI能源需求”、谷歌开源TimesFM时序预测模型

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-Large&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xf…...

速盾:图片cdn加速 免费

随着互联网的快速发展&#xff0c;图片在网页设计和内容传播中起着重要的作用。然而&#xff0c;随着网站访问量的增加和图片文件大小的增加&#xff0c;图片加载速度可能会成为一个问题。为了解决这个问题&#xff0c;许多网站使用图片CDN加速服务。 CDN&#xff08;Content …...

贪心算法例子

贪心算法概述 贪心算法是一种在每一步选择中都做出局部最优选择的算法,以期望通过一系列局部最优选择达到全局最优。贪心算法在许多优化问题中表现良好,特别是在某些特定类型的问题中能够保证找到最优解。 活动选择问题(Activity Selection Problem)背包问题(贪心解法)霍…...

vivado HW_ILA_DATA、HW_PROBE

HW_ILA_DATA 描述 硬件ILA数据对象是ILA调试核心上捕获的数据的存储库 编程到当前硬件设备上。upload_hw_ila_data命令 在从ila调试移动捕获的数据的过程中创建hw_ila_data对象 核心&#xff0c;hw_ila&#xff0c;在物理FPGA上&#xff0c;hw_device。 read_hw_ila_data命令还…...

refault distance算法的一点理解

这个算法看了好几次了&#xff0c;都没太理解&#xff0c;今天记录一下&#xff0c;加深一下印象。 引用某个博客对这个算法的介绍 一次访问page cache称为fault&#xff0c;第二次访问该页面称为refault。page cache页面第一次被踢出LRU链表并回收(eviction)的时刻称为E&#…...

软件安全技术【太原理工大学】

没有划重点&#xff0c;只说了一句课后题和实验中的内容都可能会出。 2022考试题型&#xff1a;选择20个20分&#xff0c;填空10个10分&#xff0c;名词解释4个20分&#xff0c;简答6个30分&#xff0c;分析与论述2个20分&#xff0c;没找到历年题。 如此看来&#xff0c;这门考…...

异常(Exception)

异常是什么 异常就是程序在进行时的不正常行为&#xff0c;就像之前数组时会遇到空指针异常&#xff08;NullPointerException&#xff09;&#xff0c;数组越界异常&#xff08;ArrayIndexOutOfBoundsException&#xff09;等等。 在java中异常由类来表示。 异常的分类 异常…...

一文者懂LLaMA 2(原理、模型、训练)

引言 LLaMA&#xff08;Large Language Model Meta AI&#xff09;是Meta&#xff08;前身为Facebook&#xff09;开发的自然语言处理模型家族之一&#xff0c;LLaMA 2作为其最新版本&#xff0c;展示了在语言理解和生成方面的显著进步。本文将详细解读LLaMA 2的基本原理、模型…...

MySQL 存储函数及调用

1.mysql 存储函数及调用 在MySQL中&#xff0c;存储函数&#xff08;Stored Function&#xff09;是一种在数据库中定义的特殊类型的函数&#xff0c;它可以从一个或多个参数返回一个值。存储函数在数据库层面上封装了复杂的SQL逻辑&#xff0c;使得在应用程序中调用时更加简单…...

设计模式七大原则-单一职责原则SingleResponsibility

七大原则是在设计“设计模式”的时候需要用到的原则&#xff0c;它们的存在是为了保证设计模式达到以下几种目的&#xff1a; 1.代码重用性 2.可读性 3.可拓展性 4.可靠性&#xff08;增加新的功能后&#xff0c;对原来的功能没有影响&#xff09; 5.使程序呈现高内聚、低耦合的…...

msfconsole利用Windows server2008cve-2019-0708漏洞入侵

一、环境搭建 Windows系列cve-2019-0708漏洞存在于Windows系统的Remote Desktop Services&#xff08;远程桌面服务&#xff09;&#xff08;端口3389&#xff09;中&#xff0c;未经身份验证的攻击者可以通过发送特殊构造的数据包触发漏洞&#xff0c;可能导致远程无需用户验…...

Reinforcement Learning学习(三)

前言 最近在学习Mujoco环境,学习了一些官方的Tutorials以及开源的Demo,对SB3库的强化学习标准库有了一定的了解,尝试搭建了自己的环境,基于UR5E机械臂,进行了一个避障的任务,同时尝试接入了图像大模型API,做了一些有趣的应用,参考资料如下: https://mujoco.readthedo…...

hw meta10 adb back up DCIM

1. centos install adb 2. HW enable devlepment mode & enalbe adb debug 3. add shell root/zt/adb-sync python3 ./adb-sync --reverse /sdcard/DCIM/Camera /root/zt/meta10...

Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)

上期链接&#xff1a;Unity2D游戏制作入门 | 11(之人物属性及伤害计算)-CSDN博客 上期我们聊到了人物的自身属性和受伤时的计算&#xff0c;我们先给人物和野猪挂上属性和攻击属性的代码&#xff0c;然后通过触发器触发受伤的事件。物体&#xff08;人物也好敌人也行&#xff…...

从河流到空气,BL340工控机助力全面环保监测网络构建

在环保监测领域&#xff0c;智能化、高效率的监测手段正逐步成为守护绿水青山的新常态。其中&#xff0c;ARMxy工业计算机BL340凭借其强大的处理能力、高度的灵活性以及广泛的兼容性&#xff0c;在水质监测站、空气质量检测、噪音污染监控等多个环保应用场景中脱颖而出&#xf…...

零拷贝技术

背景 磁盘可以说是计算机系统重最慢的硬件之一&#xff0c;读写速度相对内存10以上&#xff0c;所以针对优化磁盘的技术非常的多&#xff0c;比如&#xff1a;零拷贝、直接I/O、异步I/O等等&#xff0c;这些优化的目的就是为了提高系统的吞吐量&#xff0c;另外操作系统内核中的…...

Flutter_Android上架GooglePlay_问题

上架GooglePlay权限问题 问题描述 REQUEST_INSTALL_PACKAGES 权限问题解决方式 方式1 找到所有使用该权限的库修改删除该权限引用 方式2 打开项目 ~/andoird/app/src/main/AndroidMainfest.xml 添加文本<uses-permission android:name"android.permission.REQUES…...

【Java】解决Java报错:NumberFormatException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 字符串包含非数字字符2.2 空字符串或 null 字符串2.3 数值超出范围 3. 解决方案3.1 验证字符串格式3.2 使用异常处理3.3 处理空字符串和 null 4. 预防措施4.1 数据验证4.2 编写防御性代码4.3 单元测试 结语 引言 在Java编程中&a…...

建立网站赚钱 优帮云/深圳搜索引擎优化seo

有时候装系统或者修复电脑系统时需要用到pe系统&#xff0c;当在pe环境下要给文件进行压缩并加密时该怎么做呢?下面用7-zip(压缩解压工具)教大家在pe中给 压缩文件加密 的方法&#xff0c;我们一起来看看压缩文件如何加密吧。1、电脑插入u启动u盘启动盘&#xff0c;重启并快速…...

网站首页结构/linux网站入口

微信小程序可长按移动控件&#xff0c;供大家参考&#xff0c;具体内容如下–包含超出边界监测&#xff0c;性能不够理想【原因&#xff1a;setData在毫秒级刷新时会极大程度影响渲染性能】JavascriptPage({/*** 页面的初始数据*/data: {//浮动按钮坐标flow_y: 130,flow_x: 20,…...

做h5游戏的网站/怎么引流推广自己的产品

Microsoft Visual Studio Ultimate 2012 旗舰版 有效注册密钥&#xff1a;YKCW6-BPFPF-BT8C9-7DCTH-QXGWC&#xff1b;KCW6-BPFPF-BT8C9-7DCTH-QXGWC转载于:https://www.cnblogs.com/RogerLu/p/10070312.html...

上海专业网站建设哪家好/湖南关键词优化品牌价格

1 运行准备 (1)准备3台客户机&#xff08;关闭防火墙、设置静态IP和主机名称&#xff09; (2)安装JDK&#xff0c;配置环境变量 (3)安装Hadoop&#xff0c;配置环境变量 (4)配置集群 (5)单点启动 (6)配置ssh (7)群起并测试集群 2 编写集群分发脚本xsync 集群分发脚本 在/hom…...

免费域名网站黄的免费/直通车推广计划方案

本文转自公众号&#xff1a;caoz的梦呓&#xff0c;作者是互联网行业内资深人士&#xff0c;这里分享一篇他本人写的经验干货&#xff0c;希望能给大家带来点帮助。 在广告分析师群&#xff0c;起量是他们讨论最多的话题之一。 我们刚做游戏出海业务的时候&#xff0c;第一款产…...

网站建设优化安徽/现在比较好的营销平台

iPhone X 刘海机于9月13日发布&#xff0c;作为开发人员却多出来一份忧虑&#xff0c;iPhone X 怎么适配&#xff1f;先来看一下美团 App 的界面&#xff1a;1.首先简单定义一下IPoneX#define kIs_iPhoneX (ScreenWidth 375.f && ScreenHeight 812.f)//导航栏高度 #d…...