集合类(容器类)

一、数组和集合的区别

a)数组长度固定,不能自动扩大;数组可以装载基本类型和引用类型;执行效率高;数组中数据类型一致

b)集合可以自动扩大;只能装载引用类型;比数组低;可以同时装载多种类型的数据

二、集合框架的结构

                        Collection                                                Map

                List                                        Set

ArrayList            LinkedList                HashSet                HashMap

三、直到List和Set的区别:

List 是有序有重复

Set是无序无重复

4.随机获取1-100之间不重复的7个数字并显示;

package Diyitongjin.Set;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Set_012 {
    public static void main(String[] args) {
        //泛型中使用的数据类型 只能是包装类
            Set<Integer> set =new HashSet<>();可以放空值  仅限一个
Set set=new TreeSet();//不可以放空值不重复有序
            //判断是否已经装满七个
            while (set.size()<7){
                int n= (int) (Math.random()*100+1);
            set.add(n);
            }
            //加强的 for循环  其实就是 forEach
        for (Integer a:set) {//表示从set 集合中获取每一个数据赋值
                给Integer 类型的变量 a
            System.out.print(a+" ");
        }
    }
}
List方法进行遍历微笑
package Diyitongjin.Set;

import java.util.ArrayList;
import java.util.List;

public class List_01 {
    public static void main(String[] args) {
        List<Integer> l=new ArrayList<>();
        while(l.size()<7){
            int r= (int) (Math.random()*10+1);
            if(l.contains(r)){//检测r 在List集合中是否存在
                continue;
            }
            l.add(r);
        }
        for (Integer v:l) {
            System.out.print(v+"        ");

        }
    }
}

进行排序

for (int i = 1; i <l.size() ; i++) {
            for(int j=0;j<l.size()-i;j++){
                    int a=l.get(j);
                    int b=l.get(j+1);
                    if(a<b){
                        l.set(j,b);
                        l.set(j+1,a);
                    }
            }
            }for (Integer o:l) {
                System.out.print("\t"+o); 
        }
    }
}

迭代器三种实现方法

/*
             list Iterator 方法有双向遍历的特点
                 如果要在迭代的过程中加入新的元素,那么就需要利用迭代器中的it.add()方法;
                 不能使用list.add()方法!
         */
        //三种遍历list容器的方式
        List list = new ArrayList();
        list.add("xiaoming");
        list.add("meili");
        list.add("daming");
        
        System.out.println("第一种方式:get()");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        

        System.out.println("第二种方式:迭代器");
        ListIterator it = list.listIterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }     
        
        System.out.println("第三种方式:逆的迭代器");
         while(it.hasPrevious()){
            System.out.println(it.previous());
        }
============================================

使用List 集合存放6个学生的信息,并按照学生成绩,进行降序排列

创建学生类;

package Diyitongjin.POO;
//现实实体中的映射,也是数据库表的一个对应关系;
public class StudentC {
    private String name;
    private int no;
    private String sex;
    private double score;

    public StudentC() {
    }

    public StudentC(String name, int no, String sex, double score) {
        this.name = name;
        this.no = no;
        this.sex = sex;
        this.score = score;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    @Override
    public String toString() {
        return "StudentC{" +
                "name='" + name + '\'' +
                ", no=" + no +
                ", sex='" + sex + '\'' +
                ", score=" + score +
                '}';
    }
}
 
排序

package Diyitongjin.POO;

import Diyitongjin.Student;

import java.util.ArrayList;
import java.util.List;

public class StudentV {
    public static void main(String[] args) {
        List<StudentC> st= new ArrayList<>();
        StudentC stu=new StudentC("dada",12121,"男",12);
            st.add(stu);
         stu=new StudentC("www",2222,"nv",33);
        st.add(stu);
         stu=new StudentC("www",4444,"nv",76);
        st.add(stu);
         stu=new StudentC("www",5555,"nv",56);
        st.add(stu);

        stu=new StudentC("www",7777,"nv",85);
        st.add(stu);
        stu=new StudentC("www",28888,"nv",63);
        st.add(stu);
        StudentV.sort(st);
        for (StudentC stus:st ) {
            System.out.println(stus);
        }
    }
    public static  void sort(List<StudentC> st){
        for (int i = 1; i < st.size() ; i++) {
            for (int j = 0; j <st.size()-i ; j++) {
                if(st.get(j).getScore()<st.get(j+1).getScore()){
                    StudentC temp=st.get(j+1);
                    st.set(j+1,st.get(j));
                    st.set(j,temp);
                }
            }
        }
    }}
6.ArrayList 集合的初始化容量为10个,每次扩大原先一半

10         15            22        33

7、如下集合

ArrayList list =new ArrayList(20);

使用循环添加 30个数据 问ArrayList 扩容几次   1  次

8.Vector 向量

