ArrayList是List接口中常用的一个子实现类
底层是数据结构式数组结构,
其特点有:
查询快,增删慢
从内存角度考虑:线程不安全的,不同步的,执行效率高。多线程:synchronized :同步的意思 解决线程安全问题
sychronized(锁对象){ 同步代码
共享数据;
}
解决线程安全问题,通过同步可以解决,但是效率低了...
Vector集合
底层是一种可增长对象数组,
其特点有:
查询快,增删慢;
从内存角度考虑:线程安全,同步,执行效率高。特有功能:
public void addElement(Object obj)------->add(Object obj)
public Enumeration elements():返回此向量的枚举--->相当于:public Iterator iterator()
boolean hasMoreElements() --->boolean hasNext() ;
Object nextElement() --->Object next() ;
LinkedList集合的特点:
底层是一种链表实现,
其特点有:
查询慢,增删快;
从内存角度考虑:线程不安全,不同步,执行效率高。特有功能:
添加功能
addFirst(Object e):将指定的元素插入到列表的开头
addLast(object e):将指定的元素添加到列表末尾
获取功能:
getFirst():获取列表第一个元素
getLast():获取列表第二个元素
删除功能
public Object removeFirst()移除并返回此列表的第一个元素。
public Object removeLast();
每个集合都有自己特有的方法,我们先看ArrayList的几种方法
(1)遍历功能:
1)一个是Collection的iterator()
2)size()和get(int index)普通for循环
我们可以通过下面这段代码了解一下。
public static void main(String[] args) {
//创建集合对象,记得导包Ctrl+Shift+O
ArrayList list = new ArrayList() ;
//添加元素
list.add("you") ;
list.add("are") ;
list.add("beautiful") ;
//遍历,有两种方式
//获取迭代器,导包
Iterator it = list.iterator() ;
while(it.hasNext()) {
String s = (String)it.next() ;
System.out.println(s);
}
System.out.println("*******************");
for(int x = 0 ; x < list.size() ; x ++) {
String s1 = (String) list.get(x) ;
System.out.println(s1);
}
}//you are beautiful
学习了上面的方法,我们再试着实现下面这个功能。
需求:ArrayList集合存储自定义对象并遍历
分析:(1)创建一个学生类;
(2)在ArrayListDemo类中进行实现;
public class Student {
private String name ;
private int age ;
//无参构造
public Student() {
super();
}
//有参构造
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
//setxxgetxx方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public class ArrayListDemo2 {
public static void main(String[] args) {
//创建ArrayList集合对象
ArrayList array = new ArrayList();
//创建学生对象
Student s1 = new Student("小燕子", 18) ;
Student s2 = new Student("尔康", 20) ;
Student s3 = new Student("紫薇", 17) ;
Student s4 = new Student("永琪", 21) ;
//添加
array.add(s1) ;
array.add(s2) ;
array.add(s3) ;
array.add(s4) ;
//迭代器方式(前面我们是通过两种方式进行遍历的,不要忘记哦)
Iterator it = array.iterator() ;
while(it.hasNext()) {
Student s = (Student)it.next() ;
System.out.println(s.getName()+"---"+s.getAge());
}
System.out.println("********************");
for(int x = 0 ; x <array.size() ; x ++) {
Student s1 = (Student)array.get(x) ;
System.out.println(s1.getName()+" "+s1.getAge());
}
}
接下来,我们通过很简单的一段代码学习Vector集合的添加及遍历元素的方法
public static void main(String[] args) {
//创建Vector集合对象
Vector v = new Vector() ;
//添加元素
v.addElement("you");
v.addElement("are");
v.addElement("beautiful");
//遍历
//获取Enumeration :向量的枚举
Enumeration en = v.elements() ;
while(en.hasMoreElements()) {
String s = (String)en.nextElement() ;
System.out.println(s);
}
}//you are beautiful
我们再学习LinkedList集合的几个重要方法,前面我已经提到它有添加功能,获取功能,删除功能
public static void main(String[] args) {
//创建LinkedList集合对象
LinkedList link = new LinkedList() ;
//添加元素
link.add("hello");
link.add("world");
link.add("java");
System.out.println("link:"+link);
//addFirst(Object e):将指定的元素插入到列表的开头
link.addFirst("android");
System.out.println("link:"+link);
link.addLast("mysql");
System.out.println(link);
//getFirst():获取列表第一个元素
System.out.println(link.getFirst());
System.out.println(link.getLast());
//public Object removeFirst()移除并返回此列表的第一个元素。
System.out.println("removeFirst():"+link.removeFirst());
System.out.println(link);
//public Object removeLast()
System.out.println(link.removeLast());
System.out.println(link);
}//link:[hello, world, java]
//link:[android, hello, world, java]
//android, hello, world, java, mysql]
//android
//mysql
// removeFirst():android
// [hello, world, java, mysql]
// mysql
//[hello, world, java]
输出结果如上注释。
学了这么多,我们做一个小练习吧。
需求:
模拟栈结构的特点,先进后出
分析:我们需要自定义一个类,在这个类中使用LinkedList集合的特有功能进行操作
import java.util.LinkedList;
/**
* 这是自定义的栈集合类
* 在这个MyStack中使用LinkedList的特有功能
*
*/
public class MyStack {
//成员变量
private LinkedList link ;
/**
* 执行MyStack的无参构造实际是构造了个LinkedList对象
*/
public MyStack() {
link = new LinkedList() ;
}
//添加元素
public void add(Object obj) {
link.addFirst(obj);
}
//获取元素
public Object get() {
return link.removeFirst() ;
}
//判断功能
public boolean isEmpty() {
return link.isEmpty();
}
}
public class MyStackDemo {
public static void main(String[] args) {
//创建自定义的MyStack的栈集合的对象
MyStack my = new MyStack() ; //LinkedList list = new LinkedList();
//添加元素
my.add("hello"); //LinkedList ["java","world","hello"]
my.add("world");
my.add("java");
while(!my.isEmpty()) {
System.out.println(my.get());
}
}
}//java
//world
//hello
学了这么多,我们再看一个关于ArrayList集合的小练习
需求:给集合中添加重复的元素(字符串类型),将重复的元素从集合去除掉。思路:
1)创建一个A集合,添加重复元素,
2)创建一个B集合,
3)遍历A集合中的元素获取到每一个元素,
在A集合中判断B集合中是否包含A集合中的元素,
包含,不搭理
不包含,添加到B集合中
4)遍历B集合。
public static void main(String[] args) {
//创建一个集合
ArrayList list = new ArrayList() ;
//添加元素
list.add("you") ;
list.add("are") ;
list.add("beautiful") ;
list.add("you") ;
list.add("are") ;
list.add("so") ;
list.add("beautiful") ;
list.add("you") ;
list.add("are") ;
list.add("very") ;
list.add("nice") ;
list.add("great") ;
//创建一个新的集合
ArrayList newList = new ArrayList() ;
//遍历旧集合,使用第一种遍历方式,如果现在忘记第二种遍历方式了,现在点上去复习一下哟~
Iterator it = list.iterator() ;
while(it.hasNext()) {
String s = (String) it.next() ;
//判断新集合中是否包含旧集合中的元素
if(!newList.contains(s)) {
newList.add(s) ;
}
}
//遍历新集合
Iterator it2 = newList.iterator() ;
while(it2.hasNext()) {
String s = (String) it2.next() ;
System.out.println(s);
}
} //you
//are
//beaytiful
//so
//beautiful
//very
//nice
//great
这是其中一种方法,现在有这样的要求:不允许新建一个集合去完成,怎么办?
public static void main(String[] args) {
ArrayList list= new ArrayList();
list.add("hello");
list.add("world");
list.add("hello");
list.add("java");
list.add("hello");
list.add("pythe");
list.add("you");
list.add("great");
/**
* 引入选择排序,
* 用0索引对应的元素依次和后面索引对应的元素进行比较
* 如果前面的元素和后面的元素重复了,把后面元的干掉
* 依次1索引....
*/
for(int x = 0;x<list.size()-1;x++) {
for(int y=x+1;y<list.size();y++) {
if(list.get(x).equals(list.get(y))) {
list.remove(y);
y--;
}
}
}
Iterator it=list.iterator();
while(it.hasNext()) {
String s = (String)it.next();
System.out.println(s);
}
}//hello
//world
//java
//pythe
//you
//great
好的,这一小节,我就先讲到这里。