前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC

ASP.NET MVC的Model元数据与Model模板:将”ListControl”引入ASP.NET MVC

作者头像
蒋金楠
发布于 2018-01-15 04:01:05
发布于 2018-01-15 04:01:05
4.9K0
举报
文章被收录于专栏:大内老A大内老A

我们不仅可以创建相应的模板来根据Model元数据控制种类型的数据在UI界面上的呈现方法,还可以通过一些扩展来控制Model元数据本身。在某些情况下通过这两者的结合往往可以解决很多特殊数据的呈现问题,我们接下来演示的实例就是典型的例子。[本文已经同步到《How ASP.NET MVC Works?》中]

传统的ASP.NET具有一组重要的控件类型叫做列表控件(ListControl),它的子类包括DropDownList、ListBox、RadioButtonList和CheckBoxList等。对于ASP.NET MVC来说,我们可以通过HtmlHelper/HtmlHelper<TModel>的扩展方法DropDownList/DropDownListFor和ListBox/ListBox在界面上呈现一个下拉框和列表框,但是我们需要手工指定包含的所有列表选项。在一般的Web应用中,尤其是企业应用中,我们会选择将这些列表进行单独地维护,如果我们在构建“列表控件”的时候能够免去手工提供列表的工作,这无疑会为开发带来极大的遍历,而这实际上很容易实现。[源代码从这里下载]

一、实现的效果

我们先来看看通过该扩展最终实现的效果。在通过Visual Studio的ASP.NET MVC项目模板创建的空Web应用中,我们定义一个作为Model表示员工的Employee类型。如下面的代码片断所示,表示性别、学历、部门和技能的属性分别应用了RadioButtonListAttribute、DropdownListAttribute、ListBoxAttribute和CheckBoxListAttribubte四个特性。从名称可以看出来,这四个特性分别代表了目标元素呈现在UI界面上的形式,即对应着传统ASP.NET Web应用中的四种类型的列表控件:RadioButtonList、DropdownList、ListBox和CheckBoxList。特性中指定的字符串表示预定义列表的名称。

代码语言:js
AI代码解释
复制
   1: public class Employee
   2: {
   3:     [DisplayName("姓名")]
   4:     public string Name { get; set; }
   5:  
   6:     [RadioButtonList("Gender")]
   7:     [DisplayName("性别")]
   8:     public string Gender { get; set; }
   9:  
  10:     [DropdownList("Education")]
  11:     [DisplayName("学历")]
  12:     public string Education { get; set; }
  13:  
  14:     [ListBox("Department")]
  15:     [DisplayName("所在部门")]
  16:     public IEnumerable<string> Departments { get; set; }
  17:  
  18:     [CheckBoxList("Skill")]
  19:     [DisplayName("擅长技能")]
  20:     public IEnumerable<string> Skills { get; set; }
  21: }

在创建的默认HomeController中,我们定义了如下一个Index操作方法。在该方法中,我们创建了一个具体的Employee对象并对它的所有属性进行了相应设置,最终将该对象呈现在默认的View中。

代码语言:js
AI代码解释
复制
   1: public class HomeController : Controller
   2: {
   3:     public ActionResult Index()
   4:     {
   5:         Employee employee = new Employee
   6:         {
   7:             Name       = "张三",
   8:             Gender     = "M",
   9:             Education  = "M",
  10:             Departments= new string[] { "HR", "AD" },
  11:             Skills     = new string[] { "CSharp", "AdoNet" }
  12:         };
  13:         return View(employee);
  14:     }
  15: }

如下所示的是上面的Index操作对应的View定义,这是一个以Model类型为Employee的强类型View,我们通过调用HtmlHelper<TModel>的模板方法EditorFor将作为Model的Employee对象的所有属性以编辑模式呈现出来。

