黑马程序员——java基础——集合中注意的问题

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

第一个问题泛型问题:

泛型是jdk1.5后的新特性,泛型在集合中经常使用,为什么要有泛型呢?

泛型解决的问题:

1:程序的类型没确定时,取出集合中元素的时候,在编译时不会报错,可是一运行就报异常,存在安全隐患,定义了泛型,程序一编译发现集合中装的数据类型不一样,此时就会报异常,这是程序员就可以解决类型不同导致的异常,这就解决了此安全隐患问题。

2:因为集合中的类型不一样,所以要强制类型转换,有了泛型就解决了类型转换的麻烦。

泛型的格式:

1:<>括号就是泛型定义符号,只要看到此符号就是定义泛型,括号是用来接收数据类型的。

2:自定义类泛型的定义格式:class Utils <T>{}。注意静态方法不可以访问类上定义的泛型,如果静态方法操作的类型不确定,那么我们可以把泛型定义在方法上。

3:自定义函数泛型的定义格式:public <T> void show(){}。注意泛型定义在方法上是<>放在返回类型的前面

4:泛型定义在接口上:Interface inter<T>。

5:泛型中通配符<?>,如果需求是要用到一个类以及他的全部子类,那么它的书写格式为<?extends class>也就是上限,<? super class>下限,这也叫泛型的限定。

下面是泛型使用代码演示:

<span style="font-size:18px;"><span style="font-size:18px;">package blogday1;
class Wang{//定义一个类
	private String name;
	private int age;	
	
}
class Xiao{//定义一个类
	private String name;
	private int age;
	
	
}
class Utils<T>{//定义一个代泛型的工具类
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void show(){
		System.out.println(getAge()+""+getName());
		}
	public void show1(T t){
		System.out.println(t);
	}
	}
public class GenericDemo {
	public static void main(String[] args) {
		Utils<Wang> w=new Utils<>();//得到工具类对象,并且往里面传递要接受的类型
		w.setAge(50);//调用工具类里面的
		w.setName("wang");
		w.show();
		Utils<Xiao> x=new Utils<>();
		w.setAge(40);
		w.setName("xiao");
		w.show();
		Utils<String> s=new Utils<String>();
		s.show1("xiaozhijiang");
		Utils<Integer> s1=new Utils<Integer>();
		s1.show1(new Integer(56));
		
		
		
	}

}</span></span>
以上代码,演示了泛型的用法,以及泛型的好处。

第二个map集合的问题

map集合的特点:

1:该集合存储键值对,一对一对往里面村,并且保证键的唯一性。

Map对应的3个能实现类,以及各自的特点:

Hashtable:底层是哈希表的数据结构,不可以出现空键空值,该集合是线程同步的,出现在jdk1.0,效率最低。

Hashmap:底层是哈希表的数据结构,可以出现空键空值,该集合是线程是不同步的,出现在jdk1.2,效率高。

TreeMap:底层是二叉树的数据结构,线程不同步,可以用于给map集合中的键进行排序。

Map集合里面的一些常用方法

1:添加

put(Kay k,Value v);

putAll(Map<? extends key,? extends value> m)

2:删除

clear();

remove(Object v)

3:判断

containsValue(Object v);containsKey(Object k);isEmpty();

4:获取

get(Object k);

size();

valus();

keyset();

entry();

基本方法实现代码如下:

<span style="font-size:18px;"><span style="font-size:18px;">package blogday1;

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class MapDemo {
	public static void main(String[] args) {
		Map<String, String> map=new HashMap<String, String>();//定义了一个map集合对象
		map.put("01", "xiao01");//往集合里面装东西,学号和姓名。注意如果存放数据的时候键相等,那么键对应的值将会覆盖原来的值,那么
			//map.put()函数将返回原来键对应的值
		map.put("02", "xiao02");
		map.put("03", "xiao03");
		map.put("04", "xiao04");
		map.put("05", "xiao05");
		map.put(null, "jhkljkl");
		map.remove("05");
		Set<String> key=map.keySet();//定义一个set集合来装Map集合里面的键
		for(Iterator<String> it=key.iterator();it.hasNext();){//通过迭代器取出set集合里面的键
			String key1=it.next();
			String v=map.get(key1);//通过键值获得键所对应的值
			System.out.println(v);
		}
		Collection<String> coll=map.values();//定义一个Collection集合来存放map.values返回的map中的所有元素
		System.out.println(coll);	
	}

}
</span></span>
map集合中没有迭代器,要取出map集合中的元素只能靠get(key)函数获取map集合中键对应的值,思路有俩个,方法有俩个

keyset();

entry();

第一个将map集合中的键放到set集合中,然后再通过迭代器获得set集合中的键,最后通过键获得map集合中对应的值。

第二个将map集合中的键值对应的关系放到一个集合里面,然后在通过这个对应关系对象中的,getvalue()与getkey()方法得到,map集合中的键和值。

下面代码是一个练习,方便我们理解map集合中的问题,代码如下:

要求,往集合里面放学生和学生地址,学生为键,地址为值,然后获取集合里面的数据,按照学生年龄从小到大排序输出:

<span style="font-size:18px;"><span style="font-size:18px;">package blogday1;

import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

class Student2 implements Comparable<Student2>{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
	@Override
	public int hashCode() {//重写hashcode函数。
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {//重写equals函数
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student2 other = (Student2) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {//重写toString函数
		return "Student [name=" + name + ", age=" + age + "]";
	}
	@Override
	public int compareTo(Student2 s) {
		// TODO Auto-generated method stub
		int num=new Integer(this.age).compareTo(new Integer(s.age));
		return num;
	}
	
}

public class MaoDemo2 {
public static void main(String[] args) {
	Student2 s=new Student2();
	s.setAge(21);
	s.setName("lisi1");
	Student2 s1=new Student2();
	s1.setAge(22);
	s1.setName("lisi2");
	Student2 s2=new Student2();
	s2.setAge(23);
	s2.setName("lisi3");
	Student2 s3=new Student2();
	s3.setAge(12);
	s3.setName("lisi4");
	Student2 s4=new Student2();
	s4.setAge(19);
	s4.setName("lisi5");
	TreeMap<Student2, String> hm=new TreeMap<Student2,String>();
	hm.put(s, "beijing");
	hm.put(s1, "nanjing");
	hm.put(s2, "shanghai");
	hm.put(s3, "chongqi");
	hm.put(s4, "hubei");
	Set<Map.Entry<Student2, String>> entryset=hm.entrySet();
	for(Iterator<Map.Entry<Student2, String>>it=entryset.iterator();it.hasNext();){
		Map.Entry<Student2, String> me=it.next();
		Student2 st=me.getKey();
		String str=me.getValue();
		System.out.println(st.getAge()+""+st.getName()+""+str);
	}
}
}
</span></span>
以上代码注意事项:

1:建立一个学生类,要覆盖那些方法,为什么要覆盖这些方法

首先get()set()方法为了设置类的私有变量和获取类的私有变量,然后是hashCode() ,equals()这些方法是为了让对象可以存储在hash表数据结构的集合中toString()方法是为了方便将成员变量以字符串的形式输出。

2:取元素引入了一个Map.Entry类型,用于表示键值对之间的对应关系,把此对应关系存到set集合中去,然后通过迭代其取出set集合中的Map.Entry类型的对应关系,然后调用Mao.Entry类中的函数getkey()和getvalue()得到Map集合中的键值。

在这里集合问题就说完了!










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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值