使用集合组织相关数据

集合:某些对象集中在一起就是集合。就是怎么easy!

1.ArrayList可以动态扩容,并且它的索引会 根据程序的扩展而重新进行分配和调整。被删除的对象,索引也并不会占位,这是区别于数组的两点。默认初始容量为0.ArrayList类属于System.Collection空间,包含接口和类。

 ArrayList提供了一系列方法对其中的元素进行访问,增加和删除操作。

ArrayList常用属性和方法:

Add(Object value)将对象添加到ArrayList的结尾处。并且返回值 为int。

Remove(Object value)将指定的元素删除,并且一次只删除一个。

RemoveAt(int index)将指定元素下标的值删除。

Insert(int index,Object Value)将指定的元素添加到指定的下标。

Contains(Object Value)判断指定的元素是否存在集合中,布尔返回值。

Clear()删除集合中的所有元素

属性:

Count:查询集合中的元素个数。

集合初始化器:就是更简单的方法对集合中的元素赋值。

eg:

ArrayList list = new ArrayList();

{

 new Book(){BookName="越狱"}//每一项用逗号隔开,最后一项不用逗号

...

};

可以使用For循环和Foreach循环遍历集合。

 经验:集合的难点不在于方法的使用,而在于综合使用解决项目中的实际问题。

 2.Hashtable的使用

Hashtable不能通过下标访问数据,双列集合是通过键访问值的。

Hashtable的常用属性和方法

Count   :获取键值对的数目

keys:键的集合

Values:值的集合

Add(Object key,Object Value):将指定的键和值的元素添加到集合中。

Remove(Object Key):移除带有指定键的元素

Clear():移除所有元素

eg: Hashtable ht = new Hashtable();

SE jack = new SE();

jack.Name="lai ";

jack.Age = 35;

...........

jack.ID = "001";

//向Hashtable中添加元素

ht.Add(jack.ID,jack);

Hashtable只能用foreach遍历集合中的数据。

eg:

foreach(Object obj in ht.Values)

{

//遍历值

cw(se.Name);

}

或者