代码语言:js
AI代码解释
复制
   1: @model Employee
   2: <table>
   3:     <tr>
   4:         <td>@Html.LabelFor(m => m.Name)</td><td>@Html.EditorFor(m => m.Name)</td>
   5:     </tr>
   6:       <tr>
   7:         <td>@Html.LabelFor(m => m.Gender)</td><td>@Html.EditorFor(m => m.Gender)</td>
   8:     </tr>
   9:       <tr>
  10:         <td>@Html.LabelFor(m => m.Education)</td><td>@Html.EditorFor(m => m.Education)</td>
  11:     </tr>
  12:      <tr>
  13:         <td>@Html.LabelFor(m => m.Departments)</td><td>@Html.EditorFor(m => m.Departments)</td>
  14:     </tr>
  15:      <tr>
  16:         <td>@Html.LabelFor(m => m.Skills)</td><td>@Html.EditorFor(m => m.Skills)</td>
  17:     </tr>    
  18: </table>

下图体现了该Web应用运行时的效果。我们可以看到,四个属性分别以四种不同的“列表控件”呈现出来,并且对应在它们上面的四个字定义的列表特性(RadioButtonListAttribute、DropdownListAttribute、ListBoxAttribute和CheckBoxListAttribubte)。

二、ListItem与ListProvider

现在对体现在上面演示实例的基于列表数据的UI定制的设计进行简单地介绍。我们首先来定义如下一个表示列表中某个条目(列表项)的类型ListItem,简单起见,我们紧紧定义Text和Value两个属性,它们分别表示显示的文字和代表的值。比如对于一组表示国家的列表,列表项的Text属性表示成国家名称(比如“中国”),具体的值则可能是国家的代码(比如“CN”)。

代码语言:js
AI代码解释
复制
   1: public class ListItem
   2: {
   3:     public string Text { get; set; }
   4:     public string Value { get; set; }
   5: }

我们将提供列表数据的组件称为ListProvider,它们实现了IListProvider接口。如下面的代码片断所示,IListProvider具有唯一的方法GetListItems根据指定的列表名称获取所有的列表项。通过实现IListProvider,我们定义了一个默认的DefaultListProvider。简单起见,DefaultListProvider直接通过一个静态字段模拟列表的存储,在真正的项目中一般会保存在数据库中。DefaultListProvider维护了四组列表,分别表示性别、学历、部门和技能,它们正好对应着Employee的四个属性。

代码语言:js
AI代码解释
复制
   1: public interface IListProvider
   2: {
   3:     IEnumerable<ListItem> GetListItems(string listName);
   4: }
   5: public class DefaultListProvider : IListProvider
   6: {
   7:     private static Dictionary<string, IEnumerable<ListItem>> listItems = new Dictionary<string, IEnumerable<ListItem>>();
   8:     static DefaultListProvider()
   9:     {
  10:         var items = new ListItem[]{
  11:         new ListItem{ Text = "男", Value="M"},
  12:         new ListItem{ Text = "女", Value="F"}};
  13:         listItems.Add("Gender", items);
  14:  
  15:         items = new ListItem[]{            
  16:         new ListItem{ Text = "高中", Value="H"}  , 
  17:         new ListItem{ Text = "大学本科", Value="B"},
  18:         new ListItem{ Text = "硕士", Value="M"} ,                
  19:         new ListItem{ Text = "博士", Value="D"}};
  20:         listItems.Add("Education", items);
  21:  
  22:         items = new ListItem[]{            
  23:         new ListItem{ Text = "人事部", Value="HR"}  , 
  24:         new ListItem{ Text = "行政部", Value="AD"},
  25:         new ListItem{ Text = "IT部", Value="IT"}};
  26:         listItems.Add("Department", items);
  27:  
  28:         items = new ListItem[]{            
  29:         new ListItem{ Text = "C#", Value="CSharp"}  , 
  30:         new ListItem{ Text = "ASP.NET", Value="AspNet"},
  31:         new ListItem{ Text = "ADO.NET", Value="AdoNet"}};
  32:         listItems.Add("Skill", items);
  33:     }
  34:     public IEnumerable<ListItem> GetListItems(string listName)
  35:     {
  36:         IEnumerable<ListItem> items;
  37:         if (listItems.TryGetValue(listName, out items))
  38:         {
  39:             return items;
  40:         }
  41:         return new ListItem[0];
  42:     }
  43: }

