泛型

Java反射

萝らか妹 提交于 2019-12-06 00:11:39
类的加载 java运行的都是类 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现这个类进行初始化。 加载 加载,是指Java虚拟机查找字节流(查找.class文件),并且根据字节流创建java.lang.Class对象的过程。这个过程,将类的.class文件中的二进制数据读入内存,放在运行时区域的方法区内。然后在堆中创建java.lang.Class对象,用来封装类在方法区的数据结构。 类加载阶段: (1)Java虚拟机将.class文件读入内存,并为之创建一个Class对象。 (2)任何类被使用时系统都会为其创建一个且仅有一个Class对象。 (3)这个Class对象描述了这个类创建出来的对象的所有信息,比如有哪些构造方法,都有哪些成员方法,都有哪些成员变量等。 连接 链接包括验证、准备以及解析三个阶段。 验证阶段 :主要的目的是确保被加载的类(.class文件的字节流)满足Java虚拟机规范,不会造成安全错误。 准备阶段 :负责为类的静态成员分配内存,并设置默认初始值。 解析阶段 :将类的二进制数据中的符号引用替换为直接引用。 说明: 符号引用。即一个字符串,但是这个字符串给出了一些能够唯一性识别一个方法,一个变量,一个类的相关信息。 直接引用。可以理解为一个内存地址,或者一个偏移量。比如类方法,类变量的直接引用是指向方法区的指针

MVC视图中扩展helper(泛型绑定Model)

