02.C#集合

1.集合接口与集合类型

(1)集合的命名空间

大多数集合类都可以在System.Collections和System.Collections.Generic名称空间中找到。泛型集合位于System.Collections.Generic名称空间中;专用于特定类型的集合类位于System.Collections.Specialized名称空间中;线程安全的集合位于System.Collections.Concurrent名称空间中。

(2)集合接口介绍

1、IEnumerable与IEnumerator接口

其实IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象。

  1. public interface IEnumerable
  2. {
  3. IEnumerator GetEnumerator();
  4. }

IEnumerator对象有什么呢?它是一个真正的集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项。IEnumerator接口定义了:一个Current属性用来获取当前集合中的项;MoveNext方法将游标的内部位置向前移动;Reset方法将枚举数设置为其初始位置,该位置位于集合中第一个元素之前。

  1. public interface IEnumerator
  2. {
  3. object Current { get; }
  4. bool MoveNext();
  5. void Reset();
  6. }

一个collection要支持foreach进行遍历,就必须实现IEnumerable,并以某种方式返回迭代器对象:IEnumerator。

2、集合和列表实现的接口表

IEnumerable<T>                  如果foreach语句用于集合,就需要此接口。

ICollection<T>                  此集合定义了Count属性、CopyTo、Add、Remove、Clear方法

IList<T>                        可以通过位置访问几何元素

ISet<T>                         此集合不允许有重复的元素

IDictionary<K,V>                含有键值对的集合

ILookup<K,V>                    含有键值对的集合,但可以通过一个键包含多个值

IComparer<T>                    集合元素比较器,用于集合元素的排序

IEqualityComparer<T>            用于字典集合的比较器

IProducerConsumerCollection<T>  线程安全的集合

2.集合的基本操作

(1)创建集合

使用默认的构造函数创建一个空集合,元素添加到集合之后,集合的容量就会扩大为4。当集合的容量被使用完,且还在向集合中添加元素时,集合的容量就会扩大成原来的2倍!可使用Capacity属性设置或访问集合的容量,使用Count属性访问集合的元素个数。也可使用TrimExcess方法调整集合容量,节省内存!

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<int> list = new List<int>();//List<int> list = new List<int>(3)
  6. for (int i = 0; i < 1025; i++)
  7. {
  8. if (list.Count == (list.Capacity))
  9. {
  10. Console.WriteLine("容量使用量:"+list.Count + "/" + list.Capacity);
  11. }
  12. list.Add(i);
  13. }
  14. Console.WriteLine("容量使用量:" + list.Count + "/" + list.Capacity);
  15. list.TrimExcess();//调整容量
  16. Console.WriteLine("容量使用量:" + list.Count + "/" + list.Capacity);
  17. Console.Read();
  18. }
  19. }

创建集合时可以为集合设置初始值,如下:

  1. List<int> list = new List<int>() { 1,2,3,4,5,6,7,8,9,0};
  2. List<string> list = new List<int>() { "aa", "bb", "cc" };

(2)添加元素

为集合添加元素可使用Add方法,还可以使用AddRange方法一次添加多个元素,因为AddRange方法的参数是IEnumerable<T>类型的对象,所以可以添加数组到集合里。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> list = new List<string>();
  6. list.AddRange(new string[]{"aa","bb","cc"});//添加数组
  7. list.AddRange(list);//添加集合
  8. foreach (string s in list)
  9. {
  10. Console.WriteLine(s);
  11. }
  12. Console.Read();
  13. }
  14. }

(3)插入元素

插入元素可以使用Insert方法,同样使用InsertRange方法插入多个元素,与AddRange方法类似。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> list = new List<string>() { "aa", "bb", "ff" };
  6. list.Insert(2, "cc");//插入元素
  7. list.InsertRange(3, new string[] { "dd", "ee" });//插入集合
  8. foreach (string s in list)
  9. {
  10. Console.WriteLine(s);
  11. }
  12. Console.Read();
  13. }
  14. }

(4)访问元素

可以使用索引器访问集合中某个位置的元素,例如:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> list = new List<string>() { "aa", "bb", "cc" };
  6. Console.WriteLine(list[1]);//访问第1个位置上的元素,下标从0开始
  7. Console.Read();
  8. }
  9. }

