iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java线性表的顺序表示及实现方法
  • 193
分享到

Java线性表的顺序表示及实现方法

2023-07-02 15:07:02 193人浏览 安东尼
摘要

本篇内容介绍了“Java线性表的顺序表示及实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是顺序表?顺序表是在计算机内存中以数

本篇内容介绍了“Java线性表的顺序表示及实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、什么是顺序表?

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

二、顺序表的实现

在顺序表的定义中可以看到,顺序表是一组地址连续的存储单元,本质上是一种增加了一些基本操作功能的数组

在本文中要实现的功能有:

  • 获取顺序表中的元素个数

  • 获取顺序表当前的容量

  • 顺序表是否为空

  • 在指定索引位置添加元素

  • 在顺序表末尾添加元素

  • 在顺序表头部添加元素

  • 获取指定索引位置的元素

  • 获取顺序表第一个元素

  • 获取顺序表最后一个元素

  • 修改指定索引位置的元素

  • 判断顺序表中是否包含指定元素

  • 获取顺序表中指定元素的索引

  • 删除指定索引位置的元素

  • 删除并返回顺序表第一个元素

  • 删除并返回顺序表最后一个元素

  • 删除顺序表中的指定元素

  • 对顺序表进行动态的扩容和缩容

1. 准备工作

实现工具版本
IntelliJ idea2021.3
jdk1.8

在 IntelliJ IDEA 中新建普通的Java项目即可

Java线性表的顺序表示及实现方法

Java线性表的顺序表示及实现方法

 在新建好Java工程后,我们创建自己的顺序表类,在这里我对当前类命名为Array,在这里实现泛型,同时Array类中需要有两个成员属性:

  • 存放数据的数组data,类型为泛型数组

  • 当前顺序表中元素的数量size,类型为int

两个成员属性的访问权限都应该为private,用户不能够直接进行修改,只能通过对应的getter方法进行获取。 在成员属性中我们将存放数据的数组和顺序表中的元素数量只是进行了声明,但是并未进行初始化,因此==初始化的过程就需要在构造方法中进行==

  • 有参构造:在进行有参构造时,我们只需要指定传入的参数为一个int类型的数据capacity,代表顺序表的初始容量,因此对data进行初始化泛型数组即可。同时当前顺序表中是没有元素的,代表顺序表中的元素个数size的初始值为0。

  • 无参构造:在用户没有指定了顺序表的初始容量时我们可以自定义初始容量为10,仅需要通过this(10)进行有参构造的调用即可。

注意: 在Java中不能直接初始化泛型数组,需要先声明Object类型的数组后通过强制类型转换的方式将Object类型的数组转换为泛型数组

package net.csdn.array;public class Array<E> {private E[] data;        private int size;    public Array(int capacity) {        data = (E[]) new Object[capacity];        size = 0;    }        public Array() {        this(10);    }}

使用泛型的原因:使用泛型后可以将当前顺序表中存储对象,如果不使用泛型的话只能使用自己指定类型的数据,扩展性不强。因此使用泛型后可以将当前顺序表的使用扩展到所有类对象,只需要在创建时指定相应的对象即可。

2. 获取顺序表的元素个数

        public int getSize() {        return size;    }

对于获取当前顺序表中的元素个数来说,因为我们定义的初始成员变量size代表的含义就是当前顺序表的元素个数,但是size变量的本质为当前顺序表的指针,指向顺序表最后一个元素的下一个位置 (元素的索引从0开始,最后一个元素的索引值比元素个数值小 1),不能直接进行修改,因此要想获取需要通过size元素的getter方法

同样地,对于获取顺序表的元素个数只需要将size返回即可

3. 获取顺序表当前的容量

        public int getCapacity() {        return data.length;    }

在对顺序表进行声明的时候,就已经将用户传来的或者默认的初始容量capacity作为数组的大小对data泛型数组进行了初始化,因此当前datalength属性就是传来的capacity,(或者在后面进行动态扩容或缩容时,data.length是一直不会改变的,改变的只有size) 因此获取顺序表当前的容量将data.length返回即可

4. 顺序表是否为空

        public boolean isEmpty() {        return size == 0;    }

我们知道size代表的是顺序表中的元素个数,因此要判断当前顺序表是否为空仅需要将size是否等于0进行返回即可