        1)所有方法 都是线程同步的 ,是线程安全的

        2)容量满了,自动扩大原来的一倍;

9.addAll 和 add    方法的区别:

addAll(Collection  c):把一个集合中的每一个元素 单独添加到另一个集合中

add(Object  o):把一个对象作为整体,添加到集合中;

11.subList(int begin,int end)

        就相当于 在集合中划分一块 区域 指向新的集合,就是殖民地

12.LinkedList 是基于链表的操作 

比List 多添加了对首尾 位置操作的方法 

通常 构建LinkedList 都会使用本类对象构建,而不会使用 List

LinkedList list =new LinkedList();

13.LinkedList 和 ArrayList 的区别

a)基础 

        ArrayList 基于的是线性数组

        LinkedList 给予的是链表

b)效率

        ArrayList 在访问数据效率高

        LinkedList 自插入删除数据效率高

c) LinkedList 比ArrayList 多个  6  个操作 首尾数据  的方法

14.使用LinkedList 模拟数据存储的方式

        栈和队列

                栈:先进后出,类似于粮仓  压栈 枪的弹夹

                队列;先进先出,火车过隧道

============================================

总结:

集合:;存放数据的容器,可以存放的只能是 引用数据类型;

2.集合和数组的区别

            1.集合中只能存放引用数据类型;数组可以存放基本类型和引用类型;

            2.集合的容量可以自动扩容,数组容量固定;

            3.数组的效率比集合高;

3.结合代替数组实现数据的存放

        如何代替二维数组 实现数据的存放

        int[][] nums=new  int [5][3];

使用集合套集即可;

import java.util.ArrayList;
import java.util.List;

public class Jihe {
    public static void main(String[] args) {

        List list =new ArrayList();

        List a=new ArrayList();

        a.add(1);a.add(2);a.add(3); list.add(a);
        List b=new ArrayList();

        b.add(1);b.add(2);b.add(3); list.add(b);
        System.out.println(list);
        for (int i = 0; i <list.size() ; i++) {
            List t= (List) list.get(i);
            for (int j = 0; j <t.size() ; j++) {
                System.out.print(t.get(j)+"\t");
            }
            System.out.println();
        }
    }
}

          


4.集合中add 与 addAll的区别:

    add(Object  o)  把一个对象作为一个整体添加到集合中

    addAll(Collenction  c):把一个集合中的每一个元素单独添加到另一个集合中

5.subList方法  :从集合中指定一块区域把地址复制给另一个集合,

                        新产生的集是原来集合的一部分

List list -new ArrayList();

list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);

List a=list.subList(2,3);//3

如果使用a 再添加元素 a.add("abc);list也会改变;

6.重点掌握的

a)Collenction 集合创建和变量

i)set:不重复,无序的

        HashSet       Set set=newHasSet();  不用泛型1.转换为数组   Object【】objs =set。toArray();

                                                                                                关注的是下标

                                                                                                  for(int i=0;I<objes.lenth;i++){

                                                                                                                            Object  o=object[i];                        

                                                                                                                                            }

2.迭代器            

        Iterator it =set.iterator();

while(it.hasNext()){

    Object obj=it.next();

                }