接下来我们定义如下一个ListProviders类型,它的静态只读属性Current表示当前的ListProvider,而对当前ListProvider的注册通过静态方法SetListProvider来实现。如果没有对当前ListProvider进行显式注册,则默认采用DefaultListProvider。

代码语言:js
AI代码解释
复制
   1: public static class ListProviders
   2: {
   3:     public static IListProvider Current { get; private set; }
   4:     static ListProviders()
   5:     {
   6:         Current = new DefaultListProvider();
   7:     }
   8:     public static void SetListProvider(Func<IListProvider> providerAccessor)
   9:     {
  10:         Current = providerAccessor();
  11:     }
  12: }

三、通过对HtmlHelper/HtmlHelper<TModel>的扩展生成“ListControl”的HTML

基于四种“列表控件”的HTML生成是通过定义HtmlHelper的扩展方法来实现的,如下面的代码所示,定义在ListControlExtensions中的四个扩展方法实现了针对这四种列表控件的UI呈现。参数listName表示使用的预定义列表的名称,而value和values则表示绑定的值。RadioButtonList/DropdownList只允许单项选择,而ListBox/CheckBoxList允许多项选择,所以对应的值类型分别是string和IEnumerable<string>。

代码语言:js
AI代码解释
复制
   1: public static class ListControlExtensions
   2: {
   3:     //其他成员
   4:    public static MvcHtmlString RadioButtonList( this HtmlHelper htmlHelper,string name, string listName, string value)
   5:     {
   6:         return RadioButtonCheckBoxList(htmlHelper, listName, item => 
   7:            htmlHelper.RadioButton(name, item.Value, value == item.Value));
   8:     }        
   9:  
  10:     public static MvcHtmlString CheckBoxList(this HtmlHelper htmlHelper, string name, string listName, IEnumerable<string> values)
  11:     {
  12:         return RadioButtonCheckBoxList(htmlHelper, listName, item => CheckBoxWithValue(htmlHelper, name,  values.Contains(item.Value), item.Value));
  13:     }
  14:  
  15:     public static MvcHtmlString ListBox(this HtmlHelper htmlHelper, string name, string listName, IEnumerable<string> values)
  16:     {
  17:         var listItems = ListProviders.Current.GetListItems(listName);
  18:         List<SelectListItem> selectListItems = new List<SelectListItem>();
  19:         foreach (var item in listItems)
  20:         {
  21:             selectListItems.Add(new SelectListItem { Value = item.Value, 
  22:                 Text = item.Text, 
  23:                 Selected = values.Any(value => value == item.Value) });
  24:         }
  25:         return htmlHelper.ListBox(name, selectListItems);
  26:     }
  27:  
  28:     public static MvcHtmlString DropDownList(this HtmlHelper htmlHelper, string name, string listName, string value)
  29:     {
  30:         var listItems = ListProviders.Current.GetListItems(listName);
  31:         List<SelectListItem> selectListItems = new List<SelectListItem>();
  32:         foreach (var item in listItems)
  33:         {
  34:             selectListItems.Add(new SelectListItem { Value = item.Value, 
  35:                 Text = item.Text, Selected = value == item.Value});
  36:         }
  37:         return htmlHelper.DropDownList(name, selectListItems);
  38:     }
  39: }

从上面的代码片断可以看到,在ListBox和DropDownList方法中我们通过当前的ListProvider获取指定列表名称的所有列表项并生成相应的SelectListItem列表,最终通过调用HtmlHelper现有的扩展方法ListBox和DropDownList实现HTML的呈现。而RadioButtonList和MvcHtmlString最终调用了辅助方法RadioButtonCheckBoxList显示了最终的HTML生成,该方法定义如下。

