java基础笔记(一--集合)

集合中存储的是对象的引用(地址)而不是对象的实体。

Collection
    |--List:元素是有序的,元素可以重复。因该集合体系有索引
         |--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度快,但增    删稍慢。线程不同步。
         |--LinkedList:底层使用的链表数据结构。特点:增删速度快但查询稍慢。
         |--Vector:底层是数组数据结构。线程同步。
    |--Set:元素无序,元素不可重复



List集合特有的迭代器,ListIterator是Iterator的子接口。在迭代时,

不可以通过对象的方法操作集合中的元素。会发生ConcurrentModificationException

Iterator it = a2.iterator();
while(it.hasNext()){
    Object obj = it.next();
    if(obj.equals("java002"))
        //a2.add("java002");//ConcurrentModificationException
        //并发修改。迭代器方法和集合的方法同时对同一元素进行操作
        it.remove();
    sop("obj:"+obj);
    //java002仍会被打印。java002被从集合中移除,但还在内存中,仍被obj//使用
}



<pre name="code" class="java">枚举是Vector特有的去除方式。枚举跟迭代一样,但名称及方法名过长,被迭代取代了。
Vector v = new Vector();
v.add("java01");
v.add("java02");

Enumeration en = v.elements();
while(en.hasMoreElements()) {
    sop(en.nextElement());
}

ArrayList a = new ArrayList();
a.add("java01");
a.add("java02");

Iterator it = a.iterator();
while(it.hasNext()) {
    sop(it.next());
}



class ListDemo {
    public static void sop(Object obj) {
        System.out.println(obj);
    }

    public static void main(String[] args) {
        //method_1();
	ArrayList a2 = new ArrayList();
	a2.add("java001");
	a2.add("java002");
	a2.add("java003");
	a2.add("java004");
	sop("a2:"+a2);

	ListIterator li = a2.listIterator();

	while(li.hasNext()) {
		Object obj = li.next();
		if(obj.equals("java002"))
			//li.add("java005");
			li.set("java005");
	}
	sop(a2);
	/*Iterator it = a2.iterator();

	while(it.hasNext()) {
		Object obj = it.next();
		 if(obj.equals("java002"))
		     //a2.add("java002");//ConcurrentModificationException
		      it.remove();
		 sop("obj:"+obj);
	}
	sop(a2);*/
    }

    public static void method_1() {
	ArrayList a1 = new ArrayList();

	a1.add("java01");
	a1.add("java02");
	a1.add("java03");
	a1.add("java04");

	a1.add(1,"java06");//将指定元素插入指定位置
	sop(a1);

	a1.remove(2);
	sop(a1);

	a1.set(0,"java007");//改
	sop(a1);

	sop("get(1):"+a1.get(1));

	for(int i=0;i<a1.size();i++) {
		sop("a1("+i+")="+a1.get(i));
	}

	/*Iterator it = a1.iterator();
	while(it.hasNext()) {
		sop(it.next());
	}*/

	for(Iterator it=a1.iterator();it.hasNext();) {
		sop(it.next());
	}

	sop("index="+a1.indexOf("java06"));

	List subl = a1.subList(0,3);
	sop("subl="+subl);
    }
}

isEmpty()
LinkedList特有方法:
addFirst();
addLast();

获取元素,但不删除元素.若没有元素则出现NoSuchElementException
getFirst();
getLast();

也可获取元素,但删除元素,若没有元素则出现NoSuchElementException
removeFirst();
removeLast();

JDK1.6以后的替代方法 添加元素
offerFirst();
offerLast();

获取元素,但不删除元素.若没有元素则返回null
peekFirst();
peekLast();

获取元素,且删除元素,若没有元素则返回null
pollFirst();
pollLast();



/*
*使用LinkedList模拟一个堆栈或者队列数据结构
*/
import java.util.*;

class Duilie {
	private static LinkedList link; 
	//addFirst()是静态方法,link需也为static才能调用。

	Duilie() {
		link = new LinkedList();
	}

	public void myAdd(Object obj) {
		link.addFirst(obj);
		//addFirst();方法中的参数需与传进来的对应——obj
	}

	public Object myGet() {
		return link.removeLast();
	}

	public boolean isNull() {
		return link.isEmpty();
	}
}

