本文为B站Java教学视频BV1Kb411W75N的相关笔记,主要用于个人记录与分享,如有错误欢迎留言指出。
本章笔记涵盖视频内容P516~P561
public void test(){ Collection coll = new ArrayList(); //以collection接口下的ArrayList类型为例 //1. add(Object e):将元素e添加到集合coll中 coll.add("AA"); coll.add(123); //自动装箱 coll.add(new Date()); coll.add(new Person("Jerry",20)); //自定义类型 //2. size():获取添加的元素的个数 System.out.println(coll.size());//4 //3. addAll(Collection coll1):将coll1集合中的元素添加到当前的集合中 Collection coll1 = new ArrayList(); coll1.add(456); coll1.add("CC"); coll.addAll(coll1); System.out.println(coll.size());//6 //4. clear():清空集合元素 coll.clear(); //清空的是集合内部元素,而不是集合本身 //5. isEmpty():判断当前集合是否为空 System.out.println(coll.isEmpty()); //true coll.add("AA"); coll.add(123); //自动装箱 coll.add(new Date()); coll.add(new Person("Jerry",20)); //6. contains(Object obj):判断当前集合中是否包含obj System.out.println(coll.contains(123));//true /* 该方法在判断时会调用obj类内的equals(),若该子类重写了equals则比较内部元素,此处返回true;若该子类未重写equals则比较地址值,此处返回false;同理,如果参数是一个类名(地址值),则无论有没有重写都会返回false */ System.out.println(coll.contains(new Person("Jerry",20))); //7. containsAll(Collection coll1):判断形参coll1中的所有元素是否都存在于当前集合中 //Arrays.asList的作用是将数组转化为list,一般用于初始化简化代码,省去add的部分 Collection coll2 = Arrays.asList(123,456); System.out.println(coll.containsAll(coll2)); //8. remove(Object obj):从当前集合中移除obj元素 coll.remove(123); //和contain一样remove需要用到equals()方法,自定义类需要重写 coll.remove(new Person("Jerry",20)); //9. removeAll(Collection coll1):差集,从当前集合中移除coll1中包含的所有元素 Collection coll3 = Arrays.asList(123,456); coll.removeAll(coll3); //10. retainAll(Collection coll1):交集,获取当前集合和coll1集合的交集,并返回给当前集合 Collection coll4 = Arrays.asList(123,456,789); coll.retainAll(coll4); //11. equals(Object obj):当当前集合和形参集合的元素都相同时,返回true //若形参本身有序,则比较在乎顺序;若形参本身无序,则比较不在乎顺序(ArrayList是有序的) Collection coll5 = Arrays.asList(123,456); System.out.println(coll.equals(coll5)); //12. hashCode():返回当前对象的哈希值 System.out.println(coll.hashCode()); //13. 集合 → 数组:toArray() Object[] arr = coll.toArray(); //由于集合内部类型可能不一,所以用Object类数组接收较好 for(int i = 0;i < arr.length;i++){ System.out.println(arr[i]); } //13.1 数组 → 集合 List<String> list = Arrays.asList(new String[]{"AA","BB","CC"}); System.out.println(list); //[AA,BB,CC] //注意:这种方法对于基本数据类型可能会出错 List arr1 = Arrays.asList(new int[]{123,456}); System.out.println(arr1);//会直接报地址值,因为集合将整个数组都看成一个元素 //解决方法: //方式一: List arr2 = Arrays.asList(123,456);//直接添加 //方式二: List arr3 = Arrays.asList(new Integer[]{123,456});//使用包装类 //14. literator():返回Iterator接口的实例,用于遍历集合元素。 //(见下) } class Person{ String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } }
定义:Iterator对象称为迭代器,主要用于遍历Collection集合的元素。Iterator仅用于遍历集合,其本身并不提供承装对象的能力。集合对象每次调用iterator()方法都将得到一个全新的迭代器对象。
Iterator常用方法
//hasNext():判断是否还有下一个元素 //next():指针下移,并将下移后集合位置上的元素返回 Iterator iterator = coll.iterator; while(iterator.hasNext()){ System.out.println(iterator.next()); } //remove():删除当前集合位置上的元素 //与集合的remove方法不同,Iterator通过遍历迭代器对象的方法删除集合的元素 //如果还未调用next()或在上次调用next方法之后已经调用了remove方法,再调用remove都会报错 Iterator iter = coll.iterator; //回到起点 while(iter.hasNext()){ Object obj = iter.next(); if(obj.equals("Tom")){ iter.remove(); } }
//for(数组元素的类型 局部变量 : 数组对象) //遍历集合 for(Object obj : coll){ System.out.println(obj); } //遍历数组 for(int i : arr){ System.out.println(i); } /* foreach只能用于遍历!不能完全取代for! 如果使用foreach赋值,有可能会出现赋值后值没有改变的情况(比如String类型) */
定义:List集合类中元素有序且可重复,集合中的每个元素都有对应的顺序索引,因此常用List替代数组。List接口的实现类常用的有:ArrayList,LinkedList和Vector
List接口下常用实现类的异同
List接口中的常用方法
HashSet中元素的添加过程
向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置,判断数组此位置上是否已经有元素
若此位置上没有其它元素,则元素a添加成功
若此位置上有其它元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值
jdk7中处理重复数组位置元素的方法是头插法添加链表
jdk8中处理重复数组位置元素的方法是尾插法添加链表
Object put(Object key, Object value):将指定key-value添加到(或修改)当前map对象中
void putAll(Map m):将m中的所有key-value对存放到当前map中
Object remove(Object key):移除指定key的key-value对,并返回value
void clear():清空当前map中的所有数据
Object get(Object key):获取指定key对应的value
boolean containsKey(Object key):是否包含指定的key
boolean containsValue(Object value):是否包含指定的value
int size():返回map中key-value对的个数
boolean isEmpty():判断当前map是否为空
boolean equals(Object obj):判断当前map和参数对象obj是否相等
元视图操作的方法(遍历方法)
public void test(){ Map map = new HashMap(); map.put("AA",123); map.put(45,1234); map.put("BB",56); //遍历所有的key集:keySet() Set set = map.keySet(); Iterator iterator = set.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } System.out.println(); //遍历所有的value集:values() Collection values = map.values(); for(Object obj : values){ System.out.println(obj); //因为value的类型不确定,所以用obj } System.out.println(); //遍历所有的key-value //方式一:entrySet() Set entrySet = map.entrySet(); Iterator iterator1 = entrySet.iterator(); while(iterator1.hasNext()){ Object obj = iterator1.next();//返回的set里面只有Entry一种类型,可以向下转型 Map.Entry entry = (Map.Entry) obj; System.out.println(entry.getKey() + "-" + entry.getValue()); } //方式二: Set keySet = map.keySet(); Iterator iterator2 = keySet.iterator(); while(iterator2.hasNext()){ Object key = iterator2.next(); Object value = map.get(key); System.out.println(key + "-" + value); } }
HashMap中元素的添加过程
HashMap map = new HashMap(),在实例化后,底层创建了长度是16的一维数组Entry[] table
map.put(key1,value1),开始添加元素
首先,调用key1所在类的hashCode()计算key1的哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置
如果此位置上的数据为空,此时key1-value1添加成功
如果此位置上的数据不为空,意味着此位置上已存在数据,比较key1和已经存在数据的哈希值
jdk8相较jdk7在底层实现方面的不同:
new HashMap()时,底层没有创建一个长度为16的数组,首次调用put()方法时才会创建
jdk7底层结构只有数组+链表,jdk8中底层结构:数组+链表+红黑树
当数组的某一个索引位置上的元素以链表形式村的数据个数 > 8且当前数组的长度 > 64时,此时此索引位置上的所有数据改用红黑树储存
定义:Properties是专门用于对properties文件进行操作的接口
(properties文件可在New → Resource Bundle 内创建)
//假设Properties文件内已定义name=Tom,password=abc123 //其中name,password就是key;Tome,abc123就是value,他们都是String类型 public class Test{ public static void main(String[] args) { //Properties常用来处理配置文件,key和value都是String类型 Properties pros = new Properties(); FileInputStream fis = null; try { fis = new FileInputStream("testing.properties"); } catch (FileNotFoundException e) { e.printStackTrace(); } try { pros.load(fis); //加载流对应的文件 } catch (IOException e) { e.printStackTrace(); } String name = pros.getProperty("name"); //获取key对应的value String password = pros.getProperty("password"); try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } } //testing.properties文件(放在工程文件根目录下) name=Tom password=abc123
定义:Collections是一个操作Set,List,Map等集合的工具类
常用工具类
//对于void copy(List dest, List src)有特别需要关注的地方 //被拷贝的List与目标List要求大小一致 List list = new ArrayList(); list.add(123); list.add(0); list.add(65); list.add(-99); //以下写法会直接报异常IndexOutOfBoundsException List dest = new ArrayList(); //新建的List没有大小 List dest1 = new ArrayList(list.size()); //内部没有元素,实际dest.size()还是0 Collections.copy(dest,list); //正确写法 List dest2 = Arrays.asList(new Object[list.size()]); //内部被list.size()个null填满了 Collections.copy(dest,list);
Collections类还提供了多个synchronizedXxx()方法,该方法可以将指定集合包装成线程同步的集合