java 集合

集合

      Collection接口

    /         \

  List接口       Set接口

  /   \        /     \

ArrayListLinkedListHashSet类  LinkedHashSet

 

数组          链表       数组+链表  数组+双向链表(有序)

查找快    增删快

存重复的 有序存储 先进先出     存不重复的 无序存储 无下标

自定义的元素类重写hashCode()equals()

 

数据存储的常用结构有:堆栈、队列、数组、链表

 

l堆栈

n先进后出  弹夹

n压栈:就是存元素。把元素存储到栈顶,栈中元素向下移动一个位置。

n弹栈:就是取元素。取出顶端位置元素,栈中元素向上移动一个位置。

 

l队列

n先进先出  安检

 

l数组 int[] arr={1,2,3};

n查找快:    通过索引 快速查找

n增删慢: 增:创建新数组  存储新元素 赋值 原数组

删:创建新数组  赋值 原数组(未删除的)

 

l链表  数据域+指针域

n多个节点之间,通过地址进行连接  多个人手拉手

n查找元素慢:通过连接的节点,依次向后查找指定元素

n增删元素快:修改连接下个元素的地址

 

 

Collection接口  

Collection<String> coll = new ArrayList<String>(); //多态创建对象

Collection coll = new ArrayList(); //元素obj

coll.add("ab"); //true 添加 String元素对象

coll.add("cd");  coll.add(1);自动装箱  基本数值

coll.add("ef");  //确定string泛型后 编译报错

 

System.out.println(coll); // [ab, cd, ef] 打印集合  默认调用toString()

coll.remove("cd"); // true 删除元素 [ab, ef]

coll.contains("ab"); // true 集合是否包含指定元素    

coll.size(); // 2 集合元素个数

coll.clear(); // [] 清空集合元素    void

coll.isEmpty(); // true 是否为空

 

// 遍历   集合 转 数组

String[] arr = coll.toArray(); Object[] arr=col.toArray(); // {"ab", "ef"}

for(int i=0;i<arr.length;i++){

System.out.println(arr[i]);// String str=(String)arr[i];

       //System.out.println(str.length());

}

// 遍历   集合  向下转型

ArrayList<String> arrL=(ArrayList<String>)coll; ArrayList arrL=(ArrayList)coll;

for(int i=0;i<arrL.size();i++){

System.out.println(arrL.get(i)); //String str=(String)a.get(i);

//System.out.println(str.length());

}

// 返回容器的迭代器对象 迭代器遍历时 增删 导致并发修改异常

Iterator<String> it = coll.iterator(); Iterator it = coll.iterator();

while(it.hasNext()){ // 是否有下一个可迭代元素  true/false

String str = it.next(); String str = (String) it.next();确定泛型后不强转

System.out.println(str.length());// 取出迭代的下一个元素 没元素 报错

}

for (Iterator it = coll.iterator(); it.hasNext(); ) {//迭代器for循环的形式的使用

System.out.println(it.next());

}

 

// 遍历 集合 增强for循环(JDK1.5)不能增删集合

//for(Object str : coll){ //底层是迭代器

for(String str : coll){ // Str为遍历集合的元素

System.out.println(str);

}

 

//int[] arr = new int[]{1,2};

 

Collections.sort(arr);//排序

 

Collections.shuffle(arr);//打乱顺序

for(int i:arr){

System.out.println(i);

}

 

 

泛型(在编译的时候 不进class文件 注释也不进 )

含有泛型的类   创建类的 时候确定 泛型类型

class ArrayList<E>{ public boolean add(E e){ } public E get(int index){ } }

 

含有泛型的接口//迭代器接口

public interface Iterator<E> { public abstract E next(); }

 

实线或继承时明确泛型  只能传String类型

public final class Scanner implements Iterator<String> { public String next(){ } }

 

创建对象时,确定泛型的类型

ArrayList<String> list = new ArrayList<String>();

Iterator<String> it = list.iterator();

 

类型转换异常 提前到了编译时期 变成了编译失败。

 

传参时使用

泛型通配符<?>   只能用Object类的方法,元素自身方法无法使用