foreach(string key in ht.Keys

{

//将键值对全部遍历出来

cw(ht[key]);

}

 3.泛型集合

 泛型是C#2.0的一个新特性。泛型引入一个概念:类型参数。是一个数据类型,可以是类类型,基本数据类型。通过使用<T>类型参数

 1.减少装箱和类型强转时的风险。

2.通过泛型可以最大限度的重用代码,保护类型的安全及提高性能,最常用的就是创建集合类,可以约束集合类中的元素类型。比较典型的是List<T>和Dictionary<K,V>.

定义一个List<T>泛型集合的方法

语法:

List<T> 对象名 = new List<T>();//泛型集合必须实例化

eg:

//通过索引访问

SE se = new se[0];

se.SayHi();

//通过索引或者对象删除

ses.RemoveAt(0);

ses.Remove(ema);

//打印集合数目

ses.Count.Tostring();

//遍历。for也可

foreach(SE se in ses)

{

//遍历时无须类型转换

cw(se.SayHi());

}

4.List<T>与ArrayList的区别

 相同点:

1.通过索引访问集合中的元素。

2.添加元素方法相同。Add(Object Value)

 3.删除元素方法相同。RemoveAt(int index)或Remove(Object Value)

不同点:

List<T>:对保存元素进行类型约束。

ArrayList:可以增加任何类型。

List<T>:添加/读取值类型不用进行装箱,拆箱操作。

ArrayList:添加/读取值类型需要进行装箱,拆箱操作。

<泛型集合Dictionary<K,V>>

它具有泛型的全部特性,编译时检查类型约束,获取元素值时无须类型转换。它存储数据的方式与Hashtable类似,也是通过Key.Value键值对保存元素的。

语法:

Dictionary<k,v>  对象名 = new Dictionary<k,v>();//定义泛型集合必须实例化

eg:

Dictionary<string,SE> ht = new Dictionary<string,SE>();

ht集合的Key类型是string ,Value是SE类型

SE jack = new SE();

jack,Name="我";

jack.ID = "1";

SE joe = new SE();

joe.Name ="张三";

......

ht.Add(jack.ID,jack);//添加元素

。。。

//打印集合元素

ht.Count.Tostring();

//通过Key访问元素

SE ht = ht["1"];

//通过key删除元素

ht.Remove(“1”);

//遍历只能用for,因为双列集合无索引,并且是无序的。

foreach(SE se  in ht.Values

{

cw(se.SayHi());//遍历无须类型转换

}

5.Dictionary<k.v>和Hashtable的对比

相同点:

1.都通过Key获取Value

2.添加元素方法相同Add(Object Key,Object Value)

3.删除元素方法相同 Remove(Object Value)

4.遍历方法相同foreach

不同点:

Dictionary<k.v>:对保存元素进行类型约束。

 Hashtable:可以增加任何类型

Dictionary<k.v>:添加/读取值类型元素无须装箱,拆箱。

 Hashtable::添加/读取值类型元素需要拆箱,装箱。

 遍历Dictionary还可以采用:

foreach(KeyValuePair<string,SE> en in ht)

{

cw(en.Key);

cw(en.Value.Name);

}.

6.泛型类(重点)

语法:

public class 类名<T>

{

//...

}

T代表数据类型。可以是基本数据类型,类类型。

泛型类相当于 一个口袋,它支持任意的数据类型,这种数据类型在程序运行时确定。

泛型优点:

1.性能高。普通集合的数据需要装箱和拆箱的操作,而泛型无须类型的转换操作。

2.类型安全。泛型结婚对它存储的对象进行类型的约束,不是它所允许存储类型是无法添加到泛型集合中的。

3.实现代码的重用。泛型就相当于模板,由于它支持任意的数据类型。开发人员不必为每种特定的数据类型编写一套方法。所以它具有极大的可重用性。泛型编程是未来的主流技术之一。

 

列子1:
public class Point<T> {
    private T x;
    private T y;
    public T getX() {
        return x;
    }
    public void setX(T x) {
        this.x = x;
    }
    public T getY() {
        return y;
    }
    public void setY(T y) {
        this.y = y;
    }
    @Override
    public String toString() {
        return "Point [x=" + x + ", y=" + y + "]";
    } 
 
     public static void main(String[] args) {
        Point<Integer> p=new Point<Integer>();
        p.setX(12);
        p.setY(11);
        System.out.println(p.toString());
        
        Point<String> p1=new Point<String>();
        p1.setX("gao");
        p1.setY("ying");
        System.out.println(p1.toString());
    }  
}  

例子2:
public class MyMap<K,V> {
 
    private K key;
    private V value;
    public K getKey() {
        return key;
    }
    public void setKey(K key) {
        this.key = key;
    }
    public V getValue() {
        return value;
    }
    public void setValue(V value) {
        this.value = value;
    }
    
    public void put(K key,V value){
        this.key=key;
        this.value=value;
    }
    @Override
    public String toString() {
        return "MyMap [key=" + key + ", value=" + value + "]";
    }
 
   //测试
    public static void main(String[] args) {    
           MyMap<Integer,String> mp=new MyMap<Integer,String>();
           mp.put(1, "aa");
           System.out.println(mp.toString());  
    }
}

 

 

 

泛型方法

 

 

 

public class  myArray {
 
    public static void main(String[] args) {
        //Test(1,2,4);
        //Test2("aa",2,"cc",true);
        Test3(2,4,5,"a",true);
    }
    
    public static  void Test(int ...i)  {
        for (int j = 0; j < i.length; j++) {
            System.out.print(i[j]+" ");
        }
    }
    
    @SafeVarargs
    public static  <T> void Test2(T ...i)  {
        for (int j = 0; j < i.length; j++) {
            System.out.print(i[j]+" ");
        }
    }
 
    
    public static  void Test3(Object...i)  {
        for (int j = 0; j < i.length; j++) {
            System.out.print(i[j]+" ");
        }
    }
}

 

posted on 2018-04-02 16:18  技术之路永无止境~  阅读(126)  评论(0编辑  收藏  举报

导航