集合的遍历,除了使用foreach外,还可以使用集合的Foreach方法,该方法的参数是一个Action<T>委托类型,可以使用Lambda表达式。例如:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> list = new List<string>() { "aa", "bb", "cc" };
  6. list.ForEach(temp => Console.WriteLine("元素:" + temp));
  7. //也可使用: list.ForEach(Console.WriteLine);
  8. Console.Read();
  9. }
  10. }

(5)删除元素

使用RemoveAt删除指定位置的元素,使用Remove删除指定的元素,使用RemoveRange删除指定位置范围的元素,使用Clear删除所有元素,使用RemoveAll选择删除的元素。

注意:RemoveAll方法的参数是一个Predicate<T>委托类型,使用方式如下:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> list = new List<string>() { "12", "123", "1234", "12345" };
  6. //删除长度小于4的元素
  7. list.RemoveAll(x => { bool flag = x.Length < 4; return flag; });
  8. list.ForEach(Console.WriteLine);
  9. Console.Read();
  10. }
  11. }

(6)搜索元素

用于搜索的方法有:IndexOf、LastIndexOf、FindIndex、FindLastIndex、FindLast、Find、FindAll、Exists等方法。

IndexOf、LastIndexOf、FindIndex、FindLastIndex方法用于搜索元素的位置。

FindLast、Find、FindAll方法用于搜索满足条件的元素。

Exists用于判断集合是否存在某些元素。

参数可以使用Predicate<T>委托类型(Lambda表达式)的方法有:FindIndex、FindLastIndex、Find、FindLast、FindAll、Exists。例如:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> list = new List<string>() { "12", "123", "1234", "12345" };
  6. //搜索长度小于4的元素
  7. list=list.FindAll(x => { bool flag = x.Length < 4; return flag; });
  8. list.ForEach(Console.WriteLine);
  9. Console.Read();
  10. }
  11. }

(7)元素排序

可以使用Sort方法对元素排序,也可以调用Reverse方法逆转集合顺序,Sort方法使用快速排序算法。Sort使用了几个重载的方法,可以传递的参数有泛型委托Comparison<T>和泛型接口IComparer<T>,例如:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> list = new List<string>() { "12", "123", "1234", "12345" };
  6. //按字符串长度排序
  7. list.Sort((x, y) => { return y.Length - x.Length; });
  8. list.ForEach(Console.WriteLine);
  9. Console.Read();
  10. }
  11. }

(8)类型转换

使用ConvertAll<TOutput>方法可以把集合里的所有元素转换成另一种类型,ConvertAll<TOutput>使用了Converter委托,其定义如下:

  1. public sealed delegate TOutput Converter<TInput, TOutput>(TInput from)

TInput是委托方法的参数类型,TOutput是委托方法的返回值类型。例如:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> list = new List<string>() { "12", "123", "1234", "12345" };
  6. //把字符串转换成数字(String->int)
  7. List<int> array = list.ConvertAll<int>(temp => Int32.Parse(temp));
  8. array.ForEach(temp => Console.WriteLine((temp + 1)));
  9. Console.Read();
  10. }
  11. }

(9)只读集合

集合的AsReadOnly方法可以返回一个ReadOnlyCollection<T>类型的集合;ReadOnlyCollection<T>是一个只读集合类型,除了不能使用修改集合的方法与属性,其它与集合一样。

(10)集合常用的扩展方法(常用)

集合的扩展方法很多,这里只举两个例子:Select与Where。例如:

    Select:将序列中的每个元素投影到新表中。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<int> list = new List<int>() {1,3,5,7,9};
  6. IEnumerable<string> array = list.Select<int, string>(x => (x * x).ToString());
  7. foreach(string s in array)
  8. {
  9. Console.WriteLine(s);
  10. }
  11. Console.Read();
  12. }
  13. }

Where:基于谓词筛选值序列。

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> list = new List<string> { "1", "12", "123", "1234" };
  6. //查询长度小于3的元素
  7. IEnumerable<string> query = list.Where(temp => temp.Length < 3);
  8. foreach (string s in query)
  9. {
  10. Console.WriteLine(s);
  11. }
  12. Console.Read();
  13. }
  14. }

3.常见集合的特性

(1)非泛型集合对应的泛型集合

非泛型集合类    对应的泛型集合类

ArrayList       List<T>

HashTable       DIctionary<T>

Queue           Queue<T>

Stack           Stack<T>

SortedList      SortedList<T>

(2)队列(Queue<T>)

队列是其元素以先进先出的方式来处理的集合。该集合没有Add与Remove方法,其重要的方法如下:

Enqueue 在队列的尾端添加元素

Dequeue 在队列的头部读取并删除元素

Peek    只读取队列头部的元素

程序示例如:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Queue<string> queue = new Queue<string>();
  6. for (int i = 1; i < 5; i++)
  7. {
  8. queue.Enqueue(i.ToString());//在尾部添加元素
  9. }
  10. PrintQueue(queue);//输出元素
  11. string s = queue.Dequeue();//读取并删除头部元素
  12. Console.WriteLine("读取并删除头部元素:" + s);
  13. queue.Enqueue("5");//在尾部添加元素
  14. s = queue.Peek();//读取头部元素
  15. Console.WriteLine("读取头部元素:" + s);
  16. PrintQueue(queue);//输出元素
  17. Console.Read();
  18. }
  19. //输出元素
  20. private static void PrintQueue(Queue<string> q)
  21. {
  22. IEnumerable<string> list = q.Where(t => true);
  23. foreach (string t in list)
  24. {
  25. Console.WriteLine(t);
  26. }
  27. }
  28. }

(3)栈(Stack<T>)

栈是一个后进先出的容器,其重要的方法如下:

Push    在栈顶压入一个元素入栈

Pop     从站顶读取并删除一个元素

Peek    只从站顶读取一个元素

程序示例如:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Stack<string> stack = new Stack<string>();
  6. for (int i = 1; i < 5; i++)
  7. {
  8. stack.Push(i.ToString());//入栈
  9. }
  10. PrintStack(stack);//输出元素
  11. string s = stack.Pop();//读取并删除栈顶元素
  12. Console.WriteLine("读取并删除栈顶元素:" + s);
  13. s = stack.Peek();//只读取栈顶元素
  14. Console.WriteLine("只读取栈顶元素:" + s);
  15. PrintStack(stack);//输出元素
  16. Console.Read();
  17. }
  18. //输出元素
  19. private static void PrintStack(Stack<string> s)
  20. {
  21. IEnumerable<string> list = s.Where(t => true);
  22. foreach (string t in list)
  23. {
  24. Console.WriteLine(t);
  25. }
  26. }
  27. }

(4)链表(LinkedList<T>)

LinkedList<T>是一个双向链表。链表的优点是,如果将元素插入列表的中间位置,使用链表就会非常快,只需要修改下一个元素的Next引用与上一个元素的Previous引用。链表不能在集合中只存储元素,必须要把元素存到LinkedListNode<T>类型的对象中,LinkedListNode<T>定义了属性:List、Next、Value、Previous。List属性返回与该节点相关的LinkedList<T>对象,Next、Previous用于遍历链表。

LinkedList<T>对象可以访问第一个和最后一个元素(Frist与Last)、在指定位置插入元素(AddAfter()、AddBefore()、AddFirst()、AddLast()方法),删除指定位置的元素(ReMove()、ReMoveFirst()、RemoveLast()方法),从链表的开头(Find())或结尾(FindLast())开始搜索元素。

程序示例如:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. LinkedList<int> link = new LinkedList<int>();
  6. LinkedListNode<int> node;
  7. for (int i = 0; i < 10; i++)
  8. {
  9. node = new LinkedListNode<int>(i);
  10. if (i % 2 == 0)
  11. {
  12. link.AddFirst(node);//从头部添加节点
  13. }
  14. else
  15. {
  16. link.AddLast(node);//从尾部添加节点
  17. }
  18. }
  19. PrintLink(link);//输出元素
  20. Console.Read();
  21. }
  22. //输出元素
  23. private static void PrintLink(LinkedList<int> l)
  24. {
  25. IEnumerable<int> list = l.Where(t => true);
  26. foreach (int t in list)
  27. {
  28. Console.WriteLine(t);
  29. }
  30. }
  31. }

(5)有序列表(SortedList<K,V>)