代码语言:js
AI代码解释
复制
   1: public static class ListControlExtensions
   2: {
   3:     public static MvcHtmlString CheckBoxWithValue(this HtmlHelper htmlHelper, string name, bool isChecked, string value)
   4:     {
   5:         string fullHtmlFieldName = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(name);
   6:         ModelState modelState;
   7:  
   8:         //将ModelState设置为表示是否勾选布尔值
   9:         if (htmlHelper.ViewData.ModelState.TryGetValue(fullHtmlFieldName, out modelState))
  10:         {
  11:             htmlHelper.ViewData.ModelState.SetModelValue(fullHtmlFieldName, new ValueProviderResult(isChecked, isChecked.ToString(), CultureInfo.CurrentCulture));
  12:         }
  13:         MvcHtmlString html;
  14:         try
  15:         {
  16:             html = htmlHelper.CheckBox(name, isChecked);
  17:         }
  18:         finally
  19:         {
  20:             //将ModelState还原
  21:             if (null != modelState)
  22:             {
  23:                 htmlHelper.ViewData.ModelState[fullHtmlFieldName] = modelState;
  24:             }
  25:         }
  26:         string htmlString = html.ToHtmlString();
  27:         var index = htmlString.LastIndexOf('<');
  28:         //过滤掉类型为"hidden"的<input>元素
  29:         XElement element = XElement.Parse(htmlString.Substring(0, index));
  30:         element.SetAttributeValue("value", value);
  31:         return new MvcHtmlString(element.ToString());
  32:     }
  33:  
  34:     private static MvcHtmlString RadioButtonCheckBoxList(HtmlHelper htmlHelper, string listName, Func<ListItem, MvcHtmlString> elementHtmlAccessor)
  35:     {
  36:         var listItems = ListProviders.Current.GetListItems(listName);
  37:         TagBuilder table = new TagBuilder("table");
  38:         TagBuilder tr = new TagBuilder("tr");
  39:         foreach (var listItem in listItems)
  40:         {
  41:             TagBuilder td = new TagBuilder("td");
  42:             td.InnerHtml += elementHtmlAccessor(listItem).ToHtmlString();
  43:             td.InnerHtml += listItem.Text;
  44:             tr.InnerHtml += td.ToString();
  45:         }
  46:         table.InnerHtml = tr.ToString();
  47:         return new MvcHtmlString(table.ToString());
  48:     }
  49: }

方法RadioButtonCheckBoxList在生成RadioButtonList和CheckBoxList的时候才用<table>进行布局。组成RadioButtonList的单个RadioButton最终是调用HtmlHelper现有的扩展方法RadioButton生成的,而CheckBoxList中的CheckBox则是通过调用我们自定义的CheckBoxWithValue方法生成的。CheckBoxWithValue最终还是调用HtmlHelper现有的扩展方法CheckBox生成单个CheckBox对应的HTML,但是方法值支持布尔值的绑定,并且会生成一个在这里不需要的Hidden元素,所以我们不得不在调用该方法的前后作一些手脚。

四、ListAttribute

现在我们来介绍应用在Employee属性上的四个特性的定义。如下面的代码片断所示,基于四种“列表控件”的特性均继承自抽象特性ListAttribute。ListAttribute实现了IMetadataAware接口,在实现的OnMetadataCreated方法中将在构造函数中指定的代表列表名称的ListName属性添加到表示Model元数据的ModelMetadata对象的AdditionalValues属性中。四个具体的列表特性重写了OnMetadataCreated方法,并在此基础上将ModelMetadata的TemplateHint分别设置为DropdownList、ListBox、RadioButtonList和CheckBoxList。

