黑马程序员——java基础——我对集合的理解

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

首先先说一下,集合跟数组的区别,有了数组为什么还要集合?数组是固定长度的,而集合不是固定长度的,数组里面装的数据类型是相同的,还可以放基本数据类型,也就是说数组中只能装同种类型,集合就不一样了,集合中可以装很多不同的类型对象,但是集合不可以装基本数据类型,因为类的对象封装了特有数据,对象多了就需要存储,在对象个数不确定的情况下用数组的话就会浪费空间,或者产生近异常,这个时候集合就由此而来,说道集合,想必学习的人都有些疑问,为什么要集合,集合能干什么,到底集合他是怎么干的,下面我来说说我自己的理解。首先说一下集合的特点:用于存储对象的容器集合的长度是可变的,集合不可以存储今本数据类型,那么问题来了:集合是按照什么规则来装对象的呢?容器有很多种,每一种容器都有自己特定的结构,也即是说,这些结构决定了这些容器改怎么装对象,集合框架的,顶层接口是Collection,他是由很多底层不同的容器抽取出来的共性接口,它里面有很多方法,也是其他底层容器共有的方法。问题又来了,那都有那些方法?那下面就是集合中的共性方法代码演示:

<span style="font-size:18px;">import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
class Student{//定义一个学生类
	private String name;
	private int age;
	private String adrr;
	private String call;
	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 String getAdrr() {
		return adrr;
	}
	public void setAdrr(String adrr) {
		this.adrr = adrr;
	}
	public String getCall() {
		return call;
	}
	public void setCall(String call) {
		this.call = call;
	}
	
	
}


public class CollectionDeom {
	public static void main(String[] args) {
		Student s=new Student();//得到学生类对象s
		Student s1=new Student();//得到学生类对象s1
		s.setAdrr("高安");//初始化学生对象s
		s.setAge(60);
		s.setName("肖志江");
		s.setCall("1234566779");
		s1.setAdrr("fasfa");//初始化学生对象s1
		s1.setAge(78);
		s1.setCall("2342342421");
		s1.setName("lisi");
		Collection<Student> coll=new ArrayList<Student>();//得到容器对象coll
		coll.add(s);//向容器中添加学生对象S
		coll.add(s1);//向容器中添加学生对象s1
		Iterator it=coll.iterator();//得到迭代器
		 Student student1=(Student) it.next();//通过迭代器得到容器中的学生对象s
		System.out.println(student1.getAdrr()+"/n"+student1.getAge()+"/n"+student1.getName()+"/n"+student1.getCall());
		Student student2=(Student) it.next();//通过迭代器得到容器中的学生对象s1
		System.out.println(student2.getAdrr()+"/n"+student2.getAge()+"/n"+student2.getName()+"/n"+student2.getCall());
		//删除容器中的元素
		System.out.println(coll);
		coll.remove(s);
		System.out.println(coll);
		//判断容器中是否包含该元素
		Boolean b;//定义一个布尔类型的数据
		b=coll.contains(s1);
		 System.out.println(b);
		 coll.toString();//将集合里面的数据变成字符串
		 coll.clear();//清空集合里面的对象
         
		
	}


}</span>

以上代码,演示了集合里面的一些共性方法,这个代码是我自己敲的,所以有很多的不足,希望高手,大神看到后指教一二,我定会努力改正,上面涉及到了泛型问题,在这里我就不做详细介绍,我只要想说的是集合的理解,泛型是1.5版本的新特性,以后有时间再讨论泛型问题,Collecttion这是最顶层的接口,他还有俩个小弟,也就是俩个态系,我想通过,Collection这个接口,来深刻理解一下他的俩个态系,接口的方法大同小异,首先说一下,List这个接口
它是一个有序的集合,它里面的元素可以通过角标精确的插入具体位置,或者删除角标下的元素,也就是可以索引,还有就是它里面的元素是可以重复,下面是list常见方法代码演示:
<span style="font-size:18px;">import java.util.List;
import java.util.ListIterator;
public class CollectionListDeom {
public static void main(String[] args) {
List list=new ArrayList();
show(list);
}
public static void show(List list) {
//添加元素
list.add("qwer1");
list.add("qwer2");
list.add("qwer3");
list.add("qwer4");
//按照角标位置插入元素
list.add(2, "qwer7");
System.out.println(list);
// 按照角标位置删除元素并且返回删除的对象
String s=(String) list.remove(2);
//根据角标修改元素
list.set(1, "asfas");
//取元素的方法
for(ListIterator it=list.listIterator(0);it.hasNext();){
Object objct=it.next();
if(objct.equals("qwer3"))
it.add("qwer8");
}
System.out.println(list);

}

}

