1.Collection
1.1概述
1.2继承体系
1.3 常用方法
1.4使用方式
import java.util.ArrayList;
import java.util.Collection;
/**
* Collection是父类,所以里面的方法是子类都有的
* @author 18370
*
*/
public class Collection_01 {
public static void main(String[]args){
//创建集合对象,List是有序的,set是无序的
Collection c1=new ArrayList();
//判断集合是否为空用isEmpty()方法
System.out.println(c1.isEmpty());
//集合中不能保存基本类型的,需要转换为对应包装类才可以
//这里会进行自动装箱为Integer类型,然后发生多态转型为Object类型,进行存储
c1.add(123);
c1.add(new Integer(1));
c1.add(new Collection_01());
//int size:返回集合中的元素个数
System.out.println(c1.size());
System.out.println(c1.isEmpty());
//删除,会调用要删除元素equals方法,但是Integer方法覆写了,所以可以把1删除掉
c1.remove(1);
A a=new A("张三");
A a1=new A("张三");
c1.add(a);
//所以使用集合保存自定义类型的时候,要注意是否覆写equals方法,定义怎么算相等
c1.remove(a1);
//把集合转换为数组
Object[]arr=c1.toArray();
//遍历数组
for(Object object:arr){
System.out.println(object);
}
//清空集合
c1.clear();
System.out.println(c1.size());
}
}
class A{
private String name;
public A(String name) {
super();
this.name = name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
A other = (A) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
@Override
public String toString() {
return "A [name=" + name + "]";
}
}
1.5注意Contains和remove
Contains(数据) : 判断集合中是否包含某个元素
Remove(数据 ) : 删除指定元素
两个方法底层都会自动调用该对象的equals方法
因为不管是判断是否包含还是删除,都要先找到这个数据,而找到只能比较
但是集合中保存的都是引用类型,所以比较只能使用equals方法
所以如果存储的是自定义类型,就要考虑equals方法的覆写问题
2.Iterator
2.2 常用方法
2.3使用方法
在面向对象编程里,迭代器模式是一种设计模式(前人栽树,后人乘凉),是一种最简单也最常见的设计模式
*
* 它可以让用户透过特定的接口寻访容器中的每一个元素而不用了解底层的实现
*
* 获取该集合的迭代器对对象
* Iterator it=集合对象.iterator();
* 三个方法:
* 1.boolean hasNext():判断下面还有没有元素如果有就返回True,没有就返回false
* 2.E.next():获取下一个元素,并指向下一个元素
* 3.remove():删除当前指向的元素
* 三个方法的使用步骤,就是1,2,3按照这个顺序调用
* 注意:迭代器一旦创建,集合中就不能添加和删除了元素(长度不能更改了)
* 如果添加或者删除乐元素,那么迭代器必须重新生成
* 增强for循环 就是为了 让用iterator访问的方式简单,写起来更方便,当然功能不太全,比如删除,还是要用iterator来删除
public static void main(String[]args){
//Collection c1=new ArrayList();
//Collection c2=new HashSet();
Collection c1=new LinkedList();
c1.add(1);
c1.add("abc");
//判断是否包含
System.out.println(c1.contains(1));
//创建迭代器
Iterator it=c1.iterator();
//遍历 判断下面是否有元素
while(it.hasNext()){
//获取并指向下一个元素
Object obj=it.next();
System.out.println(obj);
}
//使用完之后,想再次使用,需要重新创建
it =c1.iterator();
//迭代器创建之后,不能添加和删除,需要重新生成迭代器
c1.add(2);
c1.add(3);
c1.remove(1);
it=c1.iterator();
while (it.hasNext()){
//获取并指向下一个元素
Object obj=it.next();
System.out.println(obj);
//使用迭代器的时候,不能更改集合个数,所以删除数据的时候不能使用集合的删除,要使用迭代器的删除
//c1.remove(obj);
it.remove();
}
System.out.println(c1.size()+ "----");
}
3.List
3.1概述
3.2ArrayList
ArrayList底层也是数组,下标从0开始
默认初始化容量为10,扩大容量为原始容量的1.5倍
并且默认容量是第一次添加数据的时候设置的
也就是说 我们new ArrayList()的时候,数组长度是为0的
1.5倍:长度+长度>>1
public static void main() {
List list=new ArrayList();
list.add(1);
list.add(2);
list.add(3);
//add(E e):尾部添加
//add(int index ,E e):添加到指定位置
//set(int index,E e):更改指定位置上的元素值
//remove(Object object):根据元素类容删除
//remove(int index):根据索引删除
//get(int index):获取指定位置的数据
list.add(1,4);
list.set(3,44);
System.out.println(list.get(2));
//这是根据索引删除
list.remove(1);
//删除元素值为1
list.remove(new Integer(1));
System.out.println(list);
//传统for遍历
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
//foreach遍历
for(Object object:list){
System.out.println(object);
}
//迭代器遍历
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
3.2.1基本使用
3.2.2常用方法
3.2.3遍历
//传统for遍历
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
//foreach遍历
for(Object object:list){
System.out.println(object);
}
//迭代器遍历
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
3.3LinkedList
3.3.1基本使用办法
总结 : 和 ArrayList操作 一模一样
public static void mian(String[]args){
LinkedList list=new LinkedList();
// add(E e ) : 尾部添加
// add(int index , E e ) : 添加到指定位置
// set(int index, E e ) : 更改指定位置上的元素值
// remove(Object object) : 根据元素内容删除
// remove(int index) : 根据索引删除
// get(int index) : 获取指定位置的数据
// 首部添加
list.addFirst(1);
// 首部添加
list.push(11);
// 首部添加 成功返回true
list.offerFirst(111);
// 尾部添加
list.addLast(2);
// 尾部添加 成功返回true
list.offerLast(22);
// 尾部添加 成功返回true
list.offer(222);
// 上面这几个方法 没啥区别,本质就是 linkLast 和 linkFirst
list.add(1);
list.add(2);
list.add(3);
list.add(0, 4);
list.set(3, 33);
System.out.println(list.get(2));
// 这是根据索引删除
list.remove(1);
// 删除元素值为1
list.remove(new Integer(1));
System.out.println(list);
//传统for遍历
for(int i=0;i<list.size();i++){
System.out.println(list.size());
}
//foreach
for(Object object:list){
System.out.println(object);
}
//迭代器遍历
Iterator it=list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
3.3.2底层实现
3.3.2.1Node
3.3.2.2LinkedList
3.3.2.3add方法实现
3.3.2.4Get方法实现
获取数据
Get方法 只是模拟了下标获取数据的方式,本质就是遍历,从头挨个去找
所以这可以理解为 并不是下标,只是决定了循环次数
而 ArrayList的get才是根据下标获取