SortedList<K,V>是基于键对集合进行排序的集合类,它只允许每个键只有一个对应值,如果需要每个键对应多个值可以使用Lookup<K,V>。可以使用foreach遍历该集合,枚举器返回的是KeyValuePair<K,V>类型的元素。除了使用Add方法添加元素,还可以使用索引器添加。例如:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. SortedList<string, string> sort = new SortedList<string, string>();
  6. sort.Add("K1", "V1");//Add方法添加元素
  7. sort["K2"] = "V2";//索引器添加元素
  8. PrintSorted(sort);//输出元素
  9. Console.WriteLine("是否存在[K3]:" + sort.ContainsKey("K3"));
  10. string value = null;
  11. Console.WriteLine("是否存在[K2]:" + sort.TryGetValue("K2", out value));
  12. Console.WriteLine("[K2]的值:" + value);
  13. Console.Read();
  14. }
  15. //输出元素
  16. private static void PrintSorted(SortedList<string, string> s)
  17. {
  18. IEnumerable<KeyValuePair<string, string>> list = s.Where(t => true);
  19. foreach (KeyValuePair<string, string> t in list)
  20. {
  21. Console.WriteLine(t.Key + " ---> " + t.Value);
  22. }
  23. }
  24. }

(6)字典

字典中键的类型必须重写Object类的GetHashCode()方法。只要字典类需要确定元素的位置,他就会调用GetHashCode()方法。除了实现GetHashCode()方法外,键类型还必须实现IEquatable<T>.Equals()方法,或重写Object类的Equals()方法。

因为不同的对象可能返回相同的散列码(GetHashCode方法返回值),但是如果A.Equals(B)返回true,则A和B的散列码就必须相同。这似乎有点奇怪,但这非常重要,因为字典的性能取决于GetHashCode()方法实现的代码。

1、Dictionary<K,V>

Dictionary<K,V>类支持每个键关联一个值,与SortedList<K,V>很类似。

2、Lookup<K,V>

Lookup<K,V>类把键映射到一个值集上。创建Lookup<K,V>类对象必须调用ToLookup()扩展方法,该方法返回一个Lookup<K,V>对象。ToLookup()方法需要一个Func<T,K>类型的委托参数,Func<T,K>类型定义了键的选择器。

ToLookup()是一个奇妙的函数,用于对一个集合进行操作,创建一个1:n 的映射。 它可以方便的将数据分类成组,并生成一个字典供查询使用。例如:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. List<string> list = new List<string>() { "1","12","123","1234","a","ab","abc"};
  6. var lookup=list.ToLookup(x => x.Length);//根据元素的长度分组
  7. foreach (var t in lookup)
  8. {
  9. List<string> temp=t.ToList<string>();//把一组数据转换成集合
  10. temp.ForEach(x=>Console.Write(x+"、"));//输出集合
  11. Console.WriteLine();
  12. }
  13. Console.Read();
  14. }
  15. }

3、SortedDictionary<K,V>

SortedDictionary<K,V>类是一个二叉搜索树,其中的元素根据键来排序,该键类型必须实现IComparable<T>接口。

SortedDictionary<K,V>与SortedList<K,V>的区别:

1.SortedList<K,V>类使用的内存比SortedDictionary<K,V>少。

2.SortedDictionary<K,V>类的元素的插入与删除比较快。

3.在用于已排好序的集合,若不需要修改容量SortedList<K,V>会比较快。

区别的根本原因:SortedList<K,V>实现的是一个基于数组的集合,SortedDictionary<K,V>实现的是一个基于字典的集合。

(7)集(ISet<T>接口)

不包含重复元素的集合称为集,.NET Framework包含两个集(HashSet<T>和SortedSet<T>),它们都实现ISet<T>接口。HashSet<T>是不包含重复元素的无序列表,SortedSet<T>是不包含重复元素的有序列表。

4.可观察的集合(深入)

(1)ObservableCollection<T>类简介

ObservableCollection<T>类是为WPF定义的,这样UI就可以得知集合的变化,因为只要修改了ObservableCollection<T>类对象集合中的元素,它就会产生CollectionChanged 事件。

(2)使用示例

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. ObservableCollection<int> list = new ObservableCollection<int>();
  6. list.CollectionChanged += ListCollectionChanged;//添加事件方法
  7. list.Add(10);//产生事件
  8. list.Add(20);//产生事件
  9. list.Remove(10);//产生事件
  10. Console.Read();
  11. }
  12. //事件方法
  13. private static void ListCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
  14. {
  15. Console.WriteLine("本次修改的方式:" + e.Action.ToString());
  16. if (e.OldItems != null)
  17. {
  18. Console.WriteLine("本次修改的位置:" + e.OldStartingIndex);
  19. Console.WriteLine("本次修改的元素个数:" + e.OldItems.Count);
  20. }
  21. if (e.NewItems != null)
  22. {
  23. Console.WriteLine("本次修改的位置:" + e.NewStartingIndex);
  24. Console.WriteLine("本次修改的元素个数:" + e.NewItems.Count);
  25. }
  26. Console.WriteLine();
  27. }
  28. }

