List 集合:
List 的子类:ArrayList:
1> 底层数据结构式数组结构,查询块,增删慢;
2> 从内存角度考虑:线程不安全的,不同步的,执行效率高;
3> 多线程:synchronized(同步的意思 ==> 解决线程安全问题);
sychronized(锁对象){ //同步代码
共享数据;
}
4> 解决线程安全问题,通过同步可以解决,但是效;率低了;
LinkedList:
1> 底层数据结构式链表结构,查询慢,增删块;
2> 从内存角度考虑:线程不安全,不同步,执行效率高;
Vector:
1> 这是一个线程安全的类,底层数据结构是数组:查询快,增删慢;
2> 线程安全的,同步,执行效率低;
ArrayList:是List接口中常用的一个子实现类;
遍历功能:1> 一个是Collection的iterator( );
2> size()和get(int index)普通for循环;
举例:
public class ArrayListDemo {
public static void main(String[] args) {
//创建集合对象
ArrayList list = new ArrayList() ;
//添加元素
list.add("hello") ;
list.add("world") ;
list.add("java") ;
//遍历
//方式1:获取迭代器
Iterator it = list.iterator() ;
while(it.hasNext()) {
String s = (String)it.next() ;
System.out.println(s);
}
System.out.println("-----------------------");
//方式2:使用size()和get(int index)加上for循环遍历
for(int x = 0 ; x < list.size() ; x ++) {
String s = (String) list.get(x) ;
System.out.println(s);
}
}
}
ArrayList集合存储自定义对象并遍历:
举例:
import java.util.ArrayList;
import java.util.Iterator;
/**
* ArrayList集合存储自定义对象并遍历
*/
class Student {
private String name ;
private int age ;
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
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 array = new ArrayList();
//创建学生对象
Student s1 = new Student("鲁智深", 30) ;
Student s2 = new Student("武松", 40) ;
Student s3 = new Student("宋江", 50) ;
Student s4 = new Student("杨志", 25) ;
//添加元素
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 s = (Student)array.get(x) ;
System.out.println(s.getName()+"----"+s.getAge());
}
}
}
综合练习:
package org.westos_05;
import java.util.ArrayList;
import java.util.Iterator;
/**
*需求:给集合中添加重复的元素(字符串类型),将重复的元素从集合去除掉!
*
*思路:
* 1)创建一个旧集合,添加重复元素
* 2)创建一个新集合
* 3)遍历旧集合中的元素获取到每一个元素
* 在旧集合中判断新集合中是否包含旧集合中的元素
* 包含,不搭理
* 不包含,添加到新集合中
*
* 4)遍历新集合
*/
public class ArrayListTest {
public static void main(String[] args) {
//创建一个集合
ArrayList list = new ArrayList() ;
//添加元素
list.add("hello") ;
list.add("world") ;
list.add("java") ;
list.add("javaee") ;
list.add("hello") ;
list.add("world") ;
list.add("hello") ;
list.add("javaee") ;
list.add("android") ;
list.add("python") ;
list.add("php") ;
list.add("php") ;
//创建一个新的集合
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);
}
}
}
注意:
1> 如果上述例题允许创建一个新的集合,怎么办?
//使用双层for循环来求解:
//引入选择排序,两个两个比较,要是相等,那么久删除后边的元素,继续循环判断,知道程序结束
for(int x = 0 ; x < array.size()-1 ; x ++) {
for(int y = x +1 ; y < array.size() ; y ++) {
//判断,前面的索引对应的元素和后面索引对应的元素进行比较,如果相等就干掉后面重复的
if(array.get(x).equals(array.get(y))) {
array.remove(y) ;
y-- ;
}
}
}
2> 使用集合ArrayList存储自定义对象(Student),去除重复的对象:
问题:这里如果在Student类中没有重写equals方法,那么程序执行错误;
原因:contains的底层需要用equals,equals默认比较的是地址值,所以想要内容相等就需要 重写equals方法;
//创建一个新集合
ArrayList newArray = new ArrayList() ;
//遍历旧集合
Iterator it = array.iterator() ;
while(it.hasNext()) {
Student s = (Student)it.next() ;
//判断,新集合中是否包含
if(!newArray.contains(s)) { //contains底层依赖于equals方法,想要比较内容需要重写equals方法;
newArray.add(s) ;
}
}
//遍历新集合
Iterator it2 = newArray.iterator() ;
while(it2.hasNext()) {
Student s= (Student)it2.next();
System.out.println(s.getName()+"---"+s.getAge());
}
Vector集合:
特有功能:public void addElement(Object obj) --->相当于:add(Object obj);
public Enumeration elements():返回此向量的枚举--->相当于:public Iterator iterator();
boolean hasMoreElements() --->相当于:boolean hasNext();
Object nextElement() --->相当于:Object next() ;
举例:
import java.util.Enumeration;
import java.util.Vector;
public class VectorDemo {
public static void main(String[] args) {
//创建集合对象
Vector v = new Vector() ;
//添加元素
v.addElement("hello");
v.addElement("world");
v.addElement("java");
//遍历
//获取Enumeration :向量的枚举
Enumeration en = v.elements() ;
while(en.hasMoreElements()) {
String s = (String)en.nextElement() ;
System.out.println(s);
}
}
}
LinkedList集合:
特有功能:添加功能:
addFirst(Object e):将指定的元素插入到列表的开头;
addLast(object e):将指定的元素添加到列表末尾;
获取功能:
getFirst():获取列表第一个元素;
getLast():获取列表第二个元素;
删除功能:
public Object removeFirst():移除并返回此列表的第一个元素;
public Object removeLast():移除并返回此列表的最后一个元素;
举例:
import java.util.LinkedList;
public class LinkedListDemo {
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);
//addLast(object e):将指定的元素添加到列表末尾
link.addLast("mysql");
System.out.println("link:"+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:"+link);
//public Object removeLast()
System.out.println("removeLast():"+link.removeLast());
System.out.println("link:"+link);
}
}
使用LinkedList模拟一个栈:(先进后出);
举例:
package org.westos_04;
import java.util.Iterator;
import java.util.LinkedList;
/**
* 需求:
* 模拟栈结构的特点,先进后出
*
* 理解:需要自定义一个类,在这个类中使用LinkedList集合的特有功能进行操作
*
*
*/
public class LinkedListDemo {
public static void main(String[] args) {
//创建linkedList集合对象
LinkedList link = new LinkedList() ;
//添加元素
//符合栈结构的特点:先进后出
link.addFirst("hello");
link.addFirst("world");
link.addFirst("java");
//使用迭代器遍历
Iterator it = link.iterator() ;
while(it.hasNext()) {
String s = (String)it.next();
System.out.println("s:"+s);
}
}
}