class LinkedListTest {
	public static void sop(Object obj) {
		System.out.println(obj);
	}

	public static void main(String[] args) {
		Duilie dl = new Duilie();
		dl.myAdd("java01");
		dl.myAdd("java02");
		dl.myAdd("java03");
		dl.myAdd("java04");

		while(!dl.isNull()) {
			sop(dl.myGet());
		}
		
	}
}



/*
*将自定义对象作为元素存到ArrayList集合中,并去除重复元素
*例:存人对象。同姓名同年龄视为同一个人,为重复元素。

*思路:
*1.对人描述,将数据封装进人对象。
*2.定义容器,将人存入。
*3.取出
*/

import java.util.*;

class Person {
    private String name;
    private int age;
    Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    public boolean equals(Object obj){
        if(!(obj instanceof Person))
            return false;
        //instanceof运算符用来在运行时指出对象是否是特定类的实例。返回·boolean值。
        //即Person 是否是Object中的实例。 true

        Person p = (Person)obj;
        System.out.println(this.name+"...."+p.name);

        return this.name.equals(p.name)&&this.age == p.age;
    }

    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}

class ArrayListTest2 {
    public static void sop(Object obj) {
        System.out.println(obj);
    }

    public static void main(String[] args) {
        ArrayList a = new ArrayList();
        a.add(new Person("lisi01",30));//a.add(Object obj);//Object obj = new Person("lisi01",30);
            //只有Object能接受任意对象//传Person时类型提升,返回时就会返回Object。但Object中没有getName、getAge方法
            //错误sop(it.next().getName());
        a.add(new Person("lisi02",31));
        a.add(new Person("lisi02",31));
        a.add(new Person("lisi03",32));
        //a.add(new Person("lisi03",32));
        //a.add(new Person("lisi03",32));
        //a.add(new Person("lisi04",33));

        a = singleElement(a);

        Iterator it = a.iterator();

        while(it.hasNext()) {
            //Object obj = it.next();
            //Person p = (Person)obj;//向下转型
            Person p = (Person)it.next();
            sop(p.getName()+".."+p.getAge());
        }
    }

    public static ArrayList singleElement(ArrayList al) {
        ArrayList newal = new ArrayList();

        Iterator it = al.iterator();

        while(it.hasNext()) {
            Object obj = it.next();

            if(!newal.contains(obj))
                newal.add(obj);
        }
        return newal;
    }
}



Set:元素是无序的(存入和取出顺序不一定一致),元素不可以重复
  |--HashSet:底层数据结构是哈希表。
          HashSet是通过元素的两个方法hashCode和equals来完成的。
          如果元素的HashCode值相同,就会判断equals是否为true。
          若果不同就会调用equals。

          :对于元素是否存在,以及删除等操作,元素的hashCode和equals方法。
  |--TreeSet:

import java.util.*;

class HashSetTest {
    public static void sop(Object obj) {
        System.out.println(obj);
    }

    public static void main(String[] args) {
        HashSet ha = new HashSet();

        ha.add(new Person("a1",10));
        ha.add(new Person("a2",11));
        ha.add(new Person("a3",12));
        ha.add(new Person("a2",11));
        //ha.add(new Person("a4",13));

        sop("a1:"+ha.contains(new Person("a1",11)));//false,年龄不同
            //a1....hashCode
            //a1..equals..a1
            //a1:false

        ha.remove(new Person("a2",11));

        Iterator it = ha.iterator();

        while(it.hasNext()) {
            Person p = (Person)it.next();
            sop(p.getName()+"...."+p.getAge());
        }
    }
}

class Person {
    public static void sop(Object obj) {
        System.out.println(obj);
    }

    private String name;
    private int age;

    Person(String name,int age) {
        this.name = name;
        this.age = age;
    }

    public int hashCode() {
        sop(this.name+"....hashCode");
        //return 60;
        return name.hashCode()+age*34;
        //age*34保证hashCode值尽量不一样。也可以乘其他数值。
    }

    public boolean equals(Object obj)//有相同哈希值是系统自动调用equals方法。如上return 60 {
        if(!(obj instanceof Person))
            return false;

        Person p = (Person)obj;
        sop(this.name+"..equals.."+p.name);

        return this.name.equals(p.name)&&this.age == p.age;
    }

    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
}

 
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值