java常用的集合对象_JAVA-初步认识-常用对象API(集合框架-ArrayList集合存储自定对象)...

,一.

d8d7e418c72cbf4bdf68de4f6101938472b.jpg

回过来说一下ArrayList,现在用ArrayList对象,来完成一些我们实际开发中的动作。(ArrayList中的方法也不多,特有的方法一般也用不上。)

通常我们往集合中存储的更多是自定义对象,光存储字符串没什么意思。

b2eff55760282fab831378ca2787df69f1b.jpg

现在我们存自定义对象,比如说person,person要单独写一个类出来,这个类存储在哪儿呢?为了其它的包也能使用到person,直接建立p包,其中是bean目录。

这个bean目录中bean是说,java的一种类的表现形式。这种类相对比较特殊,描述完之后通常都会去描述事物中的属性,并对应着一堆set,get方法,同时提供一个空参构造函数。这种具备特定书写的类,我们称之为bean。

6c5ccc7c9848baf8b0329b03f758fa16575.jpg

这里有eclipse的便捷开发,不用手写属性的set和get方法,菜单命令里的source里面就有相应的选项,同时out+shift+s也可以。选中后就会出现一个窗口,让我们选择。

33ef864cc2048f387f20373469ef7af6884.jpg

同样的道理,也可以便捷地创造出各种形式地构造函数出来。可能,在用eclipse进行程序开发时,只需要写出属性即可,下面的方法都可以采用便捷开发。

644821d684f36d289daa67b7171cd2adf30.jpg

下面说一些小细节,先搞一个ArrayList的集合,现在不需要功能了,所以将它直接写在主函数里。创建了一个容器,往里面存储对象。

a0ce37992a7240d29822064cd42aa4bc56f.jpg

往里面存储多个对象的动作,也可以是便捷操作,ctrl+0。往里面存了很多对象,重要地还是取出。

有人说采用迭代器取出,结果显示错误。cn.itcast.p.bean.Person前面的都是person的类型,person对象类型,是全类名。后面数值是哈希值。

c49811e803e9b1300ef5f829670edd65662.jpg

d4acc121beff830dbd88712098494de8aaa.jpg

我们想打印的是姓名和年龄,并不是这样的。有人提出后面添加getname方法,结果直接报错。用ctrl+1就直接看出背后的信息,ctrl+1得到的结果如下图所示,中间部分给出的是具体操作,最右侧是做出的解释。最右侧提示,这是强转。

6d9f316eccc4f48372f206bbb39dc0e2e71.jpg

强转的原因在于,add方法的参数类型是object,那么就意味着它什么类型的对象都能接收。数组只能存同一类型,集合可以存任意类型,因为它是object接收。

一接收后,所有具体类型对象都被提升为了object了。那么在通过这个集合的迭代器取出集合中的元素,也是object。取完object后,对象都被提升了,person不在是person了,而是object了。object没有getname方法,结果就是失败的。

有人说需要转换类型,怎么转换呢?如下图所示的转换。编译没有通过(貌似有ctrl+1的操作,直接显示无法编译,有错误),错误的原因在于:点号的优先级是很高的,右侧所有的操作都结束了,才来一个(person)操作,没什么用。因此,需要加括号,将it.next()的结果转为person,

9f55e903c9559f0ccae4fb464100d54963b.jpg

这样一来,结果就没问题了。

b5547e416ea0a3801b22fa659ee183907a0.jpg

c57ca0869fd506c7e9578eccdf0a161d320.jpg

ctrl+1的作用不止如此,还能便捷书写。

有人想接着打印年龄,书写如下,结果是错误的。

08e82d071ec47e098032e8ce235b8f49a56.jpg

5d5c6a10618a97184028b5e152f09b39a02.jpg

结果丢失了两个。这个就是我们在做实际开发中的现象,next会自动往下走,它操作的是角标,如果你在循环中调用两次的话,你的结果会出错。

它取了第一个人的姓名,紧跟着取了第二个人的年龄,这里非常巧,正好四个人。取第一个人姓名和第二个人的年龄,取第三个人姓名和第四个人年龄。

如果是三个人就出错了。

1a476730a40e42ac43d0a6fbda42609ccfb.jpg

因此,不要在里面写上两个next,那接下来该怎么操作?

it.next()是准备要取出这个元素,并调用这个元素的两个方法,一个是getname,一个是getage。既然要对一个对象进行多次方法调用,这需要给它起一个名字,

71b0aed1af01fa96aff1e9e8208d273bc7d.jpg

开始就将其转为person类型,这是前面多态的知识点。通过点号就知道能不能用getname和getage方法,这就是高级编辑器带来的好处。

f9c9ee21e7ffe977e3d804b9979e0768ab7.jpg

3c3793f5ddd2b45d93e382a8444011c6e2c.jpg

存定义对象的时候,一定要考虑到取出的时候,做强转的动作。不做强转的话,自动变成字符串输出,而有的自定义对象没有去定义一些方法,它用的是父类的方法,打印的是类型加哈希值,那是没有意义的。这是给大家介绍的自定义对象的第一个小问题。

第二个问题,给大家画一下,就是内存图的问题。画一下,下面部分的内存图,栈就不画了,直接画堆。

add69b50cd85db1c0ccd5db63091bae8a7d.jpg

fee584b75fb49fe1684e43821408d2274ac.jpg

new ArrayList本身就是一个对象,而这个对象,它里面是维护了一个数组,这里面有十个格子。

集合里面装的全都是引用,不可能把对象装进去的。这和当时学的数组是一回事。

c2e3b5a0671309f27e9e6135e366773bad8.jpg

拿到迭代器的时候,迭代器在取出集合中元素,也是这个引用(0x0034),通过这个引用在拿这个对象,这是需要搞清楚的事情。

al.add(5)这个操作也是可以的,如果是在1.4版本中是不可以的,因为集合中只能装对象,必须要把5封装成一个对象。到了1.5版本这样就可以了,因为自动装箱。

c38f20a9004bbe9b9997a8e98030de8bbd7.jpg

凭什么说是自动装箱呢?什么时候会出现自动装箱呢?

85065af4afc28afd7e3c232ee5f034b26ad.jpg

看上图的例子,装箱了没有?这是没有装箱的,定义的就是基本数据类型。什么时候装箱,基本数据类型赋值给了引用数据类型值的时候才装箱。

有人说改成下面这样string num,这是不对的,没意思,类型不匹配。如果是object就没问题,编译通过了,这个就是装箱。

8b5dee27c2bd15d72c1b7a89ad2e740691a.jpg

7dc121cab818c357636ef99ea4f38742788.jpg

这个写法很恐怖,object num=6,换成下面的写法才对。写成Integer num也是装箱。它只要是觉着类型符合就是装箱

84c9078277660deb22552e967a05bf95069.jpg

那什么时候拆箱呢?当引用数据类型和基本数据类型做计算的时候,就是拆箱,还原成基本数据类型才能用。

85565f096aa875af36183a0ce168d4674a9.jpg

它是不能接收基本数据类型的。

f3637604c803d2c340c484d609165f24240.jpg

我们如何将自定义对象存储到集合当中,真实中会先创建一堆定义对象,然后将p传递进去。

5fb2156e379fe03292a0fec302062c29d5b.jpg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值