java集合

* A:集合的由来
 数组长度是固定,当添加的元素超过了数组的长度时需要对数组重新定义,太麻烦,java内部给我们提供了集合类,能存储任意对象,长度是可以改变的,随着元素的增加而增加,随着元素的减少而减少 
* B:数组和集合的区别
 区别1 : 
数组既可以存储基本数据类型,又可以存储引用数据类型,基本数据类型存储的是值,引用数据类型存储的是地址值
集合只能存储引用数据类型(对象)集合中也可以存储基本数据类型,但是在存储的时候会自动装箱变成对象 //100   new Interger(100)
区别2:
数组长度是固定的,不能自动增长
集合的长度的是可变的,可以根据元素的增加而增长
* C:数组和集合什么时候用
        * 1,如果元素个数是固定的推荐用数组
        * 2,如果元素个数不是固定的推荐用集合

* D:集合继承体系图

 

  alt+shift+s:重写toString方法等

 

boolean add(E e)   //list集合一直返回true,set集合添加重复元素,返回false
boolean remove(Object o)   //删除
void clear()      //清空
boolean contains(Object o)    //判断是否包含
boolean isEmpty()     //判断是否为空
int size()   //集合元素个数

 

toArray():

Object[] arr = c.toArray();                    //将集合转换成数组

 

