您的位置:首页 > 编程语言 > Java开发

Java初级培训笔记------容器 (2)

2015-08-16 19:47 459 查看
容器的应用:
List因为说他的三个实现类的继承跟实现是差不多的,所以说明白了一个,再了解一下他们不同的地方就行了
Vector的用法,他的底层实现的是数组,并且定义了初始大小为10,并且他是线程安全的
现在比如说我们定义了一个学生类,封装了姓名,年龄,性别以及学号四个属性并提供set,get方法方便获取,定义了有参和无参两个构造方法。
建一个测试类提供main方法步骤
建立了学生类的四个对象:
Student stu1=new Student("张三", 18, '男',"20122212001");
Student stu2=new Student("李四", 20, '男',"20122212002");
Student stu3=new Student("王五", 19, '男',"20122212003");
Student stu4=new Student("赵六", 19, '男',"20122212004");
创建一个Vector 集合对象,要想调用里边的方法 肯定是要创建对象的
Vector v=new Vector();
既然是容器什么都可以存 那么对象肯定也是可以存的所以提供了一个add方法,整个添加的过程是有顺序的,依次添加
v.add(stu1);v.add(stu2);v.add(stu3);v.add(stu4);
判断容器容量是否为0 返回布尔类型但是并不是判断是否为null,只是判断容器中有没有成员
System.out.println(v.isEmpty());//false
System.out.println(v.size());//v.size()是表示容器的实际长度 Vector的初始容量为10 但是这里的对象数量不够10 它输出的是实际的长度4
System.out.println(v.capacity());//v.capacity()表示的是容器的总 容量 ,Vector的初始容量为10 但是这里的对象数量不够10 他依然输出10
容器的遍历:
//遍历方式1
for (int i = 0; i < v.size(); i++) {
Object obj=v.get(i);//i表示下标 与数组类似 但是要通过get方法得到下标为i的对象,这个过程中 得到的对象默认类型为Object类型,所以建立一个obj去接收他
Student stu=(Student) obj;//进行向下的强制类型转换,方便遍历,方便调用对象中的属性System.out.println("姓名:"+stu.getName()+"\t"+"年龄:"+stu.getAge()+"\t"+"性别:"+stu.getSex()+"\t"+"学号:"+stu.getSno()+"\t");
}
//遍历方式2
for (Object obj : v) {//这时候object对象已经创建好 相当于利用数组foreach循环直接去接收v
//进行向下强转
Student stu=(Student) obj;
System.out.println("姓名:"+stu.getName()+"\t"+"年龄:"+stu.getAge()+"\t"+"性别:"+stu.getSex()+"\t"+"学号:"+stu.getSno()+"\t");
}
Vector v1=new Vector();//建立容器对象 v
v1.add(stu1);
Vector v2=new Vector();//建立容器对象 v2
v2.add(stu1);
//同时将对象stu1存进容器
System.out.println(v1==v2);//false 此时比较的是地址 因为new 的两个容器的地址值是不同的
System.out.println(v1.equals(v2));//true 此时比较的是两个容器中的对象地址 利用equals方法 对比容器中的对象成员的值,因为他们指向的是同一个stu1,但是并没有比较stu1中的成员
这里有一张图你就明白了



就是说在这里==号对比的是 v1v2的值 也就是栈里边的这两个值,很明显这两个值是不一样,然后equals对比的是在堆当中v1,v2的空间中所存储的stu1对象的地址值,因为是同一个stu1对象,所以地址也一样 所以是true


/**
* 关于equals
* 容器中默认的equals方法 是把容器中的成员对象的地址进行比较
* 如果此时容器中有两个相同的对象 且顺序相同 此时equals返回true
* 但是 如果顺序不同 返回的是false 这说明 equals方法是按照顺序进行对比的
* 当用户重写equals方法之后
* 所对比的的是成员对象中的属性是否相同 而不是对比地址
* 如果此时容器中有两个相同的对象 且顺序相同 此时equals返回true
* 但是 如果顺序不同 返回的是false
* */
Vector v3=new Vector();//建立容器对象 v3
Student stu1_1=new Student("张三", 18, '男',"20122212001");//创建新的stu对象但是 内容是跟已经建立好的stu1对象相同的
v3.add(stu1_1);
System.out.println(v2.equals(v3));//false equals比较的是成员地址 因为 stu1_1是new出来的 所以地址跟原来的地址是不相同的 这时候需要在 student类当中重写equals方法 使其实现string中的equals的功能,对容器中成员对象中的内容进行比较
//重写equals方法后
System.out.println(v2.equals(v3));//true
add与set的区别 :
v.add(3, stu1_1);//表示 在 下标为 3的位置添加对象 数组长度 size加1

System.out.println(v.size());//5

v.set(3, stu4);//表示 将下标为3的 位置的对象 替换为stu4 容器 size不变

System.out.println(v.size());//5
remove:

v.remove(3);//将下标为3的位置上的对象移除 但是 对象在内存中还是存在的 只是不存在于容器中 size-1

contains():

Student stu5=new Student("杨幂", 20, '女', "20122212008");

System.out.println(v.contains(stu1));//true

System.out.println(v.contains(stu1_1));//false 对比的是成员对象的 地址 重写之后 比较的是对象的成员属性

System.out.println(v.contains(stu5));//false 该对象 并没有找到

ArrayList跟Vector是基本相同的
,不过他是线程不安全的,但是效率比Vector要高的多,因为底层实现的是数组所以查询比较快就是需要注意他的.toArray()方法,并不是说Vector里边没有,只是ArrayList用的多一点。如下

//将集合转化为 object数组

Object[] obj=list.toArray();//新建一个数组接收
//将数字转化为字符串
System.out.println(Arrays.toString(obj));//这里已经重写了toString方法所以可以直接输出

LinkedList:一定明白一点就是他底层实现的是链表

这里有一张图



它符合数据结构里栈的特点,插入遵循先进后出原则,他提供了一个方法叫push也就是压栈操作,就是一个一个往里放,但是往外拿的时候肯定是要从上边往下拿的

LinkedList link=new LinkedList();创建LinkedList的对象

//对链表的表头操作

link.addFirst(stu1);//这里表示的是对链表头进行操作,每次操作都是将对象压在原先数据的上边跟push操作时一样一样的

link.addFirst(stu2);link.addFirst(stu3);link.addFirst(stu4);

//对链尾操作

link.addLast(stu1);//这里是对链表尾操作,与addFirst相反,每次操作都会将对象插入到链表尾成为最后一个

link.addLast(stu2);link.addLast(stu3);link.addLast(stu4);

LinkedList 的遍历:

遍历1:

/**

* 这种遍历方法如在对列头进行操作时 每一次往容器里存储 都是存到表头 先进后出

* 每一次取值都是取是取first位置的对象值

* 然后利用remove方法将上一个first位置的数移除

* getlast正好相反

* */

int size=link.size();

for (int i = 0; i <size ; i++) {

System.out.println(link.getFirst());

link.removeFirst();//LinkedList 里边还有一个方法叫poll跟removeFirst方法的功能是相同的

}

//遍历2

for (Object object : link) {

System.out.println(object);

}

因为他底层实现的双向链表所以删改查要比ArrayList快,但是他也是线程不安全的。

List讲完了 Set在下一篇里边说 Java初级培训笔记------容器 (3)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: