当前位置:   article > 正文

JAVA第六章--集合(单列,双列)

JAVA第六章--集合(单列,双列)

数组特点:

一组数据类型相同的元素集合

创建数组时,必须给定长度,而且一旦创建长度不能改变,

一旦数组装满元素,需要创建一个新的数组,将元素复制过去

不方便:判断

单列集合:

一次放进去一个值(对象)

Collection:定义单列集合共有放法

List:可以有重复元素

ArraysList:数组列表

底层有一个数组,可以动态扩展数组长度,并提供一系列方法操作

查询快

中间增加,删除慢

add(E,e)默认向末尾添加元素

  1. arrayList.add("a");
  2. arrayList.add(1,"b");
  3. arrayList.remove("a");
  4. // System.out.println(arrayList.remove("x"));根据内容删除匹配的第一个元素,删除成功返回true,否则返回false
  5. //System.out.println(arrayList.remove(1));删除并返回指定位置元素
  6. //System.out.println(arrayList.get(1));获取指定位置上的元素
  7. System.out.println(arrayList.indexOf("d"));
  8. //System.out.println(arrayList.lastIndexOf("d"));
  9. //System.out.println(arrayList.set(2,"x"));替换并返回指定位置上的元素
  10. arrayList.clear();
  11. System.out.println(arrayList.isEmpty());
  12. }
arrayList遍历:
  1. 1.增强for循环
  2. for(String s:arrayList){
  3. System.out.println(s);
  4. }
  5. 2.普通for循环(可以修改数组)
  6. for(int i=0;i< arrayList.size();i++){
  7. if("a".equals(arrayList.get(i))){
  8. arrayList.remove(i);
  9. }
  10. }
