数组、链表、字典、哈希表学习

        学习这三者时有些困惑,觉得使用起来都可以达到目的,但是在开发中逐渐发现,在不同的情况下使用,对于运行速率是大有不同的,这也再一次告诫了自己,学习需要深刻理解,才能够掌握好知识点。

        特将三者基础概念和异同点总结如下,望各位同道开发者不吝赐教,共同学习。


数组——对象数量较少且数量固定时优先考虑;

字典——需要进行频繁的搜索时优先考虑;

链表——对象数量是动态的且搜索不是优先选项时,需要经常增减节点的情况优先考虑;


数组:

①基础知识点:

1、下标从0开始;

int[], 元素的值默认都是0;
float[], 元素的值默认都是0;
double[],元素的值默认都是0.0;
string[], 元素的值默认都是null;
bool[], 元素的值默认都是false;

2、下标不可以越界;

3、数组名表示数组,不可以进行运算;

4、当需要对数组中的值进行操作时,使用for循环更好;单纯遍历,使用foreach更好。

②优点:

1、数组存储在连续的内存上,索引速度非常快;

2、访问一个元素的时间恒定,与数组的元素数量无关;

3、赋值或修改元素简单。

③缺点:

1、连续存储,在两个元素之间插入新的元素麻烦;

2、容易造成内存浪费(声明的长度过长)或溢出(声明的长度过短)的问题。

一维数组:

using System;  
namespace Lesson01 {  

	class MainClass {     

		public static void Main ( string[] args ) {  

			//int[] intArray;                      声明:数据类型 [] 数组名;  
			//intArray = new int [5];              初始化:数组名 = new 数组类型 [数组长度]   

			int[] intArray = new int [5];        //声明和初始化二合一:数据类型 [] 数组名 = new 数组类型 [数组长度]   

			intArray [0] = 8;                    //赋值——数组名 [下标] = 值;  
			Console.WriteLine (intArray [0]);  

			//声明、初始化、赋值三合一 数据类型 [] 数组名 = new 数组类型 [数组长度]{值1,...,值N};  
			//动态赋值——使用new关键字  
			float[] numbers= new float [5]{2,3,4,5,6};  
			Console.WriteLine(numbers [0]);  

			//静态赋值——不使用new关键字  
			string[] s = {"苏利文","麦克","好好学习","天天向上"};  
			Console.WriteLine(s [1]);  
			Console.WriteLine (s [0] + s [1] + s [2] + s [3]);     //可以对数组中的元素进行运算,但是数组名表示数组,不可以进行运算;  

			//使用循环遍历数组中的元素  
			//for (int i = 0; i < max; i++) {}                     //快捷操作——for+按Tab两次  

			//使用foreach遍历输出        foreach(数组数据类型  临时变量名  in 数组名){Console.WriteLine(临时变量名);}  
			foreach (string ss in s) {  
				Console.WriteLine (ss);  
			} 

			//已知数组长度,可以直接决定max范围,从上知max为4  
			for (int i = 0; i < 4; i++) {            
				Console.WriteLine(s [i]);  
			}

			//使用"数组名.Length"获取数组长度  
			for (int i = 0; i < s.Length; i++) {            
				Console.WriteLine(s [i]);  
			}          
		}   
	}  
}

二维数组:

using System;

namespace Lesson01 {

	class MainClass {   

		public static void Main ( string[] args ) {
			 
			int[,] intArray = new int [2,3];        //声明和初始化二合一:数据类型 [] 数组名 = new 数组类型 [行,列] 
			intArray [1,2] = 3;                     //赋值——数组名 [下标] = 值;
			Console.WriteLine (intArray [1,2]);

			//声明、初始化、赋值三合一 数据类型 [] 数组名 = new 数组类型 [数组长度]{{},{}};

		    int[,] intArray1= new int [2,3]{
				{1,2,3},
				{4,5,6}
		        };
		    Console.WriteLine(intArray1 [1,2]);  

			//使用循环遍历数组中的元素

			for (int i = 0; i < 2; i++) {               //遍历每一行
				
				for (int j = 0; j < 3; j++) {       //遍历每一列
					Console.WriteLine (intArray1 [i, j]);
				} 
			}

			//使用foreach遍历输出        foreach(数组数据类型  临时变量名  in 数组名){Console.WriteLine(临时变量名);}
			foreach (int ss in intArray1 ) {
				Console.WriteLine (ss);
			}   
		} 
	}
}

