Android必备知识(三)java集合

android必备知识——java集合

java中的存储是很重要的一部分内容,也是面试涉及的比较多的一块,抽象出来思考,任何一种语言,无论什么操作,第一步总是将需要的内容存储,因此这部分内容的重要性可见一斑。

java集合总的可以分成Collection和Map两种体系,其中,
Collection接口
|-------------set:元素无序(指的是元素在底层的存储的位置是无序的),不可重复的集合
|-------------List:元素有序,可重复的集合
Map接口:具有映射关系的“key-value”键值对的集合

- List

Collection中需要注意的是遍历的方法,java中提供了迭代器——Iterator;
使用方法如下

Collecton coll=new ArrayList();
coll.add(3);
coll.add("asd")

Iterator i=coll.iterator();
while(i.hasnext()){
	system.out.print(i.next())
}

这里需要注意:
while中判断只能用hasnext()的方法,首先它本身返回的就是一个boolean,其次,如果强行使用next(),就像while((i.next()!null)),这就是错误的写法。因为,我们可以把i理解成一个指针,它刚开始是在插入的第一个元素的上面,当执行i.next(),之后,i先下移,再取出当前指向的内容,所以这种错误的写法,就会导致i每次都跳移动两次才输出一个,并且,当i指向最后倒数第二元素时,while中的判断是true,此时i指向最后一个元素,再执行一次i.next(),就指向空,这时候就会报异常。

补充一点增强for循环的知识:
上面遍历使用的是while,也可以通过增强for循环的方式来实现遍历

Collecton coll=new ArrayList();
coll.add(3);
coll.add("asd")

for(Object i:coll)
    system.out.print(i)

增强for循环的用法是:
冒号前指明对象类型,因为coll中既存储了int型,又存储了String型,所以使用Object,i指的是每次取出来的值赋给i,冒号后面表示需要遍历的集合(这一点很像python中的for循环:for i in coll),这里就要注意:

//第一种
String[] str=new String{"aa","nn","ss"}
for(String s:str){
	s="ww"
}

for(String s:str){
	system.out.print(s)
}


//第二种
String[] str=new String{"aa","nn","ss"}
for(int i=0;i<str,length;i++){
	str[i]="ww"
}

for(String s:str){
	system.out.print(s)
}

这两种输出的结果是不一样的,第一种aannss,第二种wwwwww,原因就是增强for循环是将值赋给了变量i,i指向的是str那片地址,对i做修改,只是让i重新指向了常量池中“ww”的那一片地址,而第二种,就是直接修改了str那片地址中的内容

Set

set的插入删除等等方法,基本和collection接口的一致,需要特别了解的是,Set的存储底层是用了Hash算法,由于Set中不允许重复存储元素,因此需要判断原集合中是否存在和待插入对象相同的对象,所以,一个类的对象如果要插入进set中,那么这个类一定要重写equals()和hashcode()方法,进而保证set集合中元素的不可重复性

Set set=new HashSet();
set.add(123);
set.add(new String("ab"));

//假设Person类有name和age两个属性
Person p1=new Person("aa",22);
Person p2=new Person("aa",22);

system.out.print(p1.hashcode());
system.out.print(p2.hashcode());

如果,hashcode()方法没有在Person中重写,那他们的打印结果不一样,所以,一定要在Person类中重写,重写的方法有很多,只要综合考虑到name和age属性即可。
当向set中添加对象时,首先调用此对象所在类的hashcode()方法,计算此对象的hash值,它决定了此对象在Set中存储位置,若此位置之前没有对象,则这个对象直接存到这个位置,若此位置已有对象存储,再通过equals()方法比较这两个对象是否相同,若相同,后面的对象就无法存储进Set,一般情况,equals()方法和hashcode()方法一致

Map

Map与Collection并列存在,用于保存具有映射关系的数据:Key-Value。
其中,Map中的key用Set来存放,不允许重复,即同一个Map对象所对应的类,须重写hashcode()和equals()方法

以最常用的HashMap为例,向HashMap中添加元素时,会调用key所在类的equals()方法,判断两个key是否相同,若相同,新插入的会覆盖旧的相同的

下面讲讲如何遍历Map

Map map=new HashMap();
map.put("aa",123);
map.put("bb",456);
map.put("cc",789);

//1.遍历Key
Set set=map.KeySet();
for(Object i:set){
	system.out.println(i);
}

//2.遍历value
Collection coll=map.values();
Iterator i=coll.iterator();
while(i.hasnext()){
	system.out,println(i.next());
}

//3.如何遍历Key-Value
//方式一
Set set2=map.KeySet();
for(Object obj:set2){
	system.out.println(obj+"----"+map.get(obj));
}


//方式二	
Set set3=map.entrySet();
for(Object obj :set3){
	Map,Entry entry=(Map,Entry) obj;
	system.out.println(entry.getKey()+entry.getValue());
}
	

上面就是对HashMap的主要遍历。

需要注意的是,HashMap的key可以看成是set集合,而它的values由于可以重复,并且无序,所以最好看成是一个collection,因此整个hashmap是无序的,那么怎么实现hashmap的有序存储呢?就需要用到Map接口下的另一个类——LinkedHashMap。

Map map=new HashMap();
map.put("aa",123);
map.put("bb",456);
map.put("cc",789);

Set set=map.entrySet();
for(Object obj:entry){
	Map.entry entry=(Map.Entry) obj;
	system.out.println(entry.getKey()+entry.getValue());
}

这个时候就可以发现,输出的结果和我们插入的结果顺序一样了。

以上内容就是java基础的集合知识。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值