容器--数组
数组特点:
一组数据类型相同的元素集合
创建数组时,必须给长度,且一旦创建长度不能变。
一旦数组元素装满,需要创建一个新数组,将元素复制过去。
不方便:
判断是否装满,如果装满,将数组复制。
如果我们从数组中删除/添加一个元素,需要移动后面的元素。
Java中为了解决数组存储单一的情况,java中提供了许多不同结构的集合类,让我们根据不同的场景进行数据存储的选择。
集合:
单列集合:
一次放入一个值或一个对象。
Collection接口:定义了单列集合共有方法;
List:可以有重复元素(有序)
ArrayList 数组列表(ArrayList<E>泛型,声明类型,指定存储的元素类型。)
集合容器中默认可以添加Object类型
add(E e)默认是向末尾添加元素。
add(0,e)向指定位置添加元素。
但一般还是习惯一个集合对象中只保存同一类型;保存多个类型,后期处理时,涉及类型转换问题。
底层有一个数组,可以动态扩展数组长度,并提供一个一系列方法操作。
查询快 ;中间增加快,删除慢。
import java.util.ArrayList;
import java.util.Arrays;
public class Dome1 {
public static void main(String[] args) {
ArrayList arrayList = new ArrayList();
arrayList.add("a");
arrayList.add("b");
arrayList.add(1);
arrayList.add("c");
arrayList.add("b");
arrayList.add("b");
System.out.println(arrayList);
System.out.println(arrayList.remove("a"));//移除并返回数组中第一个出现的元素,若去除返回true;else返回false。
System.out.println(arrayList);
System.out.println(arrayList.indexOf("b"));//返回元素第一次出现的位置。
System.out.println(arrayList.lastIndexOf("b"));//返回元素逆序第一次出现的位置。
System.out.println(arrayList);
arrayList.set(1,"x");//将数组中哪一个位置,覆盖为所要加入的元素
System.out.println(arrayList.get(1));//获取第intger位的元素。
System.out.println(arrayList);
System.out.println(arrayList.remove(1));//移除第int位的元素
arrayList.add(9,"e");//往数组相应位置添加元素,但其大小不能超过数组长度。
arrayList.size();//输出数组长度
arryList.contains("a");//判断集合中是否有该元素
System.out.println(arrayList);
}
}
/*------------------------------*/
public static void main(String[] args) {
ArrayList<String> arrayList=new ArrayList();
arrayList.add("abc");
//arrayList.add(123);报错,因为只能存储String类型的元素。
}
LinkedList 链表列表
底层是一个链表结构
查询慢,增加,删除快。
import java.util.LinkedList;
public class Dome3 {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList();
linkedList.add("a");
linkedList.add("b");
linkedList.add("c");
linkedList.add("d");
linkedList.addFirst("x");
linkedList.addLast("z");
System.out.println(linkedList);
System.out.println(linkedList.getFirst());
System.out.println(linkedList.getLast());
System.out.println(linkedList.get(3));
System.out.println(linkedList);
System.out.println(linkedList.pop());
System.out.println(linkedList.removeFirst());
System.out.println(linkedList.removeLast());
System.out.println(linkedList);
linkedList.clear();
System.out.println(linkedList);
}
}
Vector 数组列表,线程安全
List接口的集合:
for():
普通for()循环:允许操作元素,但要注意索引变化与元素位置的移动。
增强for( 类型名:数组名)循环:只适合数组的遍历,不允许进行修改(删除,增加)
迭代器遍历iterator();
Listiterator迭代器:只能对List接口下的集合遍历,
Listiterator(index):可以从指定位置开始向前或向后便利。hasnext/hasPrevious。
import java.util.ArrayList;
import java.util.Iterator;
public class Dome4 {
public static void main(String[] args) {
ArrayList <String> arrayList=new ArrayList();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
arrayList.add("d");
for(int i=0;i<arrayList.size();i++){
String s=arrayList.get(i);
System.out.println(s);
if(s.equals("a")){
arrayList.remove(s);
}
}
System.out.println(arrayList);
System.out.println("----------------------------------");
for(String S:arrayList){
System.out.println(S);
/*
if(S.equals("b")){
arrayList.remove(S);
}
有误,强化for循环中无法修改。
*/
}
System.out.println(arrayList);
System.out.println("----------------------------------");
Iterator<String> iterator=arrayList.iterator();
while(iterator.hasNext()){
String x=iterator.next();
if(x.equals("c")){
iterator.remove();
}
}
System.out.println(arrayList);
}
}
import java.util.ArrayList;
import java.util.ListIterator;
public class Dome5 {
public static void main(String[] args) {
ArrayList<String> arrayList=new ArrayList();
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
arrayList.add("d");
ListIterator<String> listIterator=arrayList.listIterator(arrayList.indexOf("b"));
while(listIterator.hasNext()){
System.out.println(listIterator.next());
}
System.out.println("--------------------------------------------");
ListIterator<String> listIterator1=arrayList.listIterator(4);
while (listIterator1.hasPrevious()){
System.out.println(listIterator1.previous());
}
}
}
set:不能有重复元素,元素时无序的,元素没有索引
都是(无序):不是按添加时存储的顺序放的。
两个实现子类:
HashSet:
添加元素时,如何判断重复:
如果每次使用equals(),比较内容相等,效率低。
在底层会调用String类中重写的hashcode(),返回值是根据内容计算的哈希值。
遍历时会用哈希值比较是否相等。
但是哈希值会存在问题:内容不同,哈希值相同,此种情况下在调用equals();提高效率和安全。