5.位数组(深入)

(1)BitArray、BitVector32介绍

如果需要处理的数字有许多位,就可以使用BitArray类与BitVector32结构。它们的区别是:BitArray类可以重新设置大小,它可以包含很多位;BitVector32结构是基于栈的,因此比较快,但它只能包含32为,它们存在一个整数中。

(2)BitArray

BitArray类是一个引用类型,它包含一个int数组,其中32位使用一个新整数,其成员如下:

Count、Length     Count、Length可得到数组的位数,Length可设置其数组的大小

Get、Set          使用Get、Set可访问数组中的位

SetAll            SetAll()方法设置所有的位值

Not               Not()方法对数组中所有的位求反

And、Or、Xor      And()是与操作,Or()是或操作,Xor()是异或操作

程序示例:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. BitArray barray = new BitArray(20);
  6. barray.SetAll(true);//对所有位赋值
  7. PrintBitArray(barray);//输出
  8. barray.Set(1, false);
  9. barray[2] = false;
  10. PrintBitArray(barray);//输出
  11. Console.Read();
  12. }
  13. //输出函数
  14. private static void PrintBitArray(BitArray b)
  15. {
  16. foreach (bool bit in b)
  17. {
  18. Console.Write(bit ? 1 : 0);
  19. }
  20. Console.WriteLine();
  21. }
  22. }

(3)BitVector32

BitVector32结构的效率更高,因为它是值类型!它常用成员如下:

Data            Data属性把BitVector32结构返回成一个整数

索引器           访问BitVector32结构的值可以使用索引器

CreateMask      这是一个静态方法,为访问BitVector32结构中特定的类创建掩码

CreateSection   这是一个静态方法,用于创建32位中的几个片段

程序示例:

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. BitVector32 b32 = new BitVector32();
  6. PrintBitVector32(b32);//输出位
  7. int bit = BitVector32.CreateMask();
  8. for (int i = 0; i < 4; i++)
  9. {
  10. b32[bit] = true;
  11. Console.WriteLine(bit);
  12. PrintBitVector32(b32);//输出位
  13. b32[bit] = false;
  14. bit = BitVector32.CreateMask(bit);
  15. }
  16. Console.WriteLine(b32.Data);//输出数
  17. Console.Read();
  18. }
  19. //输出函数
  20. private static void PrintBitVector32(BitVector32 b32)
  21. {
  22. for (int i = 0; i < 32; i++)
  23. {
  24. Console.Write(b32[i] ? 1 : 0);
  25. }
  26. Console.WriteLine();
  27. }
  28. }

6.并发集合(.NET 4新增)

(1)ConcurrentQueue<T>

这个集合类用一种免锁定的算法实现,访问队列元素的方法有:TryDequeue、TryPeek和Enqueue。

(2)ConcurrentStack<T>

这个集合类定义了:Push()、PushRange、TryPeek、TryPop、TryPopRange方法。

(3)ConcurrentBag<T>

ConcurrentBag<T>表示对象的线程安全的无序集合。对于同一个线程值的添加和删除是非常快的,因为ConcurrentBag内部将数据按线程的标识而独立存储,所以一个线程从自己的数据中移除一个数据是非常快的,当然如果这个线程中没有数据,那么只能从其他线程中移除数据,此时会发生一些性能损耗从而确保线程安全!

(4)ConcurrentDictionary<K, V>

这是一个线程安全的键值集合,TyrAdd、TryGetValue、TryRemove、TryUpdate方法以非阻塞的方式访问元素。

(5)BlockingCollection<T>

这个集合在可以添加或提取元素元素之前,会阻塞线程并一直等待。可以使用Add、Take方法用来添加和删除元素,这些方法会阻塞当前线程,一直等到任务可以执行为止。

7.不同集合类的性能

集合                    Add         Insert      Remove      Item            Sort                Find

List                O(1)或O(n)       O(n)        O(n)       O(1)            O(n log n)-O(n^2) --