<? extends E> 接收E类或E的子孙类 的元素  E可以是接口(extends

<? super E> 接收E类或E的祖宗类 的元素

 

class Dog extends Animal{  void kanjia(){...}}

class Cat extends Animal{  void zhuolaoshu(){...}}

public static void main(String[] args) {

ArrayList<Dog> arr=new ArrayList<Dog>();

arr.add(new Dog("旺财",10))

HashSet<Cat> set=new HashSet<Cat>();

set.add(new Dog("小花",8));

bianli(arr);

bianli(set);

}

public static void bianli(Collection<? extends Animal> col){ //<A及子类>

Iterator<? extends Animal> it=col.iterator();

while(it.hasNext()){

Object obj=it.next();

if(obj instanceof Dog){

Dog d=(Dog)obj;

System.out.println(d.kanjia());

}else if(obj instanceof Cat){

Cat c=(Cat)obj;

System.out.println(c.zhuolaoshu());

}

}

}

 

List接口

List<String> list=new ArrayList<String>();

list.add("a"); // 添加元素

list.add("b");

list.add(1,"c"); // 指定位置 添加元素

System.out.println(list); // [a,c,b]

 

//bollean flag=list.remove("c"); // 删除指定元素  true

String str=list.remove(2);// 指定索引删除元素

System.out.println(str); //c

 

System.out.println(list.get(0));//根据索引返回元素

list.size(); // 获取长度

list.set(1,"z"); // 替换索引处元素,返回被替换元素

 

for (int i = 0; i < list.size(); i++) {

String str = list.get(i); // 查看指定索引处元素

System.out.println(str);

}

Iterator<String> it = list.iterator();

while (it.hasNext()) {

String str = it.next();

System.out.println(str);

}

int index = list.indexOf("php");//位置索引

boolean flag = list.contains("php");// 是否包含

LinkedList集合 链表结构增删快     coll接口共有方法+独有方法

LinkedList<String> link = new LinkedList<String>();

link.addFirst("a");// 指定元素添加到开头

link.addLast("b");// 指定元素添加到结尾

link.push("abc4");   // 默认添加到结尾

link.getFirst();// 查看第一个元素

link.getLast(); // 查看最后一个元素

link.removeFirst();//删除第一个元素

link.removeLast();//删除最后一个元素

 

link.pop()); //弹出集合中的栈顶元素

 

Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代

Vector<String> v=new Vector<String>();    //创建向量   同步  安全  慢

v.addElement("a");//添加元素

v.addElement("b");

v.addElement("c");

v.elementAt(1); //获取索引出元素

Enumeration<String> e=v.elements(); // 枚举器

 

while(e.hasMoreElements()){ // 判断是否有下一个元素

String str = e.nextElement();// 获取下一个元素

System.out.println(str);

}

 

 

Set接口 无序 无索引    不能存重复元素

HashSet集合

存放自定义对象,须重写hashCodeequals方法

contains()底层用的equals 不重写 判断地址是否重复

 

数组+链表

HashSet():  初始容量16 加载因子0.75;  存到第12个时 自动扩容

set对象调用add()方法时

先调用hashCode()方法 得到hash(地址计算)  无重复 存入集合

有重复 再调用equals()方法 无重复 存入集合 链入

数组:  hash值  0x001  ox002

链表:  元素 a,10    a,11

      b,9

import java.util.HashSet;

public class HashSetDemo2 {

public static void main(String[] args) {

Set<String> set=new HashSet<String>();

set.add("china");

set.add("hello"); // 无序

set.add("hello"); // false集合中不能存储重复元素

 

HashSet<Student> hs = new HashSet<Student>();//创建集合对象

hs.add(new Student("zhangsan",18)); //添加元素对象

hs.add(new Student("lisi",19));

hs.add(new Student("lisi",19));

 

//遍历集合对象

for (Student student : hs) {

System.out.println(student);

}

}

}

class Student {

String name;

int age;

public Student(String name,int age) {

this.name = name;

this.age = age;

}

public String toString() {

return "Student [name=" + name + ", age=" + age + "]";

}               

public int hashCode() {  //减少equals方法比较   提高效率

final int prime = 31;

int result = 1;

result = prime * result + age;

result = prime * result + ((name == null) ? 0 : name.hashCode());

return result;

}

public boolean equals(Object obj) {

if (this == obj){return true;} //对象是否一样

if (obj == null){return false;} //对象是否为空

if (getClass() != obj.getClass()){return false;}//对象类型是否一样

 

Person other = (Person) obj; //向下转型

if (age != other.age){return false;}//比较年龄是否相等

if (name == null) { //比较年龄是否相等

if (other.name != null){return false;}//只有一个为空

}

else if (!name.equals(other.name)){return false;} 值不相等

return true;

}

}

 

 

LinkedHashSet   双向链表   有序

public class LinkedHashSetDemo {

public static void main(String[] args) {

Set<String> set = new LinkedHashSet<String>();

set.add("bbb");

set.add("aaa");

set.add("abc");

set.add("bbc");

Iterator it = set.iterator();

while (it.hasNext()) {

System.out.println(it.next());

}

}

}

 

Collections工具类

Collections.sort(list);//排序

int index = Collections.binarySearch(list,"a");// 二分查找(有序列表)

Collections.reverse(list);//反转列表元素

Collections.shuffle(list);//傻否,随机置换元素位置

Collections.swap(list,0,1);//列表中的两个索引进行位置互换

Collections.fill(list,"android");//使用指定对象 填充列表的所有元素

//创建目标列表 长度 大于等于 源列表

Collections.copy(listNew, listOld);//把源列表中的数据覆盖到新列表

 

posted @ 2019-01-04 11:24  博客张C  阅读(185)  评论(0编辑  收藏  举报