数组有弊端
数组需要定义长度,在不知道数据量的前提下使用时比较麻烦的,要频繁的对数组进行扩容
当向数组中插入元素时,其他元素都要向后移动,这也为我们使用数组提供了额外的维护数组的代码量
所以就有另一种 java中的集合框架
Collection接口
这个接口定义了集合的相关特征.
这个接口派生了两个子接口
List:可重复集合(同一个元素可以放入若干次)
用一个元素是指的equals 为true的
有序集
Set: 不可重复集合
无序集
方法:
int size() 返回集合中的元素数量里面有多少元素就返回多少
boolean isEmpty() 集合是不是空的没有元素返回true 有元素返回false
boolean contains(Object obj) 集是否包含指定的元素
void clear() 清空集合
boolean add(E e) 向集合中添加元素
boolean remove(E e) 从集合中删除指定元素
boolean addAll(Collection c):将给定集合中的所有元素添加到当前集合(并集)
boolean removeAll(Collection c):删除当前集合(只删除当前的)中与给定集合相同的元素
Iteator iterator() 迭代器 定义了遍历集合的相关方法,不同的集合有不同的迭代器实现
boolean hasNext() 是否还有元素可以获取
Object next() 获取元素
void remove()删除当前迭代出的元素
遍历集合的顺序要:问->取(->删),删除可不做
List 集合的实现类
ArrayList 内部使用数组实现的集合 比较常用 查询速度快
根据数组的实现原理,这个集合更适合查询数据,但是对频繁的增删元素 效率低下
LinkedList 使用链表方式实现的机会 频繁的修改元素
根据链表的实现原理这个集合更适合增删元素,但是对于频繁的查询元素 效率低下
package day27;
import java.util.ArrayList;
import java.util.List;
/**
*ArrayList
*List 的子类实现
*由数组方式实现的可重复的有序集
*/
public class Demo01 {
public static void main(String[] args){
List list = new ArrayList();
list.add("1");//list 是有序的集合 所以add方法是顺序向集合末尾添加元素
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
list.add("7");
list.add("8");
System.out.println(list.size());
System.out.println(list.isEmpty());
System.out.println(list);
list.clear();
System.out.println(list.size());
System.out.println(list.isEmpty());
System.out.println(list);
}
}
package day27;
import java.util.ArrayList;
import java.util.List;
public class Demo02 {
public static void main(String[] args){
List list1 = new ArrayList();
List list2 = new ArrayList();
List list3 = new ArrayList();
list1.add("1");
list1.add("2");
list1.add("3");
list2.add("4");
list2.add("5");
list3.add("1");
list3.add("2");
//判断元素是否相同,使用的是equals方法
list1.addAll(list2);//将集合2中元素存入集合1
System.out.println(list1);
list1.removeAll(list3);//将集合1中与集合3相同的元素删除
System.out.println(list1);
list1.retainAll(list2);//只保留集合1中与集合2都有的元素 取交集
System.out.println(list1);
}
}
增删改查
List接口中定义的方法
get(int index) 获取指定位置的元素 只有List集合具有
set(int index,Object obj)将指定位置上的元素替换为给定元素,返回被替换的元素
add(int index,Object o)重载的方法 在指定位置插入给定的元素,原来的元素顺序向后移动
remove(int index)重载的方法,删除指定位置的元素,返回被删除的元素
indexOf()查找给定元素在集合中第一次出现的位置
lastIndexOf()查找给定元素在集合中最后一次出现的位置
package day27;
import java.util.ArrayList;
import java.util.List;
public class Demo03 {
public static void main(String[] args){
List list = new ArrayList();
list.add("1");
list.add("1");
list.add("2");
list.add("3");//增
list.add("44");
list.remove(2);//删下标是2的
list.add("3");
list.add(1,11);//插入一个新元素
list.remove("44");//删除一个指定的元素
System.out.println("第一次输出集合:"+list);
//获取回来时时以Object获取的,需要造型
String element = (String)list.get(2);//有下标越界问题从0开始
System.out.println("输出下标为2的元素:"+element);
Object old =list.set(1,"22");//改
System.out.println("输出将第二个元素修改后的结果:"+list);
System.out.println("输出修改时候的返回值:"+old);
int index = list.indexOf("3");//第一次出现的位置
System.out.println("元素第一次出现的位置"+index);
int lastindex = list.lastIndexOf("1");
System.out.println("元素最后一次出现的位置"+lastindex);
for(int i = 0 ; i<list.size();i++){//集合的迭代输出
System.out.print(list.get(i)+",");//查
}
System.out.println();
for(int i = 0 ; i<list.size();i++){
System.out.println(list.get(i));
}
//数组的
int[] arr = new int[5];
for(int i = 0; i<arr.length;i++){
arr[i]=i+100;
}
for(int a:arr){
System.out.println(a);
}
}
}
Collection定义的方法:
toArray()
package day27;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Demo04 {
public static void main(String[] args){
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
Object[] array = list.toArray();
//参数给定的就是具体要转换的数组的实例,不需要长度 减少浪费空间
//返回时要造型
//要转换的数组类型要和集合中存放的类型一致
// **********
//所有数组都是Array的类型
String[] strArray = (String[])list.toArray(new String[0]);
System.out.println(Arrays.toString(strArray));
List list2 = new ArrayList();
list2.add(1);
list2.add(2);
list2.add(3);
Integer[] intArray = (Integer[])list2.toArray(new Integer[0]);
System.out.println(Arrays.toString(intArray));
}
}
package day27;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class Demo05 {
public static void main(String[] args){
List list = new LinkedList();
list.add("1");
list.add("#");
list.add("2");
list.add("#");
list.add("3");
list.add("#");
list.add("4");
list.add("#");
list.add("5");
Iterator it = list.iterator();
while(it.hasNext()){
String element = (String)it.next();
if("#".equals(element)){
it.remove();//通过迭代器删除刚刚被迭代出来的元素
}
System.out.println(element);
}
System.out.println(list);
}
}
泛型
1.5 之后的特性
泛型的本质就是参数化类型,在使用某个类时为方法,属性等指定类型。
允许多个 泛型 使用 , 隔开
更加灵活
动态给类型
尽量使用有意义的名字
泛型不能参与运算
定义后不指定类型,就是Object类
java 是强类型语言 不像python
so 泛型是假的 其实他还是Object 只是java知道他是你指定的类型 会自动的类型转换, 也有可能会有类造型异常的现象(ClassCastException)(自己作孽)
package day27;
public class Demo07<X,Y> {
private X x;
private Y y;
public Demo07(X x,Y y){
this.x = x;
this.y = y;
}
public X getX(){
return x;
}
public Y getY(){
return y;
}
public void setX(X x){
this.x = x;
}
public void setY(Y y){
this.y = y;
}
}
package day27;
public class Demo08 {
public static void main(String[] args){
Demo07<Double,String> p = new Demo07<Double,String>(3.14,"3.14");
Demo07<Integer,Integer> p2 = new Demo07<Integer,Integer>(1,1);
Demo07<Integer,String> p3 = new Demo07<Integer,String>(1,"1");
Demo07 p4 = new Demo07(1,2);//定义后不指定类型,就是Object类
p.setX(3.1415);
p2.setX(111);
p3.setY("3.123");
}
}
package day27;
//泛型是假的 其实他还是Object 只是java知道他是你指定的类型 会自动的类型转换, 也有可能会有类造型异常的现象(ClassCastException)(自己作孽)
public class Demo09 {
public static void main(String[] ags){
Demo07<Integer,Integer> p = new Demo07<Integer,Integer>(1,1);
p.setX(2);
p.setY(2);
set(p);
int x = p.getX();//Exception in thread "main" java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Integer
int y = p.getY();
System.out.println(x+","+y);
}
public static void set(Demo07 p){
p.setX(3.1);
p.setY(3.1);
}
}
集合中的泛型
集合中的泛型通常是约束集合中存放元素的类型
package day27;
import java.util.ArrayList;
import java.util.List;
public class Demo10 {
public static void main(String[] args){
List<String> list = new ArrayList<String>();//限制了list 集合中的数据,只能是String类型
list.add("1");//泛型约束了add 方法的参数类型
//list.add(1);
String element = list.get(0);//也约束了get方法的返回值类型
System.out.println(element);
}
}
迭代器也支持泛型,知识需要注意 迭代器的泛型应该与要迭代的集合的泛型保持一致
package day27;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Demo11 {
public static void main(String[] args){
List<String> list = new ArrayList<String>();//限制了list 集合中的数据,只能是String类型
list.add("一");//泛型约束了add 方法的参数类型
//list.add(1);
list.add("二");
list.add("三");
list.add("四");
String element = list.get(0);//也约束了get方法的返回值类型
System.out.println(element);
System.out.println("--------------------");
Iterator<String> it = list.iterator();
while(it.hasNext()){
String elements = it.next();
System.out.println(elements);
}
}
}