5. 在指定索引位置添加元素

        public void add(int index, E e) {        // 判断数组空间是否已满        if (size == data.length) {            // 对数组进行扩容            resize(2 * data.length);        }        // 越界判断        if (index < 0 || index > size) {            throw new ArrayIndexOutOfBoundsException();        }        for (int i = size - 1; i >= index; i--) {            data[i + 1] = data[i];        }        data[index] = e;        size++;    }

当向顺序表中指定索引位置添加元素时要考虑以下几个问题:

  • 当前顺序表中是否还有容量?

  • 添加的元素索引值是否越界?

对于第一个问题来说,当顺序表已满没有容量时,再进行添加元素时需要进行动态的扩容,resize方法的作用就是对数组进行动态的扩容以及缩容,对于resize方法的实现我们放到后面进行具体的讲解,在这里我们知道如果当前顺序表容量已满,将顺序表容量扩大为当前顺序表容量的二倍

第二个问题的出现情况只有两种,索引小于0或索引超过了当前顺序表中的元素个数时,抛出运行时异常即可

在索引没有问题后,添加元素的过程如下图所示: 

Java线性表的顺序表示及实现方法

 要先将要添加的索引位置后的所有元素依次向后移动一位,在移动完成后将当前索引位置的元素使用要进行添加的元素对当前位置的元素进行覆盖即可,同时添加完元素后将size++,维护指针变量

6. 在顺序表末尾添加元素

        public void addLast(E e) {        add(size, e);    }

在末尾添加元素可以对之前写好的向指定索引位置添加元素的代码进行复用,同时在add方法中进行了校验,因此对于扩容以及索引都问题都无需我们进行考虑,将 索引位置的参数赋值为当前最后一个元素的下一个位置size 后直接调用即可。

7. 在顺序表头部添加元素

        public void addFirst(E e) {        add(0, e);    }

在顺序表的头部添加元素也是同样的道理,对指定索引位置插入元素进行复用即可,在此不进行赘述。

8. 获取指定索引位置的元素

        public E get(int index) {        if (index < 0 || index >= size) {            throw new ArrayIndexOutOfBoundsException();        }        return data[index];    }

获取指定索引位置的元素与之前在指定索引位置插入元素的思路大体一致,但是要更简单一些,无需考虑顺序表扩容以及缩容的问题,仅需要考虑传入的索引值是否合法,如果传入的索引值合法则直接将对应位置的元素进行返回即可。

9. 获取顺序表第一个元素

        public E getFirst() {        return get(0);    }

在实现了获取指定索引位置的元素后,获取顺序表的第一个元素同样是对get方法的复用,将0做为索引值进行参数传递即可。

10. 获取顺序表最后一个元素

        public E getLast() {        return get(size - 1);    }

获取顺序表最后一个元素也是对get方法的复用,在此不进行赘述

11. 修改指定索引位置的元素

        public void set(int index, E e) {        if (index < 0 || index >= size) {            throw new ArrayIndexOutOfBoundsException();        }        data[index] = e;    }

在之前获取指定索引位置的元素时,先判断索引是否合法,如果合法将对应位置的元素进行返回。同理,先判断索引位置是否合法,如果合法就将当前位置的元素使用我们接收到的元素e进行替换。

12. 判断顺序表中是否包含指定元素

        public boolean contains(E e) {        for (int i = 0; i < size; i++) {            if (data[i].equals(e)) {                return true;            }        }        return false;    }

对于判断顺序表中是否存在指定元素来说,对顺序表进行线性查找,如果找到了相应的数据,就返回true,如果在对顺序表遍历结束后仍然没有找到指定元素,说明当前顺序表中不存在指定元素,返回false

注意:在这里因为是对象的比较,使用equals方法进行比较,如果是基本数据类型(如intdouble等)的比较就要使用==来进行比较

13. 获取顺序表中指定元素的索引

        public int find(E e) {        for (int i = 0; i < size; i++) {            if (data[i].equals(e)) {                return i;            }        }        return -1;    }

获取指定元素的索引同样使用线性查找法,使用equals进行比较,如果找到相同的元素则返回对应的索引值,如果遍历完顺序表后仍然没有找到指定元素则返回-1,说明当前元素不存在。

14. 删除指定索引位置的元素

        public E remove(int index) {        if (index < 0 || index >= size) {            throw new ArrayIndexOutOfBoundsException();        }        // 先将返回值进行存储        E res = data[index];        for (int i = index + 1; i < size; i++) {            data[i - 1] = data[i];        }        size--;        data[size] = null;        // 如果当前数组中的元素不足数组容量的一半        if (size < data.length / 2) {            // 重新分配空间            resize(data.length / 2);        }        return res;    }

在之前进行元素的添加时要考虑顺序表是否还有容量,在删除元素时不需要考虑是否还有容量,但是也要考虑相应的有关于数组缩容问题。因此要考虑以下问题:

  • 删除当前元素后,顺序表中的元素个数是否不足数组容量的一半

  • 删除指定索引的元素时,传来的索引值是否合法

对于第一个问题的解决方法为在删除元素后,对当前顺序表的元素个数与数组的容量的一半进行比较,如果发现当前元素个数小于数组容量的一半时,我们可以继续调用resize方法重新分配数组的容量(resize方法在之后会详细解释),当前的实现结果就是将数组的容量缩容至原数组都一半,对于内存的节省来说更有好处。

第二个问题解决方式与之前处理一样,查看索引值是否小于0以及是否大于等于当前顺序表都元素个数

删除元素的本质也是将当前索引值的后一个元素开始,依次向前移动,覆盖掉前一个元素,最后再将size--,维护指针,删除结束后将临时存储的被删除的元素返回即可。

删除元素过程如下图所示: 

Java线性表的顺序表示及实现方法

注意:顺序表的删除本质上是用后一个元素将前一个元素依次覆盖,移动了size指针后此时指针指向的元素仍然为原本顺序表中的最后一个元素,因为在用户的实际操作中,size指向的元素无法被访问到,所以并没有什么影响。但是我们在这里使用了泛型,在Java的GC(垃圾回收机制)中因为此时顺序表的最后一个元素仍然被size指向引用,无法被回收,因此在这里手动执行data[size] = null;将当前的引用回收。

15. 删除并返回顺序表第一个元素

        public E removeFirst() {        return remove(0);    }

与之前的思路一致,在有了删除指定索引位置的元素方法后,删除并返回顺序表第一个元素也是对刚才实现的remove方法进行复用,在此不做赘述。

16. 删除并返回顺序表最后一个元素

        public E removeLast() {        return  remove(size - 1);    }

删除顺序表中最后一个元素同样是对remove方法的复用,在此也不多做赘述。

17. 删除顺序表中的指定元素

        public boolean removeElement(E e) {       int index = find(e);       if (index == -1) {           return false;       }       remove(index);       return true;    }

删除顺序表中指定的元素本质上是对之前实现的获取顺序表中指定元素的索引方法和删除指定索引位置元素方法的复用,首先通过find方法获取到要删除元素的索引,接着对索引进行判断,查看当前元素是否存在,如果当前元素存在则将获取到的索引值作为remove方法的参数传递,将当前索引位置的元素删除即可。

18. 对顺序表进行动态的扩容和缩容

        private void resize(int newCapacity) {        E[] newData = (E[]) new Object[newCapacity];        for (int i = 0; i < size; i++) {            newData[i] = data[i];        }        data = newData;    }

在之前向顺序表中添加元素以及删除顺序表中的元素都涉及到了扩容以及缩容的过程,其实对于扩容以及缩容来说区别只体现在了传递来的参数与原数组容量大小的差别,扩容与缩容的思路都是声明一个新的数组,初始容量的大小为传递来的参数,接着遍历原来的数组,将每一个元素依次填充到新的数组中,之后再将data对象的引用指向新的数组newData即可。

三、运行结果

在进行结果测试前,为了方便于观察,在这里我重写了Array类的toString方法

@Override    public String toString() {        StringBuilder builder = new StringBuilder();        builder.append(String.fORMat("Array: size = %d, capacity = %d\n", size, data.length));        builder.append("[");        for (int i = 0; i < size; i++) {            builder.append(data[i]);            if (i != size - 1) {                builder.append(", ");            }        }        builder.append("]");        return builder.toString();    }

Java线性表的顺序表示及实现方法

Java线性表的顺序表示及实现方法

四、总结

以上便是Java语言对线性表的顺序表示和实现,和以前使用C语言来写顺序表最大的感受就是曾经觉得很难写、很费脑的代码再次实现时感觉变得很容易了,同时对于很多的方法也有了复用的思想,对线性表的理解更加深刻。高兴于自己成长的同时也更加深刻意识到以后的路会更加的艰难,希望自己可以在未来的道路上戒骄戒躁、稳扎稳打,哪怕再困难,也不会放弃!

源码

以下是源代码

1. Array类源代码

package net.csdn.array;public class Array<E> {    private E[] data;        private int size;        public Array(int capacity) {        data = (E[]) new Object[capacity];        size = 0;    }        public Array() {        this(10);    }        public int getSize() {        return size;    }        public int getCapacity() {        return data.length;    }        public boolean isEmpty() {        return size == 0;    }        public void addLast(E e) {        add(size, e);    }        public void addFirst(E e) {        add(0, e);    }        public void add(int index, E e) {        // 判断数组空间是否已满        if (size == data.length) {            // 对数组进行扩容            resize(2 * data.length);        }        // 越界判断        if (index < 0 || index > size) {            throw new ArrayIndexOutOfBoundsException();        }        for (int i = size - 1; i >= index; i--) {            data[i + 1] = data[i];        }        data[index] = e;        size++;    }        public E get(int index) {        if (index < 0 || index >= size) {            throw new ArrayIndexOutOfBoundsException();        }        return data[index];    }        public E getFirst() {        return get(0);    }        public E getLast() {        return get(size - 1);    }        public void set(int index, E e) {        if (index < 0 || index >= size) {            throw new ArrayIndexOutOfBoundsException();        }        data[index] = e;    }        public boolean contains(E e) {        for (int i = 0; i < size; i++) {            if (data[i].equals(e)) {                return true;            }        }        return false;    }        public int find(E e) {        for (int i = 0; i < size; i++) {            if (data[i].equals(e)) {                return i;            }        }        return -1;    }        public E remove(int index) {        if (index < 0 || index >= size) {            throw new ArrayIndexOutOfBoundsException();        }        // 先将返回值进行存储        E res = data[index];        for (int i = index + 1; i < size; i++) {            data[i - 1] = data[i];        }        size--;        data[size] = null;        // 如果当前数组中的元素不足数组容量的一半        if (size < data.length / 2) {            // 重新分配空间            resize(data.length / 2);        }        return res;    }        public E removeFirst() {        return remove(0);    }        public E removeLast() {        return  remove(size - 1);    }        public boolean removeElement(E e) {       int index = find(e);       if (index == -1) {           return false;       }       remove(index);       return true;    }    @Override    public String toString() {        StringBuilder builder = new StringBuilder();        builder.append(String.format("Array: size = %d, capacity = %d\n", size, data.length));        builder.append("[");        for (int i = 0; i < size; i++) {            builder.append(data[i]);            if (i != size - 1) {                builder.append(", ");            }        }        builder.append("]");        return builder.toString();    }        private void resize(int newCapacity) {        E[] newData = (E[]) new Object[newCapacity];        for (int i = 0; i < size; i++) {            newData[i] = data[i];        }        data = newData;    }}

2. 测试类源代码

package net.csdn.array;public class ArrayMain {    public static void main(String[] args) {        System.out.println("声明新的顺序表,初始容量为10:");        Array<Integer> array = new Array<>(10);        for (int i = 0; i < 10; i++) {            array.addLast(i);        }        System.out.println(array + "\n");        System.out.println("向索引为 1 的位置添加元素 100:");        array.add(1, 100);        System.out.println(array + "\n");        System.out.println("在顺序表的头部添加 -1:");        array.addFirst(-1);        System.out.println(array + "\n");        System.out.println("在顺序表的尾部添加 101:");        array.addLast(101);        System.out.println(array + "\n");        System.out.println("移除索引位置为 2 的元素:");        array.remove(2);        System.out.println(array + "\n");        System.out.println("移除顺序表中的元素 4:");        array.removeElement(4);        System.out.println(array + "\n");        System.out.println("移除顺序表中的第一个元素:");        array.removeFirst();        System.out.println(array + "\n");        System.out.println("移除顺序表中的最后一个元素:");        array.removeLast();        System.out.println(array + "\n");        System.out.println("元素7的索引位置为:" + array.find(7));        System.out.println("数组中是否包含元素4:" + array.contains(4));    }}

“Java线性表的顺序表示及实现方法”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Java线性表的顺序表示及实现方法

本文链接: https://www.lsjlt.com/news/342612.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java线性表的顺序表示及实现方法
    本篇内容介绍了“Java线性表的顺序表示及实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是顺序表?顺序表是在计算机内存中以数...
    99+
    2023-07-02
  • Java线性表的顺序表示及实现
    目录前言一、什么是顺序表?二、顺序表的实现1. 准备工作2. 获取顺序表的元素个数3. 获取顺序表当前的容量4. 顺序表是否为空5. 在指定索引位置添加元素6. 在顺序表末尾添加元素...
    99+
    2022-11-13
  • C语言线性表顺序表示及实现
    目录准备工作实现线性表线性表的动态分配顺序存储结构构造一个空的线性表对线性表进行赋值对线性表进行销毁对线性表进行重置判断线性表是否为空获取线性表的长度获取线性表某一位置对应的元素在线...
    99+
    2022-11-13
  • C/C++实现线性顺序表的示例代码
    目录线性顺序表简介C语言实现代码C++语言实现代码线性顺序表简介 使用顺序存储结构的线性存储结构的表为线性顺序表,线性存储结构是元素逻辑结构一对一,顺序存储结构是元素物理结构连续,线...
    99+
    2022-11-13
  • C语言线性表链式表示及实现的方法
    今天小编给大家分享一下C语言线性表链式表示及实现的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言线性表的顺序表示指的...
    99+
    2023-07-02
  • C语言线性表中顺序表的示例分析
    小编给大家分享一下C语言线性表中顺序表的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、本章重点线性表和顺序表的概念动态和静态顺序表接口实现在线0j训练...
    99+
    2023-06-29
  • C语言线性顺序表如何实现
    这篇“C语言线性顺序表如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言线性顺序表如何实现”文章吧。线性表是最常用...
    99+
    2023-07-02
  • C++如何实现线性表顺序存储
    本篇内容介绍了“C++如何实现线性表顺序存储”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!顺序表的特点:需要一片连续的存储空间 逻...
    99+
    2023-07-05
  • Java实现顺序表的操作
    本文实例为大家分享了Java实现顺序表的基本操作,供大家参考,具体内容如下 静态顺序表:使用定长数组存储。动态顺序表:使用动态开辟的数组存储。 接口 package com.gith...
    99+
    2022-11-13
  • Java中ArrayList与顺序表的定义与实现方法
    目录1、线性表定义特征2、顺序表定义实现打印数组新增元素判断是否包含某个元素查找元素获取pos位置的元素更改pos位置的值删除操作获取顺序表长度清空顺序表3、ArrayList简介:...
    99+
    2022-11-13
  • Java实现顺序表的操作详解
    目录一、顺序表是什么二、自定义异常空引用异常下标越界异常三、顺序表的方法顺序表的实现获取顺序表长度顺序表是否为空顺序表是否为满打印顺序表末尾新增元素指定位置新增元素判断是否包含某元素...
    99+
    2022-11-13
  • C语言线性表的链式表示及实现详解
    目录前言代码实现1. 单链表的结点构造2. 构造一个空的头结点3. 对线性表进行赋值4.对线性表进行销毁5.对线性表进行重置6.判断线性表是否为空7.获取线性表的长度8.获取线性表某...
    99+
    2022-11-13
  • 浅谈线性表的原理及简单实现方法
    一、线性表原理:零个或多个同类数据元素的有限序列原理图:特点 :有序性有限性同类型元素第一个元素无前驱,最后一个元素无后继,中间的元素有一个前驱并且有一个后继线性表是一种逻辑上的数据结构,在物理上一般有两种实现 顺序实现和链表实现二、基于数...
    99+
    2023-05-31
    线性表
  • Java数据结构之顺序表的实现
    目录前言一、顺序表1.1 什么是顺序表二、简单实现顺序表2.1 创建顺序表2.2 打印顺序表2.3 获取顺序表长度2.4 在 pos 位置新增元素2.5 判定是否包含某个元素2.6 ...
    99+
    2022-11-13
  • Java实现顺序表的增删查改功能
    创建顺序表 在java语言中要实现顺序表,首先创建一个类,因为顺序表本身就像数组,所以我们这里定义一个int类型的数组和usedata为有效数据,构造方法里先申请可以存放10个数据的...
    99+
    2022-11-12
  • Java实现一个顺序表的完整代码
    实现一个顺序表 接口实现 定义一个MyArrayList类,在类中实现以下函数 public class MyArrayList { } 数组的定义 public ...
    99+
    2022-11-12
  • 如何使用Java实现顺序表的操作
    小编给大家分享一下如何使用Java实现顺序表的操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下静态顺序表:使用定长数组存储。动态顺序表:使用动态开辟...
    99+
    2023-06-28
  • C语言实现动态顺序表的示例代码
    目录顺序表概念及结构基本操作功能实现程序运行顺序表概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。 分...
    99+
    2022-11-13
    C语言 动态顺序表 C语言 顺序表
  • Java有序链表的合并实现方法
    目录问题思路版本一版本二答案版本一版本二问题 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4...
    99+
    2023-05-15
    Java有序链表合并 Java有序链表
  • Java编程实现汉字按字母顺序排序的方法示例
    本文实例讲述了Java编程实现汉字按字母顺序排序的方法。分享给大家供大家参考,具体如下:String[] str0 = new String[]{"abd","ervcd","sdfc","abdc","sded","生活","文教","政...
    99+
    2023-05-31
    java 汉字 字母
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作