使用迭代器遍历数组
  1. ArrayList<String> arrayList=new ArrayList();
  2. arrayList.add("a");
  3. arrayList.add("a");
  4. arrayList.add("a");
  5. arrayList.add("a");
  6. arrayList.add("a");
  7. Iterator<String> it=arrayList.iterator();
  8. while(it.hasNext()){
  9. String s=it.next();
  10. if(s.equals("a")){
  11. it.remove();
  12. }

LinkeList:链表列表

底层是一个链表结构

查询慢

增加,删除快

  1. LinkedList<String> linkedList=new LinkedList();
  2. linkedList.add("a");
  3. linkedList.add("b");
  4. linkedList.add("c");
  5. linkedList.add("d");
  6. linkedList.add("e");
  7. linkedList.add("f");
  8. linkedList.add(1,"x");
  9. System.out.println(linkedList);
  10. linkedList.removeFirst();
  11. System.out.println(linkedList);
  12. System.out.println(linkedList.get(1));
  13. linkedList.clear();
  14. System.out.println(linkedList);
迭代器遍历链表
  1. ListIterator<String> iterator= arrayList.listIterator(arrayList.size());
  2. while (iterator.hasPrevious()){
  3. System.out.println(iterator.previous());
  4. }*/

set

创建一个compareto接口的匿名内部类对象

  1. ArrayList<Integer> list=new ArrayList<>();
  2. Collections.addAll(list,1,2,4,5,3);
  3. Collections.sort(list, new Comparator<Integer>() {//创建一个compareto接口的匿名内部类对象,就是省去一个创建类,简化语法
  4. @Override
  5. public int compare(Integer o1, Integer o2) {
  6. return o2.intValue()-o1.intValue();
  7. }
  8. });
  9. //Collections.sort(list);
  10. System.out.println(list);
  11. System.out.println(Collections.binarySearch(list, 1));
treeset:
  1. 不能存储重复元素的
  2. 可以根据值进行排序,底层使用了树形结构,树结构本身就是有序的,
  3. 向树形结构中添加元素是,如何判断元素大小以及元素是否重复
  4. 向TreeSet中添加的元素类型必须实现Compare接口,重写compareTo(),
  5. 每次添加元素时,调用compareTo进行元素大小判断(小于0放左子节点,等于0表示重复,大于0放在右子节点)
  1. TreeSet<Integer> tree=new TreeSet<>();
  2. tree.add(1);
  3. tree.add(5);
  4. tree.add(4);
  5. tree.add(2);
  6. tree.add(1);
  7. tree.add(3);
  8. System.out.println(tree);
  1. TreeSet<student> treeSet=new TreeSet<>();
  2. // student str1=new student("张三",100);
  3. student str2=new student("李四",101);
  4. student str3=new student("王五",102);
  5. student str4=new student("张三",100);
  6. student str5=new student("李三",105);
  7. treeSet.add(new student("张三",100));
  8. treeSet.add(str2);
  9. treeSet.add(str3);
  10. treeSet.add(str4);
  11. treeSet.add(str5);
  12. System.out.println(treeSet);
hashset

会按照hashcode排序

  1. HashSet<student> hashSet=new HashSet<>();
  2. hashSet.add(new student("张三",100));
  3. hashSet.add(new student("李四",101));
  4. hashSet.add(new student("王五",102));
  5. hashSet.add(new student("张柳",103));
  6. hashSet.add(new student("张三",100));
  7. System.out.println(hashSet);

双列集合:

键 值

  1. Map接口共性
  2. 数据存储是键,值是形式存储
  3. 键不能重复的,值是可以重复
  4. 通过键可以找到值
  5. 一个键只能映射一个值
  6. HashMap
  7. 键是无序的
  8. HashMap<String,Integer> hashMap=new HashMap<>();
  9. hashMap.put("d",10);
  10. hashMap.put("b",101);
  11. hashMap.put("c",102);
  12. hashMap.put("a",10);
  13. hashMap.put("a",102);
  14. System.out.println(hashMap);
  15. //hashMap.clear();
  16. System.out.println(hashMap.containsKey("c"));
  17. System.out.println(hashMap.remove("a"));
  18. System.out.println(hashMap.isEmpty());

1.底层使用一个长度默认为16的数组,用来确定元素的位置,每次用key计算出哈希值,用哈希值%数组长度确定元素位置,将元素放在哈希表中指定位置,

2.后来继续添加元素,如果出现相同位置且不重复的元素,那么后来的元素添加到之前元素的next节点

3.当连表长度等于8时,且哈希数组长度大于64链表才会转为红黑树

4.哈希表负载因子为0.75,当哈希表使用数组0.75时,会自动扩容为原来数组长的2倍。

hashtable

  1. Hashtable
  2. 底层实现也是用到key的哈希值,计算位置,判断元素是否重复
  3. 方法上都添加了synchronized
  4. Hashtable中不能存储为NULL的键和为NULL的值
  5. HashMap可以存储一个为NULl键,值可以为null.
  1. Hashtable<String,String> hashtable=new Hashtable<>();
  2. hashtable.put("ad","ad");
  3. hashtable.put("ad","ad");
  4. hashtable.put("d","d");
  5. hashtable.put("a","a");
  6. hashtable.put("aad","aad");
  7. System.out.println(hashtable);

treemap

  1. /*
  2. TreeMap
  3. 顶层使用树形结构存储键值
  4. 键可以排序
  5. 键元素类型必须实现Comparable接口,重写compareTo()方法
  6. */
  7. public static void main(String[] args) {
  8. TreeMap<Integer,String> treeMap=new TreeMap<>();
  9. treeMap.put(1,"aa");
  10. treeMap.put(2,"ab");
  11. treeMap.put(1,"aaa");
  12. treeMap.put(4,"ba");
  13. treeMap.put(5,"aca");
  14. System.out.println(treeMap);
  15. /* treeMap.ceilingKey(1);
  16. treeMap.isEmpty();
  17. treeMap.size();
  18. treeMap.get(1);*/
  19. //map遍历
  20. //方法1:先拿到所有的键 遍历键 根据键找值
  21. Set<Integer> keySet=treeMap.keySet();
  22. for(Integer key:keySet){
  23. System.out.println(key+":"+treeMap.get(key));
  24. }
  25. //方法二:推荐遍历方法
  26. Set<Map.Entry<Integer,String>> entries=treeMap.entrySet();
  27. for(Map.Entry entry:entries){
  28. System.out.println(entry.getKey()+":"+entry.getValue());
  29. }
  30. }

泛型

什么是泛型?

● 泛型,即“参数化类型” 。一提到参数,最熟悉的就是定义方法时有形 参,然后调用此方法时传递实参。

● 参数化类型,就是将类型由原来的具体的类型参数化,类似于方法中的 变量参数,此时类型也定义成参数形式,然后在使用/调用时传入具体的 类型。

● Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编 译时类型安全检测机制,泛型的好处就是在编译的时候能够检查类型安 全。

泛型类

泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开 放相同的接口。

一个最普通的泛型类: public class Demo{ / /T可以为任意标识符,常见的如T、E、K、V等形式的参数常用于表示泛型 private T key; / /key这个成员变量的类型为T,T的类型由外部指定 public Demo(T key) { / /泛型构造方法形参key的类型也为T,T的类型由外部指定 this.key = key; } public T getKey(){ / /泛型方法getKey的返回值类型为T,T的类型由外部指定 return key; } }

传入的实参类型需与泛型的类型参数类型相同,即为Integer. Demo demo = new Demo(123456);

1.泛型的类型参数只能是类类型

2.泛型的类型参数可以有多个。

3.如果没有定义具体类型,默认为Object

从泛型类派生子类

子类也是泛型类,子类和父类的泛型类型要一致 class A extends Demo 子类不是泛型类,

父类要明确泛型的数据类型 class A extends Demo

泛型接口

泛型接口与泛型类的定义及使用基本相同。

public interface Demo { //定义一个泛型接口 } 子类也是泛型类,

子类和父类的泛型类型要一致 class A implements Demo{ } 子类不是泛型类,

父类要明确泛型的数据类型 public class A implements Demo { }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/366758
推荐阅读
相关标签
  

闽ICP备14008679号