zoukankan      html  css  js  c++  java
  • 第07章 集合

      1 /*****************
      2 ***第七章 集合
      3 *******知识点:
      4 **************1.Collection和Iterator接口
      5 ******************1.1 Collection接口简介
      6 ******************1.2 Iterator接口简介
      7 ******************1.3 Map接口简介
      8 **************2.Set接口
      9 ******************2.1 HashSet类
     10 ******************2.2 TreeSet类
     11 ******************2.3 EnumSet类
     12 **************3.List接口
     13 ******************3.1 ArrayList类
     14 ******************3.2 LinkedList类
     15 ******************3.3 Vector类
     16 ******************3.4 Stack类
     17 **************4.Queue接口
     18 ******************4.1 PriorityQueue类
     19 **************5.Map接口
     20 ******************5.1 HashMap类
     21 ******************5.2 Hashtable类
     22 ******************5.3 SortedMap接口
     23 ******************5.4 TreeMap类
     24 ******************5.5 WeakHashMap类
     25 ******************5.6 IdentityHashMap类
     26 ******************5.7 EnumMap类
     27 **************6.集合操作工具类
     28 ******************6.1 排序操作
     29 ******************6.2 查找,替换操作
     30 ******************6.3 同步控制
     31 ******************6.4 总结
     32 */
     33 import java.util.*;
     34 
     35 /*
     36 *  演示需用类
     37 */
     38 class Person implements Comparable{
     39     private int id;
     40     private String name;
     41     Person(){
     42         this.id = 0;
     43         this.name = "无名氏";
     44     }
     45     
     46     Person(int id, String name){
     47         this.id = id;
     48         this.name = name;
     49     }
     50     
     51     public String toString(){
     52         return "id:" + id + ",name:" +name;
     53     }
     54     
     55     //重写接口中的方法  用于比较
     56     public int compareTo(Object o){
     57         Person p = (Person) o;
     58         int result = id < p.id ? 1 : (id == p.id ? 0 : -1); //降序
     59         //int result = id > p.id ? 1 : (id == p.id ? 0 : -1); //降序
     60         if(result == 0){
     61             result =  name.compareTo(p.name);//注意区别:这里调用String的compareTo方法
     62         }
     63         return result;
     64     }
     65 }
     66 
     67 /*
     68 *  演示枚举类
     69 */
     70 enum MyEnum{
     71     BLACK,WIHTE,RED,BLUE,GREEN
     72 }
     73 
     74 public class test7{
     75     public static void main(String[] args){
     76         showDemo("1.Collection和Iterator接口");
     77         demoCollectionAndIterator(); //1.Collection和Iterator接口
     78         
     79         showDemo("2.Set接口");
     80         demoSet(); //2.Set接口
     81         
     82         showDemo("3.List接口");
     83         demoList(); //3.List接口
     84         
     85         showDemo("4.Queue接口");
     86         demoQueue(); //4.Queue接口
     87         
     88         showDemo("5.Map接口");
     89         demoMap(); //5.Map接口
     90         
     91         showDemo("6.集合操作工具类");
     92         demoTools(); //6.集合操作工具类
     93     }
     94     
     95     /**1.Collection和Iterator接口**/
     96     public static void demoCollectionAndIterator(){
     97         /**1.1 Collection接口简介**/
     98         //Collection接口是集合父接口之一  实现子接口有 Set接口、List接口
     99         //其中Set接口:不能包含重复的元素
    100         //List接口:一个有序的集合
    101         
    102         /**1.2 Iterator接口简介**/
    103         //Iterator接口是迭代器
    104         //用于遍历集合中的元素
    105         
    106         /**1.3 Map接口简介**/
    107         //Map接口是集合父接口之一   实现子类有SortMap、HashMap
    108         //包含了key-value  俗称键值对 其中  key不能重复
    109     }
    110     
    111     /**2.Set接口**/
    112     public static void demoSet(){
    113         //Set接口:不能包含重复的元素、允许包含值为null的元素但只能有一个
    114         
    115         /**2.1 HashSet类**/
    116         //HashSet类按照哈希算法来存取集合中的对象,存取速度比较快
    117         System.out.println("演示HashSet类=======");
    118         HashSet h_HashSet = new HashSet();
    119         Person p1 = new Person();
    120         h_HashSet.add("1");//字符串
    121         h_HashSet.add('2');//字符
    122         h_HashSet.add(3);//整型
    123         h_HashSet.add(true);//布尔型
    124         h_HashSet.add(1.0);
    125         h_HashSet.add(new Integer(3));//不会被添加  因为重复了
    126         h_HashSet.add(p1);//对象
    127         System.out.println("集合长度为:" + h_HashSet.size());//获取集合长度
    128         
    129         Iterator i_Iterator = h_HashSet.iterator();//得到遍历的迭代器
    130         while(i_Iterator.hasNext()){
    131             Object o = (Object)(i_Iterator.next());//通过迭代器返回元素  注意返回为Object类型
    132             System.out.println("集合元素:" + o);//需注意如果是自定义的类型  需要重写toString方法
    133         }
    134         
    135         System.out.println("判断集合是否为空:" + h_HashSet.isEmpty());//判断集合是否为空
    136         h_HashSet.remove(3);//删除元素
    137         h_HashSet.remove((float)1.0);//不能删除元素  类型不匹配
    138         
    139         System.out.println("集合长度为:" + h_HashSet.size());//获取集合长度
    140         i_Iterator  = h_HashSet.iterator();
    141         while(i_Iterator.hasNext()){
    142             Object o = (Object)(i_Iterator.next());//通过迭代器返回元素  注意返回为Object类型
    143             System.out.println("集合元素:" + o);
    144         }
    145         
    146         System.out.println(h_HashSet);//将集合打印出来
    147         
    148         /**2.2 TreeSet类**/
    149         //TreeSet类是一个有序集合,元素将按照升序排列,缺省是按照自然排序进行排列。
    150         //所以该集合中的元素要实现Comparable接口或者有一个自定义的比较器
    151         //另外集合中的元素存储顺序跟加入的顺序无关
    152         System.out.println("演示TreeSet类=======");
    153         TreeSet t_TreeSet1 = new TreeSet();
    154         t_TreeSet1.add("aaaa");
    155         t_TreeSet1.add("ccc");
    156         t_TreeSet1.add("ac");
    157         t_TreeSet1.add("bc");
    158         Iterator i_Iterator_TreeSet = t_TreeSet1.iterator();
    159         while(i_Iterator_TreeSet.hasNext()){
    160             Object o =  i_Iterator_TreeSet.next();
    161             System.out.println("集合对象:" + o);//注意输出结果跟加入顺利对比  发现无关
    162         }
    163         
    164         System.out.println("集合中第一个对象:" + (Object)t_TreeSet1.first());//返回第一个元素
    165         System.out.println("集合中第一个对象:" + (Object)t_TreeSet1.last());//返回最后一个元素
    166         
    167         System.out.println("返回不小于acd的集合对象:" + (Object)t_TreeSet1.ceiling("acd"));
    168         //返回一个不小于acd的集合元素(非随机 就是一个且最接近的一个)
    169         
    170         Person p1_TreeSet = new Person();
    171         Person p2_TreeSet = new Person(0,"aaa");
    172         Person p3_TreeSet = new Person(1,"aaa");
    173         
    174         TreeSet t_TreeSet2 = new TreeSet();
    175         t_TreeSet2.add(p1_TreeSet);
    176         t_TreeSet2.add(p2_TreeSet);
    177         t_TreeSet2.add(p3_TreeSet);
    178         
    179         System.out.println("集合中所有对象:" + t_TreeSet2);
    180         
    181         
    182         /**2.3 EnumSet类**/
    183         //这个类是1.5开始有的
    184         //目前个人使用量几乎为零,很少使用
    185         //其使用方式和普通的Set没有区别,只是构造方法有一些特殊的而已
    186         //多种添加集合元素方式
    187         System.out.println("演示EnumSet类=======");
    188         
    189         //第一种创建一个指定类型的空集合 然后再添加元素
    190         EnumSet<MyEnum> e_EnumSet1 = EnumSet.noneOf(MyEnum.class);
    191         e_EnumSet1.add(MyEnum.BLACK);
    192         e_EnumSet1.add(MyEnum.RED);
    193         e_EnumSet1.add(MyEnum.BLUE);
    194         System.out.println("e_EnumSet集合中的对象:" + e_EnumSet1);
    195         
    196         //第二种创建一个指定类型的所有数据集合
    197         EnumSet<MyEnum> e_EnumSet2 = EnumSet.allOf(MyEnum.class);
    198         System.out.println("e_EnumSet集合中的对象:" + e_EnumSet2);
    199         
    200         //第三种创建一个指定类型的指定初始化数据的集合
    201         EnumSet<MyEnum> e_EnumSet3 = EnumSet.of(MyEnum.WIHTE,MyEnum.GREEN);
    202         System.out.println("e_EnumSet集合中的对象:" + e_EnumSet3);
    203         
    204         //第四种创建一个指定类型的指定数据范围的集合
    205         EnumSet<MyEnum> e_EnumSet4 = EnumSet.range(MyEnum.WIHTE,MyEnum.BLUE);//从WIHTE到BLUE 的所有元素
    206         System.out.println("e_EnumSet集合中的对象:" + e_EnumSet4);
    207         
    208         
    209         //总结:
    210         // 1.HashSet 速度快  且使用居多
    211         // 2.TreeSet 自动实现排序(需要为元素实现比较器) 
    212         // 3.EnumSet  枚举   然并卵  
    213         // 最后对时间效率有要求使用  HashSet   对排序有要求使用  TreeSet  EnumSet(忘了它吧)
    214     }
    215     
    216     /**3.List接口**/
    217     public static void demoList(){
    218         //List接口:一个有序的集合 对插入的顺序有序
    219         
    220         /**3.1 ArrayList类**/
    221         //1.基于数组实现的List类
    222         //2.查找和定位操作快
    223         //3.添加和删除操作慢
    224         //4.线程不安全
    225         System.out.println("演示ArrayList类=======");
    226         ArrayList a_ArrayList = new ArrayList();//默认10个长度  后面可以动态加载
    227         for(int i = 0; i < 10; i++){
    228             a_ArrayList.add(i); //加载元素
    229         }
    230         
    231         //使用foreach遍历集合
    232         for(Object j :a_ArrayList){
    233             System.out.println("元素:" + j);
    234         }
    235         
    236         //使用get方法遍历    
    237         for(int i= 0 ;i < 10 ; i++){
    238             System.out.println("元素:" + a_ArrayList.get(i));
    239         }    
    240         //推荐使用后者遍历    
    241         System.out.println(a_ArrayList);//将所有元素打印出来
    242         //更多方法使用详见API
    243         
    244         
    245         /**3.2 LinkedList类**/
    246         //1.基于链表实现的List类
    247         //2.查找和定位操作慢
    248         //3.添加和删除操作快
    249         //4.线程不安全
    250         //使用跟ArrayList相似  具体使用时查看API即可   需注意实现的方式采用的是链表
    251         System.out.println("演示LinkedList类=======");
    252         
    253         /**3.3 Vector类**/
    254         //1.基于数组实现的List类
    255         //2.线程安全
    256         //3.已经被ArrayList类取代得差不多了
    257         //使用跟ArrayList相似  具体使用时查看API即可  一般不会使用 毕竟ArrayList几乎可以取代它了无论是从执行效率还是功能上
    258         System.out.println("演示Vector类=======");
    259         
    260         /**3.3 Stack类**/
    261         //1.Vector类的子类
    262         //2.实现模拟栈操作
    263         System.out.println("演示Stack类=======");
    264         Stack s_Stack = new Stack();
    265         System.out.println("是否为空栈:" + s_Stack.isEmpty());
    266         for(int i = 0 ;i < 10; i++){
    267             s_Stack.push("元素" + i);//入栈
    268         }
    269         System.out.println("栈元素有:" + s_Stack);
    270         String str_Stack = "元素3";
    271         System.out.println("元素3在第:" + (s_Stack.search((Object) str_Stack)) + "位上");//返回在堆栈中的位置  以1开始
    272         
    273         System.out.println("栈顶元素是:" + s_Stack.peek());
    274         
    275         //删除前先判断是否为空栈
    276         if(!s_Stack.isEmpty()){
    277             System.out.println("移除栈顶元素是:" + s_Stack.pop());
    278         }
    279         System.out.println("栈元素有:" + s_Stack);
    280         
    281         //总结:
    282         //1.如果需要遍历List集合元素,对应ArrayList、Vector集合,则应该使用随机访问方法(get)来遍历集合元素,
    283         //  这样性能更好。对应LinkedList集合,则应采用迭代器(Iterator)来遍历集合元素。
    284         //2.如果需要经常执行插入、删除操作来改变集合大小,则应该使用LinkedList集合,而不是ArrayList
    285         //3.如果需要查询和定位操作比较频繁时,则应该使用ArrayList集合,而不是LinkedList
    286         //4.如果多条线程需要同时访问List集合中的元素,可以考虑使用Vector这个同步实现。
    287         //  或者使用ArrayList然后再手动设置加锁(推荐后者)
    288     }
    289     
    290     /**4.Queue接口**/
    291     public static void demoQueue(){
    292         //Queue接口:优先队列集合
    293         //本质上就是一个最小堆
    294         //很少用到  了解即可
    295         
    296         /**4.1 PriorityQueue类**/
    297     }
    298     
    299     /**5.Map接口**/
    300     public static void demoMap(){
    301         //Map接口:实现键值对的接口
    302         
    303         /**5.1 HashMap类**/
    304         System.out.println("演示HashMap类=======");
    305         //不同步,故线程不安全
    306         //一键值 (键不同时,值可以相同  但键不能相同 可以为null)
    307          // 初始化随机种子
    308         Random r = new Random();
    309         // 新建HashMap
    310         HashMap map_HashMap = new HashMap();
    311         // 添加操作
    312         map_HashMap.put("one", r.nextInt(10));
    313         map_HashMap.put("two", r.nextInt(10));
    314         map_HashMap.put("two", r.nextInt(10));//不会被添加因为存在该键了
    315         map_HashMap.put(null, null);//可以为空
    316         map_HashMap.put("two1", r.nextInt(10));
    317         map_HashMap.put("three", r.nextInt(10));
    318         // 打印出map
    319         System.out.println("map_HashMap:"+map_HashMap );
    320         
    321         // 通过entrySet-Iterator遍历key-value
    322         System.out.println("通过entrySet-Iterator遍历key-value");
    323         Iterator iter_HashMap1 = map_HashMap.entrySet().iterator();
    324         while(iter_HashMap1.hasNext()) {
    325             Map.Entry entry = (Map.Entry)iter_HashMap1.next();
    326             System.out.println("next : "+ entry.getKey() +" - "+entry.getValue());
    327         }
    328         
    329         //通过keyset - Iterator遍历key-value
    330         System.out.println("通过keyset - Iterator遍历key-value");
    331         Iterator iter_HashMap2 = map_HashMap.keySet().iterator();
    332         while (iter_HashMap2.hasNext()){
    333             Object key = iter_HashMap2.next();
    334             Object val = map_HashMap.get(key);
    335             System.out.println("next : "+ key +" - "+ val);
    336         }        
    337         // HashMap的键值对个数        
    338         System.out.println("size:"+map_HashMap.size());
    339         // containsKey(Object key) :是否包含键key
    340         System.out.println("contains key two : "+map_HashMap.containsKey("two"));
    341         System.out.println("contains key five : "+map_HashMap.containsKey("five"));
    342         // containsValue(Object value) :是否包含值value
    343         System.out.println("contains value 0 : "+map_HashMap.containsValue(new Integer(0)));
    344         // remove(Object key) : 删除键key对应的键值对
    345         map_HashMap.remove("three");
    346         System.out.println("map:"+map_HashMap );
    347         // clear() : 清空HashMap
    348         map_HashMap.clear();
    349         // isEmpty() : HashMap是否为空
    350         System.out.println((map_HashMap.isEmpty()?"map_HashMap is empty":"map_HashMap is not empty") );
    351         
    352         
    353         //两种遍历方式  推荐entrySet-Iterator这种方法  效率要高点
    354         //对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。
    355         //而entryset只是遍历了1次,他把key和value都放到了entry中,所以就快了。
    356         
    357         /**5.2 Hashtable类**/
    358         //用法跟HashMap 差不多
    359         //区别:
    360         //1.Hashtable 是同步的 即线程安全 在多线程下可以直接使用  而HashMap则要手动设置同步
    361         //2.Hashtable 不管key  或者value 均不允许出现null
    362         //3.继承不同   Hashtable ——Dictionary    而HashMap——AbstractMap 
    363         //4.初始化大小和扩容方式不同
    364         //5.历史遗留问题导致Hashtable 还使用Enumeration方式遍历元素
    365         //最后推荐使用HashMap
    366         
    367         /**5.3 SortedMap接口**/
    368         // 保证按照键的升序排列的映射,可以按照键的自然顺序(参见 Comparable 接口)进行排序, 
    369         //或者通过创建有序映射时提供的比较器进行排序
    370         //所以所有的键必须是可以比较的
    371         
    372         /**5.4 TreeMap类**/
    373         //TreeMap是SortedMap接口的基于红黑树的实现
    374         //此类保证了映射按照升序顺序排列关键字, 根据使用的构造方法不同,可能会按照键的类的自然顺序进行排序
    375         //注意1:此实现不是同步的。不是线程安全的。
    376         //注意2:TreeMap是用键来进行升序顺序来排序的。通过Comparable 或 Comparator来排序。
    377         //注意3:由所有此类的“collection 视图方法”所返回的迭代器都是快速失败的。
    378         //注意4:和HashMap一样,如果插入重复的元素,后面的元素会覆盖前面的。
    379         //注意5: 键不可以为null,但是值可以为null
    380         System.out.println("演示TreeMap类=======");
    381         Random r_TreeMap = new Random();
    382         TreeMap t_TreeMap = new TreeMap();
    383         Person p_TreeMap1 = new Person();
    384         Person p_TreeMap2 = new Person(1,"aaaa");
    385         Person p_TreeMap3 = new Person(2,"aaaa");
    386         Person p_TreeMap4 = new Person(0,"aaaa");
    387         t_TreeMap.put(r_TreeMap.nextInt(10),p_TreeMap1);
    388         t_TreeMap.put(r_TreeMap.nextInt(10),p_TreeMap2);
    389         t_TreeMap.put(r_TreeMap.nextInt(10),p_TreeMap3);
    390         t_TreeMap.put(r_TreeMap.nextInt(10),p_TreeMap4);
    391         t_TreeMap.put(r_TreeMap.nextInt(10),null); //键不可以为null 值可以
    392         System.out.println("集合中元素有:" + t_TreeMap);
    393         
    394         for(Object o:t_TreeMap.values()){
    395             System.out.println("元素值:" + o);
    396         }
    397         //判断是否存在键
    398         System.out.println("是否包含键值为3的键:" + t_TreeMap.containsKey(new Integer(3)));
    399         
    400         //判断是否存在值
    401         System.out.println("是否包含p_TreeMap1对象:" + t_TreeMap.containsValue((Object)p_TreeMap1));//是否存在p_TreeMap1
    402         System.out.println("是否包含:" + t_TreeMap.containsValue(new Person()));//重新new对象跟原有对象不一样
    403         
    404         //判断是否存在值
    405         System.out.println("是否包含new Person(4,1111)对象:" + t_TreeMap.containsValue(new Person(4,"1111")));
    406         
    407         
    408         /**5.5 WeakHashMap类**/
    409         //WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,
    410         //如果一个key不再被外部所引用,那么该key可以被GC回收。
    411         //一般很少用到
    412         //用法想见API  跟HashMap用法差不多
    413         
    414         /**5.6 IdentityHashMap类**/
    415         // IdentityHashMap类是一种允许key 的内容可以重复的集合类
    416         //一般很少用到
    417         //用法想见API  跟HashMap用法差不多
    418         
    419         /**5.7 EnumMap类**/
    420         //1. 使用EnumMap时,必须指定枚举类型。
    421         //2. key不能为null
    422         //3. EnumMap内部以数组实现,性能更好。
    423         System.out.println("演示EnumMap类=======");
    424         EnumMap e_EnumMap = new EnumMap(MyEnum.class);
    425         e_EnumMap.put(MyEnum.BLACK,"黑色");
    426         e_EnumMap.put(MyEnum.WIHTE,"白色");
    427         e_EnumMap.put(MyEnum.RED,"红色");
    428         System.out.println("集合对象有:" + e_EnumMap);
    429         Iterator i_EnumMap = e_EnumMap.entrySet().iterator();
    430         while(i_EnumMap.hasNext()){
    431             Map.Entry entry_EnumMap = (Map.Entry)i_EnumMap.next();
    432             System.out.println("对象——key:" + entry_EnumMap.getKey()+ ",value:"+entry_EnumMap.getValue());
    433         }
    434         
    435     }
    436     
    437     /**6.集合操作工具类**/
    438     public static void demoTools(){
    439         //Collections类是一个集合操作工具类
    440         /**6.1 排序操作**/
    441         Person  p_Collections1 = new Person(1,"黄");
    442         Person  p_Collections3 = new Person(3,"李");
    443         Person  p_Collections2 = new Person(2,"赵");
    444         Person  p_Collections4 = new Person(4,"钱");
    445         List l_Array = new ArrayList();
    446         l_Array.add(p_Collections1);
    447         l_Array.add(p_Collections2);
    448         l_Array.add(p_Collections3);
    449         l_Array.add(p_Collections4);
    450         
    451         System.out.println("集合对象:" + l_Array);
    452         //排序(升序)
    453         Collections.sort(l_Array);
    454         System.out.println("排序后,集合对象:" + l_Array);
    455         
    456         //反转(执行排序后再执行反转 相当于降序)
    457         Collections.reverse(l_Array);
    458         System.out.println("反转后,集合对象:" + l_Array);
    459         
    460         
    461         //混乱排序
    462         Collections.shuffle(l_Array);//每次结果可能不一样
    463         System.out.println("混乱排序后,集合对象:" + l_Array);
    464         
    465         /**6.2 查找,替换操作**/
    466         //查找  指定元素查找  返回索引
    467         System.out.println("查找str_Collections元素的位置:" + Collections.binarySearch(l_Array,p_Collections1,null));
    468         
    469         //交换  指定位置交换
    470         System.out.println("交换前集合对象:" + l_Array);
    471         Collections.swap(l_Array,1,2);
    472         System.out.println("交换后集合对象:" + l_Array);
    473         
    474         //替换  指定元素替换
    475         Person p_Collections5 = new Person(5,"王");
    476         System.out.println("替换前集合对象:" + l_Array);
    477         Collections.replaceAll(l_Array,p_Collections4,p_Collections5);
    478         System.out.println("替换后集合对象:" + l_Array);
    479         
    480         /**6.3 同步控制**/
    481         //使用该工具类的同步方法返回可同步的集合对象
    482         Collection c=Collections.synchronizedCollection(new ArrayList());
    483         List l=Collections.synchronizedList(new ArrayList());
    484         Set s=Collections.synchronizedSet(new HashSet());
    485         Map m=Collections.synchronizedMap(new HashMap());
    486         
    487         /**6.4 总结**/
    488         //1.Set类
    489             //1.1 如果希望按照元素插入集合的顺序进行提取元素,用LinkedHashSet,它的元素按添加的顺序存储
    490             //1.2 一般使用HashSet,因为它的效率比LinkedHashSet高
    491             //1.3 TreeSet(集合元素有排序关系)
    492         //2.List类
    493             //2.1 ArrayList使用数组实现的动态扩展容量的list  定位查找操作效率快,不同步
    494             //2.2 LinkedList链式实现的list,增加修改效率快,不同步
    495             //2.3 Vector 同步版的ArrayList,因为同步,故效率不如ArrayList
    496             //2.4 Stack继承Vector,模拟实现栈
    497         //3.Map类
    498             //3.1 键值对同List和Set不同
    499             //3.2 HashMap:效率高
    500             //3.3 TreeMap:排序性
    501         //4.Collections类
    502             //4.1 提供了许多静态的方法来管理集合
    503         //5.Arrays类 
    504            //5.1 提供了对数组排序,查找,比较,填充元素的各种静态方法。
    505         
    506     }
    507     
    508     
    509     /*
    510     *    抽取打印演示函数  用于打印演示功能提示
    511     */    
    512     public static void showDemo(String demoStr){
    513         System.out.println("演示:" + demoStr);
    514     }
    515 
    516 }
  • 相关阅读:
    PouchDB:一款受CouchDB启发的离线Web数据库
    如何使用JPA注解映射枚举类型
    重新排列参数
    sql不同数据处理方式完成同一处理结果对日志增长的影响
    那些让我念念不忘的 Firefox 扩展
    Linux现可运行于Windows Azure上
    Vector Fabrics推出多核软件优化工具Pareon
    分解公式 sql
    sql树形数据生成xml
    Microsoft .NET终于提供了一个通用的Zip库
  • 原文地址:https://www.cnblogs.com/ciade/p/4764484.html
Copyright © 2011-2022 走看看