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;
}
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;
}
}
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();
}
}
{
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());
}
}
程序解释如下:
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的具体练习就是:按照字符串长度排序。代码实现自己完成。