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

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

2015-12-27 20:17 525 查看
集合中存储的是对象的引用(地址)而不是对象的实体。

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;

}

}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: