2016年7月16日

继续java基础,由于写博客详细之后太占时间,所以,决定从这篇开始,精简内容,直奔主题。泛型的东西网上资料很多,我在学习中出现过两个问题,依次来讲:

1.Object 与 T

例如Test<Object> 与Test<T>,有何区别,其实最主要的就是一点,防止类型强制转换,虽然说两者都可以放Object的任何子类,但是第一种在取出时需要强转,一方面可能会出错,第二方面,性能不高。后者恰好解决了强制转换的问题。

于是,这里面的大坑出来了,泛型擦除,这是java泛型的最关键概念,其实java的泛型类在编译器编译的时候就进行了擦出,而用最近父类代替。所以,会出现Test<String>.class 与Test<Integer>.class相同。所以,List<Object> 不是List<String> 父类。

2,T与?

例如Test<T extends Object> 与Test<? extends Object> 有何区别,

其实,前者表示是一个固定的类型,就是在使用的时候,都是需要一个固定的类型参数,之后这个对象就一直使用这个类型。

后者则不然,使用的时候,他仍然是个不固定的类型,看个例子

List <? extends Fruit> 意思: List中所有元素都是Fruit的子类(包含本身),
List <? super Fruit> 意思: List中所有元素都是Fruit的父类(包含本身)
1、List <? extends Fruit>
假设:Fruit有子类A、B、C 那么 list.add(A);list.add(B);list.add(C);显然错误(不能存多个类)。
虽然我们现在看的是ABC3个类就会问为什么会把不同类型的存进去,我这样存不就好了。list.add(A);list.add(A);其实这也是错误的,因为在运行之前他可不知道你到底add进去的东西是什么类型,是一样还是不一样,因实例化的时候是 ? 待定。为了避免类型不同的情况,所以会编译不通过。因此java将其设计为不能添加,List<? extends E>不能添加元素,但是由于其中的元素都有一个共性--有共同的父类,因此我们在获取元素时可以将他们统一强制转换为E类型,我们称之为get原则。
2、List <? super Fruit>
假设:Fruit有子类A、B、C 那么 list.add(A);list.add(B);list.add(C); 这却是可以的,为什么呢:
因为他是这么存的:list.add((Fruit)A);list.add((Fruit)B); 自动强转了。因为 小转大是隐性的,大转小才是强转需要加类型。
那这里为什么又不能存Fruit的父类呢? 因为 见假设1,它是?号,类型代表待定,不跑起来他也不知道你到底存的什么。所以我们能手动add()进去的数据都必须是绝对安全的(最低级父类:本身)才能通过。所以直接add父类也是不行的。
由于该集合中的元素都是E的父类型(包括E),其中的元素类型众多,在获取元素时我们无法判断是哪一种类型,故设计成不能获取元素,我们称之为put原则
实际上,我们采用extends,super来扩展泛型的目的是为了弥补例如List<E>只能存放一种特定类型数据的不足,将其扩展为List<? extends E> 使其可以接收E的子类型中的任何一种类型元素,这样使它的使用范围更广。
posted @ 2016-07-16 21:00 1204771796 阅读(190) 评论(0) 推荐(0)

2016年7月15日

摘要: 很多东西都是大处显积累,小处见功力,来点功力。 hashCode跟equals 相伴相生,所以要一起讨论才有意义。 在java中,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,就是说当集合中插入对象时,怎么分辨该对象是否已经存在。按照正常思路,应该是依次进行equals比较,但 阅读全文
posted @ 2016-07-15 20:14 1204771796 阅读(250) 评论(0) 推荐(0)

2016年3月24日

摘要: HttpServerlet 属于服务器端的内容: 一、使用HttpURLConnection向服务器发送get请求 1、向服务器发送get请求 2、从服务器读取数据 二、使用HttpURLConnection向服务器发送post请求 1、向服务器发送post请求 2、从服务器读取数据 阅读全文
posted @ 2016-03-24 14:41 1204771796 阅读(566) 评论(0) 推荐(0)

2016年3月18日

摘要: 1 finally 关键字通常是在try-catch后面使用,即使在这里面已经return ,仍然会执行finally里面的。原因是:finally处理的是非内存的一些资源的释放或者还原。他的执行时间是,程序执行完毕,返回之前。 2 finalize()方法,用于清理内存里面的垃圾,但是因为一般的j 阅读全文
posted @ 2016-03-18 15:38 1204771796 阅读(205) 评论(0) 推荐(0)

2015年1月8日

摘要: 在数据结构中我们常见的平衡二叉树有AVL树和红黑树。 红黑树和AVL树的区别在于它使用颜色来标识结点的高度,它所追求的是局部平衡而不是AVL树中的非常严格的平衡。 我们来看红黑树的定义:红黑树首先是一棵二叉查找树,它每个结点都被标上了颜色(红色或黑色),红黑树满足以下5个性质: 1、每个结... 阅读全文
posted @ 2015-01-08 22:00 1204771796 阅读(207) 评论(0) 推荐(0)
摘要: 关于自动机,其实可以最简单的理解为,对于一个给定的初始状态,算法可以自动进行递归得出最终匹配或者不匹配两种情况。AC自动机试自动机的一种(Aho-Corasick automation),该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。所谓多模匹配,指的是同时匹配多个模式串,我们通... 阅读全文
posted @ 2015-01-08 21:51 1204771796 阅读(165) 评论(0) 推荐(0)
摘要: 当我们在讨论图的连通性时,有时候图的边权或者点权值并不一定需要,如果此时还要坚持用图的结构来保存,则效率显然不高,因此,在这里我们使用并查集就可以。 并查集是一种值考虑两个节点是否连通而不考虑他们如果连通以及连通的代价的结构,他实质上是数学上的集合思想在计算机算法中的应用。在该结构中,两个节点... 阅读全文
posted @ 2015-01-08 21:27 1204771796 阅读(216) 评论(0) 推荐(0)

2013年9月12日

摘要: 今天做项目的时候出现了一个问题就是使用GBK能用,而我却一直记成了GB2312导致存入数据库并不乱码,但是在console显示总是有几个字为问号,这种情况并不是所谓的乱码,只是由于编码问题,一些特殊的字:比如陶喆的喆。没法显示。之道我换成了GBK的时候,便没问题了。具体GBK与gb2312的区别... 阅读全文
posted @ 2013-09-12 14:08 1204771796 阅读(704) 评论(0) 推荐(0)

2013年3月28日

摘要: 友员函数跟友元类是友员机制的主要内容。1、友员函数 1.1、友员函数: 在类定义体中由关键字friend加以修饰说明的非成员函数,在它的函数体中能够通过该类的对象来访问类中的private/protected成员。class Window{ public: Window(int x, int y, int h, int w) { X=x , Y=y , H=h , W=w ; } friend long Area(Window & WinObj) ; //在类中声明出友员函数的原型 int getH() { retu... 阅读全文
posted @ 2013-03-28 15:58 1204771796 阅读(213) 评论(0) 推荐(0)
摘要: 虚函数为了重载和多态的需要,在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的此函数! 纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数! 虚函数 引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。 纯虚函数 引入原因: 1、同“虚函数” 阅读全文
posted @ 2013-03-28 15:06 1204771796 阅读(226) 评论(0) 推荐(0)

导航

< 2025年7月 >
29 30 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 1 2
3 4 5 6 7 8 9

统计

点击右上角即可分享
微信分享提示