• 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);//把源列表中的数据覆盖到新列表

     

  • 相关阅读:
    MySQLFront导入SQL文件报#1113错误解决
    LNMP1.3一键安装Linux环境,配置Nginx运行ThinkPHP3.2
    币胜网虚拟货币交易平台安装说明
    windows服务器详细安全设置
    WINDOWS SERVER 2008远程桌面端口修改方法
    mac终端ssh连接服务器 空闲的时候 连接断开
    FTP软件发送"AUTH TLS"提示 无法连接到服务器
    LNMP状态管理命令
    lnmp1.4环境FTP服务器的安装和使用
    springCloud
  • 原文地址:https://www.cnblogs.com/javscr/p/10218873.html
Copyright © 2020-2023  润新知