Stack               O(1)或O(n)       n/a         O(1)       n/a             n/a                n/a

Queue               O(1)或O(n)       n/a         O(1)       n/a             n/a                n/a

HashSet             O(1)或O(n)       O(1)或O(n)  O(1)       n/a             n/a                 n/a

SortedSet           O(1)或O(n)       O(1)或O(n)  O(1)       n/a             n/a                 n/a

LinkedList          O(1)             O(1)        O(1)       n/a             n/a                 O(n)

Dictionary          O(1)或O(n)       n/a         O(1)       O(1)            n/a                 n/a

SortedDictionary    O(log n)         n/a         O(log n)   O(log n)        n/a                 n/a

SortedList          O(n)或O(log n)   n/a         O(n)       O(n)或O(log n)  n/a                 n/a

-------------------------------------------------------------------------------------------------------------------------------

来自为知笔记(Wiz)

时间: 2024-12-15 19:45:32

02.C#集合的相关文章

Java面试02|Java集合

Java中一般接触到的集合如下图: 关于Java中并发集合有: (1)CouncurrentHashMap (2)CopyOnWriteArrayList (3)LinkedBlockingQueue (4)ArrayBlockingQueue 这些的适用场景及其实现原理是必须要掌握的. 1.Hash的死锁原因 参考:HashMap 死锁分析 http://github.thinkingbar.com/hashmap-infinite-loop/ 2.关于ConcurrentHashMap相关的

20180826(02)-Java集合框架

Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack, 和Properties这些类用来存储和操作对象组. 虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题.由于这个原因,使用Vector类的方式和使用Properties类的方式有着很大不同. 集合框架被设计成要满足以下几个目标. 1.该框架必须是高性能的.基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的. 2.该框架允许不同类型的集合,以类似的方式工作,

JavaSE_ 集合框架 总目录(15~18)

黑马程序员_JavaSE学习总结第15天_集合框架1 15.01 对象数组的概述和使用15.02 对象数组的内存图解15.03 集合的由来及与数组的区别15.04 集合的继承体系图解15.05 Collection集合的功能概述15.06 Collection集合的基本功能测试15.07 Collection集合的高级功能测试15.08 集合的遍历之集合转数组遍历15.09 Collection存储自定义对象并遍历案例(使用数组)15.10 集合的遍历之迭代器遍历15.11 Collection

【转】Java 集合系列目录(Category)

Java 集合系列目录(Category) 下面是最近总结的Java集合(JDK1.6.0_45)相关文章的目录. 01. Java 集合系列01之 总体框架 02. Java 集合系列02之 Collection架构 03. Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 04. Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理.解决办法) 05. Java 集合系列05之 LinkedList详细介绍(源码解析

JavaSE学习总结第18天_集合框架4

18.01 Map集合概述和特点 Map接口概述:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值 Map接口和Collection接口的不同 1.Map是双列的,Collection是单列的 2.Map的键唯一,Collection的子体系Set是唯一的 3.Map集合的数据结构值针对键有效,跟值无关,Collection集合的数据结构是针对元素有效 18.02 Map集合的功能概述 成员方法: 1.V put(K key,V value): 将指定的值与此映射中的指定

JavaSE学习总结第17天_集合框架3

17.01 ArrayList集合的toString()方法源码解析 代码: Collection c = new ArrayList(); c.add("hello"); c.add("world"); c.add("java");   System.out.println(c);    输出c时默认调用的是c的toString()方法 A:Collection c = new ArrayList(); 这是多态,所以输出c的 toString

Java 集合系列目录(Category)

Java 集合系列目录(Category) 转自:Java 集合系列目录(Category) 01. Java 集合系列01之 总体框架 02. Java 集合系列02之 Collection架构 03. Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 04. Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理.解决办法) 05. Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例 06. 

(转)Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数据结构第3部分 LinkedList源码解析(基于JDK1.6.0_45)第4部分 LinkedList遍历方式第5部分 LinkedL

(转)Java 集合系列08之 List总结(LinkedList, ArrayList等使用场景和性能分析)

概要 前面,我们学完了List的全部内容(ArrayList, LinkedList, Vector, Stack). Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列04之 fail-fast总结(通过ArrayList来说明fail-fast的原理.解决办法) Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例 Java 集合系列06之 Vector详细介绍(源码解析)和使用示例 Java 集合系列07之 Stack详细