本秂侑毒 提交于 2019-12-06 00:02:26
@functions{ public HelperResult EditBoxFor<TModel, TKey>(HtmlHelper<TModel> html, Expression<Func<TModel, TKey>> expression, bool disabled = false) { return EditBox( html.LabelFor(expression, htmlAttributes: new { @class = "col-md-3 control-label" }), disabled ? html.EditorFor(expression, new { htmlAttributes = new { @class = "form-control", disabled = "" } }) : html.EditorFor(expression, new { htmlAttributes = new { @class = "form-control" } }), html.ValidationMessageFor(expression, "", new { @class = "text-danger" }) ); } } @helper EditBox(MvcHtmlString label, MvcHtmlString editor,

Java反射获取泛型类型

元气小坏坏 提交于 2019-12-05 23:04:31
本文链接: https://blog.csdn.net/hongxingxiaonan/article/details/49202613 在Java反射技术的应用中,取得一个类的成员、方法和构造函数相对比较容易,但是要想取得其中包含的泛型类型则相对困难一些。先看一个简单的例子,然后详细说明每个步骤的作用。 public class Demo { private List<Integer> list1; private List<Set<Integer>> listSet; public Set<String> fun1(Map<Integer, String> map){return null;} public static void getFieldGenericType() { try { Class clazz = Demo.class; Field field = clazz.getDeclaredField("list1"); Type type = field.getGenericType(); //取得field的type ParameterizedTypeImpl parameterizedType = (ParameterizedTypeImpl) type; //强转成具体的实现类 Type[] genericTypes = parameterizedType

.Net 中HashTable,HashMap 和 Dictionary<key,value> 和List<T>和DataTable的比较

一笑奈何 提交于 2019-12-05 20:15:26
.Net 中HashTable,HashMap 和 Dictionary<key,value> 和List 和DataTable的比较 转载自http://www.cnblogs.com/jilodream/p/4219840.html (一)HashTable 和Dic 数据结构 Hashtable和Dictionary从数据结构上来说都属于Hashtable(哈希表),都是对关键字(键值)进行散列操作,将关键字散列到Hashtable的某一个槽位中去,不同的是处理碰撞的方法。散列函数有可能将不同的关键字散列到Hashtable中的同一个槽中去,这个时候我们称发生了碰撞,为了将数据插入进去,我们需要另外的方法来解决这个问题。 采用链表法的是Dic 而采用开放寻址法(open addressing)-中 双重散列的方法的是 HashTable 至于这两种数据结构的使用方法 请自行阅读算法导论 或者参照网上博客 但从底层的数据结构可以发现 如果增删的动作很多的话 推荐使用Dic 因为解决碰撞的方式 是List.Add 如果改动的动作很少 查询的动作很多的话 则推荐 使用HashTable 因为映射查找之后 只需要跳跃查找到 碰撞后移动数据即可,另外当增加数据太多时,开放寻址的扩容很耗费性能(请阅读<算法导论>) Dic 和HashTable使用比较 1:单线程程序中推荐使用

Java泛型-类型擦除

天涯浪子 提交于 2019-12-05 20:00:26
一、概述 Java泛型在使用过程有诸多的问题,如不存在List<String>.class, List<Integer>不能赋值给List<Number>(不可协变),奇怪的ClassCastException等。 正确的使用Java泛型需要深入的了解Java的一些概念,如协变,桥接方法,以及这篇笔记记录的类型擦除。Java泛型的处理几乎都在编译器中进行,编译器生成的bytecode是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。 二、编译器如何处理泛型? 通常情况下,一个编译器处理泛型有两种方式: 1.Code specialization。在实例化一个泛型类或泛型方法时都产生一份新的目标代码(字节码or二进制代码)。例如,针对一个泛型list,可能需要 针对string,integer,float产生三份目标代码。 2.Code sharing。对每个泛型类只生成唯一的一份目标代码;该泛型类的所有实例都映射到这份目标代码上,在需要的时候执行类型检查和类型转换。 C++中的模板(template)是典型的Code specialization实现。C++编译器会为每一个泛型类实例生成一份执行代码。执行代码中integer list和string list是两种不同的类型。这样会导致代码膨胀(code bloat),不过有经验的C+

轻触开源(二)-Gson项目源码解析_壹

怎甘沉沦 提交于 2019-12-05 19:45:56
上篇文章<轻触开源-Java泛型Type类型的应用和实践(一)> https://my.oschina.net/u/874727/blog/747427 非墨写到JAVA的泛型机制,被用到很多的开源项目。在众多的开源项目中,Gson是很具有代表性的一个。Gson是Google公司编写的一套用于Json数据转化为Java对象的一套通用工具库。之所以说它是通用工具库,是因为它的实现代码全部基于最基础的Java运行时环境,而不依赖于任何系统平台,也就是说你不仅可以在J2EE项目中应用它,你一样可以很容易的在Android,J2ME等等平台中直接应用它。 Gson跟很多的开源操纵了Java内部数据类型的项目相同,为了方便记录类型数据,Gson会将Java原有的一套数据类型,转化为自己的内部数据类型。比如,在上一章我们提到的在Java泛型中记录类型的Class和Type类型,就被Gson转化为TypeToken。WildcardType转化为Gson自己的WildcardTypeImpl,GenericArrayType转为了Gson的内部类型GenericArrayTypeImpl。而这些类型的定义都被记录在com.google.gson.internal包中。我们从这个包名也看的很明白,就是Gson系统将一些转换的细节屏蔽到Gson项目的内部,而只暴露给用户一些简单的接口。

JavaSE--简答题5

瘦欲@ 提交于 2019-12-05 16:29:08
Vector和ArrayList的区别和联系。答:一.同步性:Vector是 线程安全 的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的. 二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半 请你简述HashMap和Hashtable的区别?答: 1、继承的父类不同 Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。 2、线程安全性不同 hashTable安全(出现的早) 3、是否提供contains方法 HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。 Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。 4、key和value是否允许null值 其中key和value都是对象,并且不能包含重复key,但可以包含重复的value。 通过上面的ContainsKey方法和ContainsValue的源码我们可以很明显的看出: Hashtable中,key和value都不允许出现null值

Java基础__Java中集合类

浪子不回头ぞ 提交于 2019-12-05 14:21:21
  ArrayList:有序、可重复、线程不安全、内部使用数组进行存储   LinkedList:有序、可重复、线程不安全、内部使用引用进行存储【可以很方便的进行插入、删除数据】   Vector:有序、可重复、线程安全   HastSet:无序、不可重复(自动去重)      TreeSet存放数据是有序的     HashSet存放数据是无序的 一、ArrayList集合类的简单创建和使用   创建一个集合对象   ArrayList arr = new ArrayList();   往集合中添加数据【arr.add(Object)】 arr.add("小明");   通过索引从集合中取得对象【arr.get(Index)】   arr.get(1) package com.Gary.arryaylist; import java.util.ArrayList; public class ArrayListDemo { public static void main(String[] args){ //集合对象 ArrayList arr = new ArrayList(); //往集合中添加对象 arr.add("小明"); arr.add("小红"); arr.add("小梁"); //使用索引添加对象 System.out.println(arr.get(0)); } }

第1章 引论

这一生的挚爱 提交于 2019-12-05 12:50:17
今年3月转行,从事JavaWeb开发工作。觉得以后想要较好的发展,除了提高上层应用技术水平,还应该学习计算机的基础课程,构建计算机知识系统。按照左飞老师提到的计算机学习路线,目前打算先学习算法和编译原理这第一条路线,估计在边工作边学习的状态下,至少得半年光景吧。同时,计划每学完一章,会写一篇博客,以作总结。 算法这本书名字:数据结构与算法分析 Java语言描述 马克.艾伦.维斯著 1.1 本书讨论的内容 算法的目的:优化程序。 1.2 数学知识复习 涉及指数、对数、级数、调和数、模运算、归纳证明、反证法等数学知识,不详细展开。 1.3 递归简论 递归的四个基本原则: 1. 基准情形:作为递归出口,当方法运算到此时,不再调用下一级方法。 2. 不断推进:递归总朝着基准情形前进。 3. 设计法则:假设所有的递归调用都能运行,这点如同归纳法中假设前n-1种情况成立。 4. 合成效益法则:在求解一个问题的同一实例时,切勿在不同的递归调用中做重复性的工作 1.4 实现泛型构件 pre-Java 5 Java 1.5 前使用Object来起到泛型作用,但相比泛型,缺少安全性。 Java 数组具有协变性 1.5 利用 Java 5 泛型特性实现泛型构件 泛型不具备协变,故引进通配符 不能用new 创建泛型类型的实例,也不能创建泛型数组 1.6 函数对象