使用泛型  

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

for(String str:set){}

数组去除重复

ii)List:用于装载数据库中的数据;

1)使用ArrayList

初始化容量为10个,每一次扩大原来的一半,基于数组,随机访问效率比较高

2)使用LinkedList:仅仅用于面试时模拟栈和队列  存放数据

a)给予的链表,插入删除时效率比较高;额外提供了操作首位的 6 个方法


集合的算法:

数据排序:

  内部比较器:需要实现Comparable 接口  尽量在实现接口是通过<>泛型知名比较类型

同时重写compareTo 方法 ,根据返回值的负数,0,正数 表示 当前对象和比较对象的大小关系

public class Student implement Comparable<Student>{

            public int compareTo(student stu){

                    return0;

                        }

                            }


//

外部比较器: 当对象不具备比较能力时,只能使用外部比较器比较;

            独立添加到类的外面,对原有程序没有任何影响

创建一个类型实现Comparator 接口  ,同时也要使用 泛型,指明比较类型

重写compare方法根据 返回值的  负数,0  正数 表示两个对象的大小关系

public class MyCom implements Comparator<Student>{//创建比较器

                    public int compare( Student 01,Student o1 )    {

                return 0;

                    }

            }

Mycom my=new Mycom;   Collection.sort(stus.my);  然后输出;



7.Map 集合:键值对的集合

HashMap

    a)key 不可以重复,可以为null 有且只有一个

b)可以重复,可以重复,可以未出现 多个 null值

注意:put(Object key,Object value);

public class jdbc {
    public static void main(String[] args) {
        List<Map<String,String>> stu= new ArrayList<>();
        String[] lable={"学号","姓名","性别","成绩"};
        String[] keys={"no","name","sex","score"};
        while( stu.size()<3){
            Scanner sc=new Scanner(System.in);
            Map<String,String> stu1=new HashMap<>();
            for (int i = 0; i <lable.length ; i++) {
                System.out.print(lable[i]+":");
                String m=sc.next();
                stu1.put(keys[i],m);
            }
            stu.add(stu1);
        }
       // System.out.println(stu);
        for (int i = 0; i <lable.length ; i++) {
            System.out.print(lable[i]+"\t");
        }
        System.out.println();
        for(Map<String,String>stu1:stu){
            for (int i = 0; i <keys.length ; i++) {
                System.out.print(stu1.get(keys[i])+"\t");
            }
            System.out.println();
        }
    }

}

=============================

size();返回集合汇总元素的个数

遍历Map的方法(关注第一第二种)

1.先获取所有的key 然后在遍历 key 获取 对应数据
Map map=new HashMap();
map.put("1001","lisi");
map.put("1002","wangwu");
map.put("1003","zhaoliu");
//方法一:先获取map中的所有的key,再根据key获取相应的数据;
Set key=map.keySet();
System.out.println(key);
//遍历Set集合 获取每一个key      forehce  多用在泛型遍历
Object[]keys=key.toArray();
for (int i = 0; i <keys.length ; i++) {
    Object k=keys[i];
    Object v=map.get(k);
    System.out.println(k+"----"+v);
3.迭代器遍历

2.使用泛型的情况  



HashMap和TreeMap的区别

a)性能:hashMap比TreeMap快;

b)存储方式

        HashMap 基于的hash算法

        TreeMap 基于的是树,会按照 map的key排序

c)是否可以优化

HashMap 可以调整加载因子,调整存储

TreeMap是一个平衡树,不能调整

2.HashMap和Hashtable    的区别

a)HashTable 表比HashMap 早,HashMap 1.2才添加的

b)是否安全

HashMap 中的方法 不同步 线程不安全

HashTable 同步安全

c)是否可以为null

HashTable 中的key,value不能为null

HashMap 中的  key,value随便 但是 key 有且只有一个

3.在使用List集合时 通过下标 操作元素时,下标的值必须小于或等于size()的值;

随机产生一个字符串,产生的次数;






 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值