javase 07 容器

07 容器

容器的作用与概览

变量:存储单个数据的空间

数组[]:存储若干个相同类型数据的集合|容器

数组
数组作用

数组是一种容器,可以在其中放置一个或一组数据。从而,实现使用数组来管理一组数据。

数组优势

是一种简单的线性序列,可以快速的访问数组元素,效率高。如果从 效率和类型检 查的角度讲,数组是最好的。

数组劣势
  1. 一旦初始化以后,其长度就不可修改。
  2. 数组中提供的方法非常限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。
  3. 获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用
  4. 数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足。
集合

一个独立元素的序列,这些元素都服从一条或多条规则。List 必须以插入的顺序保存元素, Set 不能包含重复元素, Queue 按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。

作用

长度可变,结构不单一,有数组和链表,数组加链表的结构,可以根据数据选择他合适的集合进行操作,集合也封装了很多方法,让其存储过程固定。

集合优势

解决数组存储数据方面的弊端。

常见集合

  1. Map

    1. HashMap
      1. 使用1.8之前使用 位桶和链表实现(1.8改用红黑树),它是线程不安全的Map,方法上都没有synchronize关键字修饰。默认16,多线程下resize,rehash时可能会出现死锁,拖死系统。
    2. TreeMap
      1. 他具有一个很大的特点就是会对Key进行排序,使用了TreeMap存储键值对,再使用iterator进行输出时,会发现其默认采用key由小到大的顺序输出键值对,如果想要按照其他的方式来排序,需要重写compartor接口。
    3. HashTable
      1. hashTable是线程安全的一个map实现类,它实现线程安全的方法是在各个方法上添加了synchronize关键字。(现已不推荐使用,效率低。改用ConcurrentHashMap)
    4. ConcurrentHashMap
      1. 1.5加入,使用segment分段锁。从1.8开始采用了CAS+Synchronize技术来保障线程安全。底层采用数组+链表+红黑树的存储结构,也就是和HashMap一样。
  2. List

    1. ArrayList
      1. 底层数据结构是数组,查询快,增删慢。
      2. 线程不安全,效率高
      3. 这个ArrayListObject[]数组的默认大小为16。默认数据量超过3/4会进行扩充操作。这里可以根据自己的使用大小,指定集合的大小 new ArrayList(num)(HashMap同原理)
    2. LinkedList
      1. 底层数据结构是链表,查询慢,增删快。
      2. 线程不安全,效率高
  3. Set

    1. HashSet
      1. HashSet按照Hash算法来存储结合中的元素,因此具有良好的存取和查找的性能。
    2. LinkedHashSet
      1. 使用连表来维护元素,因为需要维护元素的插入顺序,所以性能略低,低于HashSet。
    3. TreeSet
      1. 采用红黑树的数据结构来存储集合元素,并且支持两种排序方法,自然排序和定制排序。注意:使用TreeSet时,保证添加的对象全都实现了Comparable接口,否则会添加失败,并且抛出ClassCastExecption异常。简单一句话,如果想要TreeSet正常运行,只能添加同一种类型的对象。

容器中的接口层次结构

集合类

Collection接口

​ Collection是一个接口,只是规定了一些方法,即作为一个容器就应该具有这些功能。在Collection中并没有任何的可以存储数据的地方,因此只是作为一个规范存在。

  • 添加 add

  • 删除 remove

  • 记数 size

  • 包含 contains

  • 清空 clear

  • 是否空 isEmpty

三种遍历

迭代器Iterator

boolean hasNext(); //判断是否有元素没有被遍历

Object next(); //返回游标当前位置的元素并将游标移动到下一个位置

void remove(); //删除游标左面的元素,在执行完next之后该 ,操作只能执行一次

//普通for循环
for(int i=0;i<T.size();i++){
    System.out.println(T[i]);
}
//增强for循环
for(T t: T){
     System.out.println(T[i]);
}
//迭代器
Iterator<String> it = list.iterator(); 
while(it.hasNext()){
    System.out.println(it.next());
}
//map 迭代器
Map<String,Integer> maps=new HashMap<>();
Set<String> set = maps.keySet();
Collection<Integer> values = maps.values();
Iterator<Map.Entry<String, Integer>> iterator = maps.entrySet().iterator();
 while (iterator.hasNext()){
            Map.Entry<String, Integer> next = iterator.next();
            System.out.println(next);
        }

Properties

Properties为Hashtable的子类,要求键与值只能为字符串 ,不能为null,长与 配置文件(与外界交互 的信息) 即内存与存储介质(文件、数据库、网络、服务器内存等)交互。

Properties pro = new Properties(); 
 // 通过当前线程获取ClassLoader 
pro.load(Thread.currentThread().getContextClassLoader().getResourceAs Stream("db.properties"));
System.out.println(pro.getProperty("userName"));

db.properties

userName=zhangsan 
userPwd=123

Collections工具类

类 java.util.Collections 提供了对Set、List、Map操作的工具方法。

Comparable接口

所有可以“排序”的类都实现了 java.lang.Comparable 接口, Comparable 接口中只有一个方法

 public int compareTo(Object obj){
	return this.value-obj.value;
}

返回0 this==obj

返回正数 this>obj

返回负数 this<obj

Comparator 接口

Comparator比较器,可以根据需要定制特定的比较规则 重写比较器

判断传入对象那个大。

emps.stream() 
    //重写比较器  Lambda知识
    .sorted((e1, e2) -> { 
        if(e1.getAge().equals(e2.getAge())) {
            return e1.getName().compareTo(e1.getName());
        }else { 
            return e1.getAge().compareTo(e2.getAge()); 
        } 
    })
    .forEach(System.out::println);

返回0 e1==e2

返回正数 e1>e2

返回负数 e1<e2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值