其他补充知识点:

using System;  
namespace Lesson01 {  

	class MainClass {     

		public static void Main ( string[] args ) {  
		   
			int[] num1 = new int[]{1,2,3,4,5};    
			int[] num2 = new int[5]{6,7,8,9,10}; 

			//Array.Copy——将元素从一个数组Copy到另一个数组,后面数字表示到指定位置结束.
			Array.Copy(num1,num2,4);  
			foreach(int i in num2)     {   
				Console.Write(i); 
				}

			//Reverse——方向输出数组
			Array.Reverse(num1);
			foreach (int n in num1) {
				Console.Write (n);
			} 
		}
	}
}

字典

①基础知识点:

1、Dictionary是存储键和值的集合;

2、Dictionary是无序的,键Key是唯一的;

3、通过Key找到对应的Value,游戏中通常通过使用ID,ID关联用户的所有信息,从而找到玩家的其他游戏信息。

②优点:

查找速度快,能根据键快速查找值。

③缺点:

内存开销大。

using System.Collections.Generic;//引用泛型集合空间命名    

namespace Lesson01 {

class MainClass  { 
	
	public static void Main ( string[] args ) {    
		
		Dictionary <string,int> dic = new Dictionary <string,int> ();  //创建一个字典对象,Key类型是string,Value类型是int 

		dic.Add ("Sullivan",23);       //Add添加键值对   

		dic.Remove("Sullivan");       //从字典中移除键值对   

		dic.Clear;                    //清空当前字典     

		int count = dic.Count;        //获取当前字典中KeyValue的个数       

		Console.WriteLine ("当前字典中有" + count + "个KeyValue");     

		bool b = dic.ContainsKey("Sun");            //检查字典中是否包含指定的Key        
		bool c = dic.ContainsValue(22);             //检查字典中是否包含指定的Value  

		int s;                                      //尝试获取指定的Key所对应的Value  

		bool bb = dic.TryGetValue ("Sun",out s);    //若当前字典中包含Sun这个Key,则获取对应的Value并保存在s中,bb=true;     
			                                    //若当前字典中不包含Sun这个Key,则s=null,,bb=false;   

		int age = dic ["Sullivan"];                 //通过Key获取Value            
		Console.WriteLine (age);          
	    }   
    }
}


链表

①基础知识点:

②优点:

1、链表在内存存储的排序上不连续,而是靠各对象的指针所决定,添加元素和删除元素比数组优势;

2、链表适合在需要有序的排序的情境下增加新的元素,增加新的元素只是若干元素的指向发生变化。

③缺点:

其在内存空间中不一定连续排列,访问时无法利用下标,必须从头结点开始,逐次遍历下一个节点直到寻找到目标,不适用于需要快速访问对象的情况。


哈希表

①基础知识点:

②优点:

1、数据存储和查找时间短;

2、添加数据效率高。

③缺点:

以空间换时间,需要消耗更多的内存。

using System;
using System.Collections;        //使用Hashtable时,必须引入命名空间
class Program
{
	public static void Main()
	{
		Hashtable ht = new Hashtable();         //创建Hashtable实例
		ht.Add("福州", "省会");                 //添加keyvalue键值对
		ht.Add("福大", "南方清华");
		ht.Add("苏利文", "好学的小白");

		string capital = (string)ht["福州"];
		Console.WriteLine(ht.Contains("福大")); //判断哈希表是否包含特定键,其返回值为true或false
		Console.WriteLine(ht["福大"]);
		ht.Remove("福州");                      //移除一个keyvalue键值对
		ht.Clear();                             //移除所有元素
	}
}
CSDN上还有很多博主对哈希表有更加详细的讲解,这里推荐两个基础的讲解,想要深入了解的可以阅读更多博主的博客讲解内容。

http://blog.csdn.net/erlian1992/article/details/44887631

http://blog.csdn.net/maggie_j/article/details/52186227

猜你喜欢

转载自blog.csdn.net/love4399/article/details/77558928