代码语言:js
AI代码解释
复制
   1: [AttributeUsage(AttributeTargets.Property)]
   2: public abstract class ListAttribute : Attribute, IMetadataAware
   3: {
   4:     public string ListName { get; private set; }        
   5:     public ListAttribute(string listName)
   6:     {
   7:         this.ListName = listName;
   8:     }
   9:     public virtual void OnMetadataCreated(ModelMetadata metadata)
  10:     {
  11:         metadata.AdditionalValues.Add("ListName", this.ListName);
  12:     }
  13: }
  14:  
  15: [AttributeUsage(AttributeTargets.Property)]
  16: public class DropdownListAttribute : ListAttribute
  17: {
  18:     public DropdownListAttribute(string listName)
  19:         : base(listName)
  20:     { }
  21:     public override void OnMetadataCreated(ModelMetadata metadata)
  22:     {
  23:         base.OnMetadataCreated(metadata);
  24:         metadata.TemplateHint = "DropdownList";
  25:     }
  26: }
  27:  
  28: [AttributeUsage(AttributeTargets.Property)]
  29: public class ListBoxAttribute : ListAttribute
  30: {
  31:     public ListBoxAttribute(string listName)
  32:         : base(listName)
  33:     { }
  34:     public override void OnMetadataCreated(ModelMetadata metadata)
  35:     {
  36:         base.OnMetadataCreated(metadata);
  37:         metadata.TemplateHint = "ListBox";
  38:     }
  39: }
  40:  
  41: [AttributeUsage(AttributeTargets.Property)]
  42: public class RadioButtonListAttribute : ListAttribute
  43: {
  44:     public RadioButtonListAttribute(string listName)
  45:         : base(listName)
  46:     { }
  47:  
  48:     public override void OnMetadataCreated(ModelMetadata metadata)
  49:     {
  50:         base.OnMetadataCreated(metadata);
  51:         metadata.TemplateHint = "RadioButtonList";
  52:     }
  53: }
  54:  
  55: [AttributeUsage(AttributeTargets.Property)]
  56: public class CheckBoxListAttribute : ListAttribute
  57: {
  58:     public CheckBoxListAttribute(string listName)
  59:         : base(listName)
  60:     { }
  61:  
  62:     public override void OnMetadataCreated(ModelMetadata metadata)
  63:     {
  64:         base.OnMetadataCreated(metadata);
  65:         metadata.TemplateHint = "CheckBoxList";
  66:     }
  67: }

五、模板View的定义

由于四个具体的ListAttribute已经对表示模板名称的ModelMetadata的TemplateHint进行了设置,那么我们针对它们定义相应的分部View作为对应的模板,那么在调用HtmlHelper/HtmlHelper<TModel>相应模板方法的时候就会按照这些模板对目标元素进行呈现。实现如上图所示的效果的四个模板定义如下,它们被保存在View\Shared\EditorTemplates目录下面。

代码语言:js
AI代码解释
复制
   1: DropdownList.cshtml:
   2: @model string
   3: @{    
   4:     string listName = (string)ViewData.ModelMetadata.AdditionalValues["ListName"];
   5:     @Html.DropDownList("",listName,Model)
   6: }
   7:  
   8: ListBox.cshtml:
   9: @model IEnumerable<string>
  10: @{    
  11:     string listName = (string)ViewData.ModelMetadata.AdditionalValues["ListName"];
  12:     @Html.ListBox("",listName,Model)   
  13: }
  14:  
  15: RadioButtonList.cshtml:
  16: @model string
  17: @{    
  18:     string listName = (string)ViewData.ModelMetadata.AdditionalValues["ListName"];
  19:     @Html.RadioButtonList("",listName,Model)
  20: }
  21:  
  22: CheckBoxList.cshtml:
  23: @model IEnumerable<string>
  24: @{    
  25:     string listName = (string)ViewData.ModelMetadata.AdditionalValues["ListName"];
  26:     @Html.CheckBoxList("", listName, Model)
  27:  }

