C#&Java重學筆記(集合比較和轉換)


 

C#部分:

1.C#中集合有三種,數組類,ArrayList,和字典鍵值對類,一般也可以自定義集合,但是自定義集合的類型也只有這三類。

2.自定義集合實現三類集合的方法:前兩者需要繼承CollectionBase類,Array需要使用List屬性,ArrayList需要使用InnerList屬性,后一種,繼承DictionaryBase類,使用Dictionary屬性。

public class myCollect : CollectionBase
    {
        public void Add(int a)
        {
            List.Add(a);
        }
        public void Remove(int a)
        {
            List.Remove(a);
        }
        //實現索引器
        public int this[int index]
        {
            get
            {
                return (int)List[index];
            }
            set 
            {
                List[index] = value;
            }
        }
    }
繼承CollectionBase
public class myDic : DictionaryBase
    {
        public void Add(string key, Object value)
        {
            Dictionary.Add(key, value);
        }
        public void Remove(string key)
        {
            Dictionary.Remove(key);
        }
        //實現索引器
        public string this[string key]
        {
            get { return (string)Dictionary[key]; }
            set { Dictionary[key] = value; }
        }
        
    }
繼承DictionaryBase

3.自定義的集合會自動實現foreach循環迭代器,而有時我們自定義的類或類的集合需要迭代,那么我們就需要手動繼承IEnumerable接口,並實現該接口中的IEnumerator接口。
   這種自己手動添加迭代器的方法比較繁雜,不容易理解,這里只列出具體步驟:

   a.繼承IEnumerable接口,然后類中實現 public IEnumerator GetEnumerator()方法

   b.實現繼承了IEnumberator接口的迭代類,類中實現public bool MoveNext方法和public object Current屬性

   c. 完成迭代器后,使用時通過判斷MoveNext方法的返回值,確定是否迭代,並用Current屬性保存當前被迭代到對象的引用

   d.反復c步驟的過程,直到MoveNext返回false,迭代結束。

4.yield return迭代器的出現簡化了手動繼承IEnumerable接口的繁瑣性,使用比較簡單。

 class  user
    {
        public string name;        
        public int key;
        public string Name
        {
            get { return this.name; }
            set { this.name = value; }
        }
        public int Key
        {
            get { return this.key; }
            set { this.key = value; }
        }
                     public IEnumerable foo()
        {
            yield return this.name;
            yield return this.key;
        }
    }
    class test
    {
        public static void Main(String[] args)
        {
            user us=new user();
            us.Name="jack";
            us.Key=123;
            foreach (var item in us.foo())
            {
                Console.WriteLine(item);
            }
            Console.ReadKey();
        }
    }
yield return

5.C#的對象復制也分為深度復制和淺度復制,淺度復制需在類的方法中調用MemberwiseClone函數實現。深度方法則和JavaScript類似,也是用new相同類型對象並迭代賦值實現。
6.C#可以對某些運算符進行重載,比如下面的案例:

public class person
    {
        public int age;
        public int Age
        {
            get { return this.age; }
            set { this.age = value; }
        }
        public static person operator +(person a, person b)
        {
            
            person c = new person();
            c.age = a.age + b.age;
            return c;
        }
    }
    
    class test
    {
        
        public static void Main(String[] args)
        {
            var a = new person();
            var b = new person();
            a.age = 3;
            b.age = 4;
            var c = new person();
            c = a + b;
            Console.WriteLine(c.Age);
            Console.ReadKey();
        }
    }
運算符重載

  運算符重載事項:
  比較運算符的重載需要 成對重載,同時重載==和!=時,需要重寫該類的Equals方法和GetHashCode方法。其中GetHashCode方法返回的是int類型的8位數字編碼,表示該類的唯一性。

7.IComparable接口和IComparer接口負責實現對象之間的比較,前者是obj1.ComparaTo(obj2)方法的借口,后者是object.Compare(object a,object b)方法的載體。

8.每次重寫ICmparable接口時都要重寫== <= >= <> !=這些運算符。同樣,每次重寫== 都要重寫Equals方法,重寫Equals方法時也要重寫GetHashCode方法。這些都是連鎖反應。為什么重寫Equals需要重寫GetHashCode方法?因為每個對象的散列碼即哈希編碼都是唯一的,兩個對象如果相等,那么這兩個對象的散列碼必須相同,所以,有必要維護這個協定。注意:相等的對象有相同的散列碼,反之則不成立。因為散列碼實質就是該對象在內存中的地址,所以誰知道你下次程序運行你的對象分配的地址是什么呢?

9.C#中==表示值類型的值是否相等和引用類型的引用地址是否相等。而Equals則表示兩個變量是否是對同一個對象的引用,即堆中的內容是否相同。

 

java部分:

1.java中集合通過Collection接口和Map接口來派生,前者表示線性序列,后者是鍵值到值的映射。

2.Collection分為Set和List,Set表示不重復的元素集合,List表示一個可包含重復元素的有序集合。

3.Set還可以派生出SortedSet,表示可排序的集合。

4.Map也可以派生出SortedMap,表示可排序的映射。

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com