Java集合框架二

Java集合框架知识解析二

      上一篇《java集合框架知识解析一》主要讲了java体系中的集合框架这一大体系的分类,和主要的知识体系结构的内容。该篇主要是在第一篇的基础上,进一步细化知识点,通过例子和蚊子叙述对细节知识进行说明。

一、ArrayList相关知识点

    1、去除ArrayList集合中重复元素

思路:我们考虑重新构建一个容器,将旧容器中的元素依次拿到新容器中,并判断是否存在,若存在,则丢弃,否则,存入新容器中

主要代码实现:

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;
}

2、List集合判断元素是否相同,依据的是元素的equals方法。equals方法正是比较的对象的地址是否相同来判断两个元素是否一致的。
     al.remove(new Person("hello world",12);//返回结果为false
      原因:ArrayList中已经存在了一个hello world,12的对象,删除时传入的虽然值是hello world ,12;但是却是一个新的对象,因此比较结果为false,所以删除失败。另外,还有contains()方法也是通过equals方法来实现的。
      如果要根据比较对象属性来区别是否相同,则应该自己重写equals方法,具体实现代码在练习中已经出现,贴出如下:
import java.util.*;


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


public String getName()
{
return name;
}


public int getAge()
{
return age;
}


public boolean equals(Object obj)
{
if(!(obj instanceof Person))
{
return false;
}
Person p = (Person)obj;


return this.name.equals(p.name)&&this.age==p.age;
}
}
class ArrayListTest2
{
public static void main(String [] args)
{

ArrayList al = new ArrayList();
a1.add(new Person("Hello World01",12);
a1.add(new Person("Hello World02",13);
a1.add(new Person("Hello World03",14);
a1.add(new Person("Hello World04",15);

a1.add(new Person("Hello World04",15);
al.add(new Person("Hello World04",15);

singleElement(a1);

Iterator it = al.iterator();

while(it.hasNext())
{
Person person = (Person)it.next();
sop(person.getName()+"..."+person.getAge());
}
System.out.println("Hello World");
}

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

public static ArrayList singleElement(ArrayList al)
{
//定义一个临时容器
ArrayList newAl = new ArrayList();

Iterator it = newAl.iterator();

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

if(!newAl.contains(obj))
{
newAl.add(obj);
}
}
return newAl;
}
}
二、LinkedList
LinkedList特有的方法:
addFirst(E e);addLast(E e);在头部和尾部添加一个元素,泛型;getFirst();getLast();获取第一个和最后一个元素;
removeFrist();removeLast();获取元素,但是元素被删除。如果集合中没有元素,会出现NoSuchElementException
另外在jdk1.6中出现了替代方法:offerFirst(E e) ;offerLast(E e );在列表的开头和结尾插入指定的元素
peekFirst();peekLast();获取元素,但不删除元素。如果集合中没有元素,会返回null。
pollFirst();pollLast();获取元素, 但是元素被删除。如果集合中没有元素,会返回null。注意两类方法的区别。   
    2、使用LinkedList模拟一个堆栈或者队列数据结构。
      堆栈:先进后出(First In Last Out):FILO 类似于:杯子
      队列:先进先出(First In First Out) FIFO类似于:水管
堆栈:
class LinkedListStack {
	// 堆栈内部使用一个LinkedList容器存放元素
	private LinkedList data = new LinkedList();
	public boolean isEmpty() {
		return data.isEmpty();
	}
	public Object top() {
		// 取栈顶元素相当于取LinkedList容器的头位置的元素
		return data.getFirst();
	}
	public void push(Object element) {
		// 压入元素相当于在LinkedList容器的头位置插入元素
		data.addFirst(element);
	}
	public void pop() {
		// 弹出元素相当于删除LinkedList容器的头位置的元素
		data.removeFirst();
	}
}

队列:
class MyQueue
{
private LinkedList ll=new LinkedList();
void put(Object o)
{
ll.addLast(o); //尾部添加元素
}
public Object get()
{
return ll.removeFirst(); //从前面删除
}
public boolean empty()
{
return ll.isEmpty();
}
public static void main(String[] args)
{
MyQueue mq=new MyQueue();
mq.put("one");
mq.put("two");
mq.put("three");

System.out.println(mq.get());
System.out.println(mq.get());
System.out.println(mq.get());
System.out.println(mq.empty());
}

}
     3、List特有的迭代器:ListIterator是Iterator的子接口
           在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生操作异常(ConcurrentModificationException),所以,在迭代时,只能用迭代器的方法操作元素,
可是Iterator方法一共有三个,是有局限的。如果想要其他的操作诸如添加、修改等,就需要使用其子接口:ListIterator
           该接口只能通过List集合的listIterator方法获取

 程序解释如下:

import java.util.*;//导包


class ListDemo
{
public static void main(String [] args)
{
//演示列表迭代器
ArrayList a1 = new ArrayList();

//添加元素
a1.add("abc");
a1.add("aaa");
a1.add("bbb");

/*
//在迭代过程中,准备添加或者删除元素

Iterator it = a1.iterator();

while(it.hasNext())
{
Object obj = it.next();//迭代器方法

if(obj.equals("aaa"))
{
//a1.add("ccc");//集合的方法
a1.remove();//迭代器的方法,从迭代器指向的 collection 
//中移除迭代器返回的最后一个元素
//即将obj的引用从迭代器中删除
}
//警告:两种方式操作元素时,会产生并发操作异常.即两种方式不能混合使用.
}
*/

ListIterator li = a1.listIterator();
while(li.hasNext())
{
Object obj = li.next();

if(obj.equals("bbb"))
{
//li.add("java0000");
li.set("jjaf");
}
}
sop(li.hasNext());
sop(li.hasPrevious());

sop(a1);
}

//简单基础方法
public static void mehtod_base()
{
ArrayList a1 = new ArrayList();

//添加元素
a1.add("abc");
a1.add("aaa");
a1.add("bbb");

//在指定位置添加
a1.add(1,"a");

//删除指定位置的元素
a1.remove(1);

//修改元素
a1.set(2,"007");

//通过角标获取元素
a1.get(1);

//获取所有元素
//1 for循环实现
for(int i = 0; i<a1.size(); i++)
{
sop(a1.get(i));
}
//2迭代器实现
//2.1for循环
for(Iterator it = a1.listIterator();it.hasNext(); )
{
sop(it.next());
}
//2.2while循环
Iterator it = a1.iterator();
while(it.hasNex())
{
sop(it.next());
}

//通过indexOf获取对象的位置
a1.indexOf("aaa");

//通过角标位置获取子集
a1.subList(1,3);
}

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

4、Vector:枚举就是Vector特有的取出方式,发现枚举和迭代很像,其实枚举和迭代就是一样的

二、Set

HashSet:数据结构为哈希表,线程是不同步的。保证元素唯一性的原理:判断元素的hashCode值是否相同;如果相同个,还会继续判断元素的equals方法,是否为true

TreeSet:可以对Set集合中的元素进行排序。底层数据结构式二叉树。保证元素的唯一性的依据:compareTo方法return 0 ;

                  TreeSet排序的第一种方式:让元素自身具备可比较性,元素需要实现comparable接口,覆盖compareTo方法,这种方式也称为自然顺序,或者是默认顺序

                  TreeSet排序的第二种方式:当元素不具备可比较性时,或者具备的可比较性不是所需要的,这时就需要让集合自身具备可比较性。所以,解决办法就是,在集合初始化时,就有了比较方式。

                  当两种方式都存在时,以比较器为主。

     记住:排序时,当主要条件相同时,一定要判断一下次要条件。

      一个set的具体练习就是:按照字符串长度排序。代码实现自己完成。

       

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值