</span>
这里有一个问题,如果我们用Collection共性的迭代其去提取List集合中的数据时,如果需求是在迭代的时候往集合中添加数据的话,那么就会出现异常,这个异常就是说,同步操作异常,迭代器跟集合容器不能同时操作,解决这个问题的方法就是用我代码中的迭代器,这是List集合特有的的迭代器,他里面有添加,修改,删除方法,所以不需要同时操作迭代器的时候,去操作集合,这样异常问题就解决了。
List集合容器下面实现类有三个:
Vector:内部数组数据结构,是同步的。出现在1.0版本
ArrayList:内部是数组数据结构,是不同步的。代替了Vector,出现在1.2版本
LinkedList:内部是链表数据结构年,是不同步的。
链表的数据结构与数组的数据结构的优缺点:如果你要频繁的增加元素,或者删除元素的话,那么建议你用链表的数据结构,也就是选择LinkedList,如果你是要频繁的查询操作的话,那么用数组的数据结构将会比链表速度快,所以说,在对数据进行操作的时候我们要适当的选择容器。
set集合是无序的,它里面的元素是不可重复的,它也有两个实现类:
TreeSet:
HashSet:数据结构是哈希表,线程是非同步的,保证元素唯一性的原理是:判断元素的hashcode值是否相同,如果相同,还会判断元素的equals()方法是否为true。
TreeSet:因为Set集合是无序的,所以就有可TreeSet集合来拟补他的不足,TreeSet集合是有序的,可以对Set集合中的元素进行排序。
<span style="font-size:18px;">package blogday1;
import java.util.Iterator;
import java.util.TreeSet;
class People implements Comparable{//定义一个People类实现Comparable接口,为了让这个对象具备可比性
	private int age;
	private String name;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public int compareTo(Object o) {//重写compareTo这个函数
		if(!(o instanceof People))//判断接受的对象是否是People
			throw new RuntimeException("对象有误,请检查");
		People p=(People) o;//类型强转
		if(this.age>p.age)//当主要问题相等,按照次要问题排序
			return this.name.compareTo(p.name);
		if(this.age==p.age)
			return 0;
		// TODO Auto-generated method stub
		return -1;
	}
	
}


public class CollectionSetDome {
	public static void main(String[] args) {
		TreeSet ts=new TreeSet();//定义一个TreeSet对象
		People p=new People();//定义一个People对象
		p.setAge(23);//初始化对象
		p.setName("lisi");
		People p1=new People();
		p1.setAge(34);
		p1.setName("lisi2");
		People p2=new People();
		p2.setAge(234);
		p2.setName("lisi3");
		ts.add(p);//将元素加入到集合里面
		ts.add(p1);
		ts.add(p2);
		
		for(Iterator it=ts.iterator();it.hasNext();)//取出集合中的元素
		{
			People pe=(People) it.next();
			System.out.println("age="+pe.getAge()+"name="+pe.getName());
		}
			
	}

}</span>
由上代码可知,TreeSet集合里面的数据是有序的,如果我们放入不具备排序的自定义类,往集合中放数据的时候会出现异常,所以我们要放一个自定义的对象到TerrSet集合中,我们必须先让该对象具备可比性,它的底层数据结构是二叉树结构。它的排序规则就是根据Compareto返回值进行排序的,他的默认排序从小到大排序的,同时它也确定了TreeSet集合中的元素唯一性。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值