集合中存储的是对象的引用(地址)而不是对象的实体。
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;
}
}
java基础笔记(一--集合)
最新推荐文章于 2024-02-29 22:24:10 发布