ASP.NET MVC的Model元数据与Model模板:预定义模板 ASP.NET MVC的Model元数据与Model模板:模板的获取与执行策略 ASP.NET MVC的Model元数据与Model模板:将ListControl引入ASP.NET MVC

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2012-05-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
李兴华Java核心技术讲解--类集框架笔记
3.1、认识类集(理解) 如果现在要想保存多个对象,肯定使用对象数组完成,但是对象数组本身有一个最大的问题在于其数据的长度,所以后来使用了链表完成了动态对象数组的开发,可是链表的开发难度实在是很大,而且如果一个链表要想真正去使用,只依靠之前所编写的还不够,还需要进行一些代码的调优。 而在JDK 1.2之后正式引入了类集的概念,类集是一种动态的对象数组,属于各个数据结构的实现类,在整个类集之中主要的组成是一些核心的操作接口:Collection、List、Set、Map、Iterator、Enumeration。 3.2、单值保存的最大父接口:Collection(重点) 所谓的单值保存指的是每一次操作只会保存一个对象,就好像之前的链表程序一样,每一次只保存了一个对象,在Collection接口之中定义了如下的一些操作方法。 No. 方法名称 类型 描述 1 public boolean add(E e) 普通 数据增加 2 public void clear() 普通 清除数据 3 public boolean contains(Object o) 普通 查找数据是否存在 4 public boolean isEmpty() 普通 判断是否为空集合 5 public Iterator iterator() 普通 为Iterator接口实例化 6 public boolean remove(Object o) 普通 删除数据 7 public int size() 普通 取得集合的个数 8 public Object[] toArray() 普通 将集合变为对象数组 在Collection接口之中一共定义了15个方法,在所有的方法之中,只有两个方法最为常用:add()、iterator()。不过从开发上讲,很少会去直接使用Collection,都会使用Collection的两个子接口:List、Set。 3.3、允许重复的子接口:List(重点,80%) List是Collection的一个最为常用的子接口,首先这个接口的定义如下: public interface List extends Collection 但是List接口对Collection接口进行了大量的扩充,但是扩充之后的主要方法: No. 方法名称 类型 描述 1 public E get(int index) 普通 取得指定索引位置上的数据 2 public E set(int index, E element) 普通 修改指定索引位置上的数据 3 public ListIterator listIterator() 普通 为ListIterator接口实例化 但是以上的三个方法,只是针对于List接口起作用,而List接口有两个常用子类:ArrayList、Vector。 3.3.1、新的子类:ArrayList,95% ArrayList是List子接口使用最多的一个子类,而这个类的定义如下: public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, Serializable 按照面向对象的概念来讲,现在使用ArrayList主要的目的是为List接口实例化,所有的操作方法都以List接口为主。 范例:使用ArrayList进行List接口的功能验证 package cn.mldn.demo; import java.util.ArrayList; import java.util.List; public class TestDemo { public static void main(String[] args) throws Exception { List all = new ArrayList() ; all.add(“Hello”) ; all.add(“Hello”) ; // 内容重复了 all.add(“World”) ; for (int x = 0; x < all.size(); x++) { String str = all.get(x) ; // get()方法只有List接口有 System.out.print(str + “、”); } } } 在使用代码的时候可以发现,List集合之中即使存在了重复数据,也可以正常的保存,而且数据保存的顺序就是存入数据的顺序。 范例:使用List集合修改之前的程序 package cn.mldn.demo; import java.util.ArrayList; import java.util.List; interfac
葆宁
2019/04/18
6300
Java笔记(3)
三种通用的遍历方式: 迭代器:在遍历的过程中需要删除元素,请使用迭代器。 增强for、Lambda: 仅仅想遍历,那么使用增强for或Lambda表达式
用户11062199
2024/05/31
890
HashMap的知识回顾
fail-fast是集合世界中错误检测机制,通常出现在集合元素的遍历过程中, java.util包下所有的类都是fail-fast,而concurrent包中的集合都是fail-safe
在水一方
2022/06/14
2220
HashMap的知识回顾
java---集合(数据结构)(重点)
以前存储一组相同类型的数据使用数组,固定大小,具有连续性的存储空间。比如,5个长度的数组再存入数据时,如果现在已经存满,存入第六个元素,这时数组空间不够,扩容。Arrays.copyOf() , 很不方便,如果扩容频率太高,也影响你程序运行效率。集合来解决数组固定,如果扩容又影响效率的问题
用户10787181
2023/10/17
2530
java---集合(数据结构)(重点)
HashMap详解
**Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。**这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
程序员阿杜
2023/08/25
2820
面试中最长常问到的 HashMap,你都知道多少?
推荐阅读:https://zhuanlan.zhihu.com/p/31610616
村雨遥
2020/08/13
3560
面试被问到HashMap 底层原理?看完这边文章绝对不慌!
存储:put 方法 put(key,value) 查询 : get 方法 get(key) java 代码如下
全栈程序员站长
2022/08/31
2790
Java开发知识之Java中的Map结构
  Map没有实现Collection接口,提供的是Key 到Value的映射. Map中.不能包含相同的Key,每个Key只能映射一个Value的值. 相当于就是 一一对应关系. 比如你有老婆,你是老公, 一个老公只能有一个老婆(在中国^_^),Kery还决定了存储对象在映射中的存储位置.但不是由Key对象本身决定的.而是一种散列技术进行处理.产生一个散列码的证书值.简单来说就是通过一串算法.算出的一个不会相同的值.
IBinary
2019/05/25
5920
java_Collection、Map、泛型的使用
集合按照其存储结构可以分为两大类,分别是 单列集合 java.util.Collection 双列集合 java.util.Map
咕咕星
2020/08/19
1.2K0
java_Collection、Map、泛型的使用
Java类集框架详细汇总
Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾;
BUG弄潮儿
2021/04/12
7220
这可能是最细的HashMap详解了!
# 手撕HashMap源码 > 文章已同步至GitHub开源项目: [Java超神之路](https://github.com/shaoxiongdu/java-notes) ### HashMap一直是面试的重点。今天我们来了解了解它的源码吧! > 首先看一下Map的继承结构图 ![image-20210906151448379](https://gitee.com/ShaoxiongDu/imageBed/raw/master/image-20210906151448379.png) > 源码
程序员阿杜
2021/09/11
2560
第十四届蓝桥杯集训——HashMap(无序)与TreeMap(有序)
HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。
红目香薰
2023/01/13
2240
第十四届蓝桥杯集训——HashMap(无序)与TreeMap(有序)
Java进阶-集合(2)
Map是一种键-值对(key-value)集合, 集合中的每一个元素都包含一个键(key)对象和一个值(value)对象。用于保存具有映射关系的数据(Map是一种映射表,可以通过key快速查找value)。
reload
2024/02/28
1960
Java进阶-集合(2)
Java中的Map双边队列
键(Key)值(Value)对 邓超 = 娘娘 贝克汉姆 = 维多利亚 黄磊 = 孙莉 吴京 = 谢楠
用户7073689
2020/03/18
1.1K0
Java知识梳理 | 详析三大集合类(附实用例程 + 实践练习题)
1.3. 常用的集合有List集合、Set集合和Map集合;   List与Set继承了Collection接口,各接口还提供了不同的实现类。 常用集合类的继承关系如下:
凌川江雪
2019/01/28
1.3K0
JavaSE集合(八)之Map
前面给大家介绍了集合家族中的Collection家族,这一篇给大家分享的是集合中的另一个家族就是Map家族。以前的时候学习Map的时候没有很认真的去学习,我觉得很多东西还是不是很清楚。 这次我将总结的非常详细。程序员的道理里,我们风雨无阻! 一、Map接口 1.1、Map概述   Map 的字面翻译是映射(地图就是一种映射)。将键映射到值的对象,一个映射不能包含重复的键(如果有添加有重复的键,后面的会覆盖掉前面的,但是如果是自定义类型必须重写hashCode()和equals()方法),每个键最多只能映射到
用户1195962
2018/01/18
9660
JavaSE集合(八)之Map
Java——类集框架:Map集合的详解及应用举例(HashMap、Hashtable、TreeMap)
Map保存的是二元偶对象,简单说就是两个值,key和value。使用中可以通过key查找到value数据,使用Map可以方便用户查询。
Winter_world
2022/05/08
4210
Java——类集框架:Map集合的详解及应用举例(HashMap、Hashtable、TreeMap)
BAT面试必问HashMap源码分析
HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。
美的让人心动
2019/05/21
3210
BAT面试必问HashMap源码分析
JAVA知识回顾之Java8 Merge
putIfAbsent()是必要的,否则代码会在第一次出现未知的单词时中断,另外map.get(word) 里面map.put() 有点尴尬。
Jetpropelledsnake21
2022/09/29
3230
Map集合实例练习一
Map集合的特点,如是否可重复,是否有序仅作用在键上,如HashMap集合的键不得重复,值可以重复。
全栈程序员站长
2022/09/02
4300
相关推荐
李兴华Java核心技术讲解--类集框架笔记
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档