boolean addAll(Collection c)    //将整个集合的元素加到另一个集合里
boolean removeAll(Collection c) //删除一个集合中和另一个集合的交集
boolean containsAll(Collection c)  //是否包含
boolean retainAll(Collection c  //取交集,如果调用的集合改变就返回true,如果调用的集合不变就返回false

 

迭代器概述:集合是用来存储元素,存储的元素需要查看,那么就需要迭代(遍历)        iterator

Iterator it = c.iterator();                        //获取迭代器的引用
            while(it.hasNext()) {                            //集合中的迭代方法(遍历)
                System.out.println(it.next());
            }

 

迭代器原理
    * 迭代器原理:迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以每一个集合存和取都是不一样,那么就需要在每一个类中定义hasNext()和next()方法,这样做是可以的,但是会让整个集合体系过于臃肿,迭代器是将这样的方法向上抽取出接口,然后在每个类的内部,定义自己迭代方式,这样做的好处有二,第一规定了整个集合体系的遍历方式都是hasNext()和next()方法,第二,代码有底层内部实现,使用者不用管怎么实现的,会用即可

List集合的特有功能概述
    * void add(int index,E element)   //指定位置添加元素
    * E remove(int index)         //删除指定位置元素   返回obj接收     Object obj = list.remove(1);
    * E get(int index)        //获得指定位置元素
    * E set(int index,E element)     //将指定位置的元素修改

 

ConcurrentModificationException出现  //并发修改异常
    * 迭代器遍历,集合修改集合

* a:迭代器迭代元素,迭代器修改元素(ListIterator的特有功能add)
    * b:集合遍历元素,集合修改元素

            ListIterator lit = list.listIterator();        //如果想在遍历的过程中添加元素,可以用ListIterator中的add方法
            while(lit.hasNext()) {
                String str = (String)lit.next();
                if(str.equals("world")) {
                    lit.add("javaee");    
                    //list.add("javaee");
                }
            }

 

集合框架(ListIterator)(了解)
* boolean hasNext()是否有下一个
* boolean hasPrevious()是否有前一个
* Object next()返回下一个元素
* Object previous();返回上一个元素

 

集合框架(Vector的特有功能)(了解)
* A:Vector类概述
* B:Vector类特有功能
    * public void addElement(E obj)  //加对象
    * public E elementAt(int index)  //
    * public Enumeration elements()  //获取枚举

Enumeration en = v.elements();            //获取枚举
            while(en.hasMoreElements()) {            //判断集合中是否有元素
                System.out.println(en.nextElement());//获取集合中的元素
            }

 

List的三个子类的特点
        ArrayList:
            底层数据结构是数组,查询快,增删慢。
            线程不安全,效率高。
        Vector:
            底层数据结构是数组,查询快,增删慢。
            线程安全,效率低。
        Vector相对ArrayList查询慢(线程安全的)
        Vector相对LinkedList增删慢(数组结构)
        LinkedList:
            底层数据结构是链表,查询慢,增删快。
            线程不安全,效率高。

        Vector和ArrayList的区别
            Vector是线程安全的,效率低
            ArrayList是线程不安全的,效率高
        共同点:都是数组实现的
        ArrayList和LinkedList的区别
            ArrayList底层是数组结果,查询和修改快
            LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
        共同点:都是线程不安全的
* B:List有三个儿子,我们到底使用谁呢?
        查询多用ArrayList
        增删多用LinkedList
        如果都多ArrayList

 

集合框架(去除ArrayList中重复自定义对象元素)

需要重写equals()方法

contains方法判断是否包含,底层依赖的是equals方法
remove方法判断是否删除,底层依赖的是equals方法

public boolean equals(Object obj) {
        Person p = (Person)obj;
        return this.name.equals(p.name) && this.age == p.age;

 

LinkedList类特有功能
    * public void addFirst(E e)及addLast(E e)
    * public E getFirst()及getLast()
    * public E removeFirst()及public E removeLast()
    * public E get(int index);

 

* 栈
    * 先进后出 
* 队列
    * 先进先出

 

集合框架(泛型概述和基本使用):

泛型好处
    * 提高安全性(将运行期的错误转换到编译期) 
    * 省去强转的麻烦
* C:泛型基本使用
    * <>中放的必须是引用数据类型 
* D:泛型使用注意事项
    * 前后的泛型必须一致,或者后面的泛型可以省略不写(1.7的新特性菱形泛型)  

集合框架(泛型类的概述及使用)(了解)
* A:泛型类概述<T>
    * 把泛型定义在类上
* B:定义格式
    * public class 类名<泛型类型1,…>
* C:注意事项    
    * 泛型类型必须是引用类型

 

* A:泛型方法概述
    * 把泛型定义在方法上
* B:定义格式    
    * public <泛型类型> 返回类型 方法名(泛型类型 变量名)

 

* A:泛型接口概述
    * 把泛型定义在接口上
* B:定义格式    
    * public interface 接口名<泛型类型>
* C:案例演示
    * 泛型接口的使用

###16.12_集合框架(泛型高级之通配符)(了解)
* A:泛型通配符<?>
    * 任意类型,如果没有明确,那么就是Object以及任意的Java类了
* B:? extends E
    * 向下限定,E及其子类  //addAll:父类可以加子类
* C:? super E
    * 向上限定,E及其父类

A:增强for概述
    * 简化数组和Collection集合的遍历       fore+alt+/
* B:格式:

        for(元素数据类型 变量 : 数组或者Collection集合) {
            使用变量即可,该变量就是元素
        }

for(String s : list) {
                System.out.println(s);
            }

 

* 普通for循环,可以删除,但是索引要--
* 迭代器,可以删除,但是必须使用迭代器自身的remove方法,否则会出现并发修改异常
* 增强for循环不能删除

 

静态导入格式:
    * import static 包名….类名.方法名;
    * 可以直接导入到方法的级别

 

* A:可变参数概述
    * 定义方法的时候不知道该定义多少个参数
* B:格式
    * 修饰符 返回值类型 方法名(数据类型…  变量名){}
* C:注意事项:
    * 这里的变量其实是一个数组
    * 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
调用时可以直接写参数,底层对参数进行封装了

print(11,22,33,44,55);

public static void print(int ... arr) {            //可变参数其实是一个数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }

 

* Arrays工具类的asList()方法的使用               //将数组转为集合

int[] arr = {11,22,33,44,55};            
List<int[]> list = Arrays.asList(arr);

 数组转换成集合虽然不能增加或减少元素,但是可以用集合的思想操作数组,也就是说可以使用其他集合中的方法


* Collection中toArray(T[] a)泛型版的集合转数组

ArrayList<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        
        String[] arr = list.toArray(new String[10]);        //当集合转换数组时,数组长度如果是小于等于集合的size时,转换后的数组长度等于集合的size
                                                            //如果数组的长度大于了size,分配的数组长度就和你指定的长度一样
        for (String string : arr) {
            System.out.println(string);
        }

 

* 集合嵌套之ArrayList嵌套ArrayList

ArrayList<ArrayList<Person>> list = new ArrayList<>();
        
        ArrayList<Person> first = new ArrayList<>();                //创建第一个班级
        first.add(new Person("杨幂", 30));
        first.add(new Person("李冰冰", 33));
        first.add(new Person("范冰冰", 20));
        
        ArrayList<Person> second = new ArrayList<>();
        second.add(new Person("黄晓明", 31));
        second.add(new Person("赵薇", 33));
        second.add(new Person("陈坤", 32));
        
        //将班级添加到学科集合中
        list.add(first);
        list.add(second);

//遍历学科集合
        for(ArrayList<Person> a : list) {
            for(Person p : a) {
                System.out.println(p);
            }
        }

 

HashSet:无索引,不可以重复,无序     //只要能用迭代器迭代的,就可以使用增强for循环遍历

桶结构,需要在类中重写HashCode方法才能调用equals方法,equals方法也需要重写

alt+shift+s找到重写的equals和HashCode方法自动生成

Hash算法中的Prim为什么是31:

1:31是质数

2:31既不大也不小

3:2向左移动五位-1

public boolean equals(Object obj) {
        if (this == obj)                        //调用的对象和传入的对象是同一个对象
            return true;                        //直接返回true
        if (obj == null)                        //传入的对象为null
            return false;                        //返回false
        if (getClass() != obj.getClass())        //判断两个对象对应的字节码文件是否是同一个字节码
            return false;                        //如果不是直接返回false
        Person other = (Person) obj;            //向下转型
        if (age != other.age)                    //调用对象的年龄不等于传入对象的年龄
            return false;                        //返回false
        if (name == null) {                        //调用对象的姓名为null
            if (other.name != null)                //传入对象的姓名不为null
                return false;                    //返回false
        } else if (!name.equals(other.name))    //调用对象的姓名不等于传入对象的姓名
            return false;                        //返回false
        return true;                            //返回true
    }

 

LinkedHashSet:

 * 底层是链表实现的,是set集合中唯一一个能保证怎么存就怎么取的集合对象
 * 因为是HashSet的子类,所以也是保证元素唯一的,与HashSet的原理一样

 

TreeSet:

TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一
当compareTo方法返回0的时候集合中只有一个元素
当compareTo方法返回正数的时候集合会怎么存就怎么取
compareTo方法返回负数的时候集合会倒序存储

二叉树:两个叉

自然排序:

小的存储在左边(负数),大的存储在右边(正数),相等就不存(0)

compareTo方法,在TreeSet集合中如何存储元素取决于compareTo方法的返回值

1.返回0,集合中只有一个元素

2.返回-1,集合会将存储的元素倒序

3.返回1,集合会怎么存怎么取

public int compareTo(Person o) {
        int length = this.name.length() - o.name.length();                //比较长度为主要条件
        int num = length == 0 ? this.name.compareTo(o.name) : length;    //比较内容为次要条件
        return num == 0 ? this.age - o.age : num;                        //比较年龄为次要条件
    }

 

TreeSet比较器排序:

class CompareByLen /*extends Object*/ implements Comparator<String> {

    @Override
    public int compare(String s1, String s2) {        //按照字符串的长度比较
        int num = s1.length() - s2.length();        //长度为主要条件
        return num == 0 ? s1.compareTo(s2) : num;    //内容为次要条件
    }
    
}

TreeSet<String> ts = new TreeSet<>(new CompareByLen());        //Comparator c = new CompareByLen();
        ts.add("aaaaaaaa");
        ts.add("z");
        ts.add("wc");
        ts.add("nba");
        ts.add("cba");
        
        System.out.println(ts);

两种方式的区别:

构造函数什么都不传,默认按照类中comparable的顺序

传入Comparator,就优先按照Comperator

例:

TreeSet<Character> ts = new TreeSet<>(new Comparator<Character>() {

            @Override
            public int compare(Character c1, Character c2) {
                //int num = c1 - c2;                //自动拆箱
                int num = c1.compareTo(c2);
                return num == 0 ? 1 : num;
            }

 

Map集合概述和特点:

Map接口概述
查看API可以知道:
将键映射到值的对象
一个映射不能包含重复的键
每个键最多只能映射到一个值

Map接口和Collection接口的不同
Map是双列的,Collection是单列的
Map的键唯一,Collection的子体系Set是唯一的
Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效

Map集合的功能概述
a:添加功能
    V put(K key,V value):添加元素。
    如果键是第一次存储,就直接存储元素,返回null
    如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
b:删除功能
   void clear():移除所有的键值对元素
    V remove(Object key):根据键删除键值对元素,并把值返回
c:判断功能
    boolean containsKey(Object key):判断集合是否包含指定的键
    boolean containsValue(Object value):判断集合是否包含指定的值
    boolean isEmpty():判断集合是否为空
d:获取功能
  Set<Map.Entry<K,V>> entrySet():
   V get(Object key):根据键获取值
   Set<K> keySet():获取集合中所有键的集合
   Collection<V> values():获取集合中所有值的集合
e:长度功能
    int size():返回集合中的键值对的个数

Map集合的遍历之键找值

            HashMap<String, Integer> hm = new HashMap<>();
            hm.put("张三", 23);
            hm.put("李四", 24);
            hm.put("王五", 25);
            hm.put("赵六", 26);
            
            /*Set<String> keySet = hm.keySet();            //获取集合中所有的键
            Iterator<String> it = keySet.iterator();    //获取迭代器
            while(it.hasNext()) {                        //判断单列集合中是否有元素
                String key = it.next();                    //获取集合中的每一个元素,其实就是双列集合中的键
                Integer value = hm.get(key);            //根据键获取值
                System.out.println(key + "=" + value);    //打印键值对
            }*/
            
            for(String key : hm.keySet()) {                //增强for循环迭代双列集合第一种方式
                System.out.println(key + "=" + hm.get(key));
            }

Map集合的遍历之键值对对象找键和值
    
            HashMap<String, Integer> hm = new HashMap<>();
            hm.put("张三", 23);
            hm.put("李四", 24);
            hm.put("王五", 25);
            hm.put("赵六", 26);
            /*Set<Map.Entry<String, Integer>> entrySet = hm.entrySet();    //获取所有的键值对象的集合
            Iterator<Entry<String, Integer>> it = entrySet.iterator();//获取迭代器
            while(it.hasNext()) {
                Entry<String, Integer> en = it.next();                //获取键值对对象
                String key = en.getKey();                                //根据键值对对象获取键
                Integer value = en.getValue();                            //根据键值对对象获取值
                System.out.println(key + "=" + value);
            }*/
            
            for(Entry<String,Integer> en : hm.entrySet()) {
                System.out.println(en.getKey() + "=" + en.getValue());
            }

HashMap和Hashtable的区别
        * Hashtable是JDK1.0版本出现的,是线程安全的,效率低,HashMap是JDK1.2版本出现的,是线程不安全的,效率高
        * Hashtable不可以存储null键和null值,HashMap可以存储null键和null值

Collections成员方法

        public static <T> void sort(List<T> list)
        public static <T> int binarySearch(List<?> list,T key)
        public static <T> T max(Collection<?> coll)
        public static void reverse(List<?> list)
        public static void shuffle(List<?> list

集合框架(泛型固定下边界)
* ? super E

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值