java高级_集合

来源:互联网 发布:网络防御系统 编辑:程序博客网 时间:2024/06/05 19:05
集合(重点)
    集合的概念:一组数据作为的一个整体
    集合与数组的比较:
 数组:数组的长度是固定的,一个数组中数据的数据类型应该是一致的,数据的数据类型可以是任何类型
          集合:集合的长度是浮动的(与内容的数量有关),数据的数据类型可以不一致,
数据的数据类型只能是引用类型(基本数据类型使用的是包装类,利用了自动装箱和自动拆箱)


    集合的继承体系


    Collection接口   一种线性集合
          List集合   有序可重复的线性集合  
有序:存储顺序是可控的(存的顺序是可以得到保障)
       可重复:两个相同的数据可以被存放两次

ArrayList类     底层实现方式是基于数组,方法是线程不安全的,效率比Vector高
LinkedList类    底层实现方式是基于链表
Vector类        底层实现方式是基于数组,方法是线程安全的,效率比ArrayList低
使用方法三者一致


数组与链表的区别(重点)   
  数组和链表是最基本的两种数据结构

                   数组在内存中是一块连续的存储空间
  链表在内存中是分散存储的,链表由一个个的节点组成,
  节点由两部分组成
(1)数据域:  存放数据的区域
(2)链域:   存放下一个节点的地址

  数组的查找效率比链表要高,链表的新增和删除的效率比数组要高
  ArrayList与LinkedList的区别其实就是数组与链表的区别


使用过程中:ArrayList和LinkedList的使用频率较高



程序是什么?  算法+数据结构




关于List集合的使用(以ArrayList为例)
add(Object o);  向集合的末尾处添加一个元素
add(int index, Object o);  向集合的指定位置处添加一个元素  (位置必须已存在)


remove(Object o); 将元素o从集合中移除
remove(int index); 移除指定位置处的元素
如果位置数字也是集合中的元素,按照移除位置方式进行移除


移除下标0时,移除后原下标1位置的元素,自动变成下标0


get(int index);  获取指定位置处的元素
set(int index, Object o); 将指定位置处的元素设置为元素o


size();  获取集合中元素的个数(集合的长度)




 Set集合    无序不重复的线性集合   
Set集合不能通过下标来存取数据,需要利用迭代器进行存取操作
无序:存储顺序是不可控的(集合根据实现方式自动控制顺序)
不重复:两个相同的数据只能被存放一次,后存的会覆盖先存的


HashSet:利用hash表的顺序来保存数据
每个对象都有hashcode,HashSet利用存放对象的的hashcode作为保存顺序自动管理数据的顺序
TreeSet:利用二叉树的顺序来保存数据
利用二叉树的顺序来保存数据  (二叉树是数据结构的一种)




add(Object o);  向集合中添加一个元素
remove(Object o); 将元素o从集合中移除


size();  获取集合中元素的个数(集合的长度)


iterator(); 返回一个关于Set集合的迭代器,利用迭代器可以访问集合中的数据(重点)

HashSet利用了HashMap集合来存放数据,Map集合也需要利用迭代器来获取数据






    Map接口(Map集合) 一种键值对的集合
一个数据有两部分组成,一个部分是Key值,一个部分是Value值
其中key值部分数据不能重复,value部分数据可以重复


Collection或List集合是线性集合,一个位置只一个数据
Collection集合中有的可以存重复数据,有的不可以存重复数据
List集合中可以存重复数据




Map集合石键值集合,一个位置存储的是一组键值对
Map集合中key值不能重复,value可以重复


方法应用


clear():  清除Map集合中的所有数据
containsKey(Object o): 判断对象o是否出现在key值中
containsValue(Object o): 判断对象o是否出现在value值中

keySet(): 获取所有key值组成的一个Set集合


get(Object o1):取得key值为o1的对应的value值                --获取
put(Object o1, Object  o2):将o1为key,o2为value保存至Map集合中
如果o1已经存在,则o2会覆盖原有的value -- 新增+修改
remove(Object o1): 移除key值为o1的键值对 


    集合的泛型 -- 使用包装类
泛型可以理解为是一种描述引用类型的变量    基本数据类型可以使用包装类    
List<String> list = new ArrayList<String>();
List<Integer> list = new ArrayList<Integer>();


泛型的作用:约束集合内数据的类型
优势:
存放数据时,自带数据类型检查
取得数据时,无需类型的强制转换


可以利用for-each语句进行集合的遍历
for(int i = 0; i < list.size(); i++){
}




泛型编程(了解)
-- 实现链表(了解链表的结构和形式)


链表
由一组节点组成的一个线性存储结构


节点
数据域:存放数据
链域:下一个节点的地址




class Node<T>   T:表示输入的类型
public T data;    T就表示泛型的类型的使用 






    迭代器  Iterator
将线性集合(List和Set)中的数据通过迭代的方式,进行访问,不能进行增删修操作


boolean hasNext()  判断当前指针之后是否有元素  有:true  没有:false  
作为循环的条件


Object next()      取出当前指针之后的元素,并将指针向后移动一位
取出元素,在循环中最好只调用一次,否则容易逻辑问题


使用迭代完成对Set集合和Map集合的元素进行遍历访问
-------------------------------------------------------------------------------
练习1:将1-5数字随机存放在长度是8的List集合中, 只要结果不用排序
1 2 3 1 2 3 1 2    =>    123    
1 3 4 4 2 1 5 1    =>    12345
练习2:
在控制台上完成以下内容   --学生管理系统


集合的选择?
List 存取方便,查找方便,重复数据检测不方便
Set  存方便,取不方便,查找不方便,重复数据检测方便
Map(以学号为key) 存取方便,查找方便,重复数据检测方便


为集合追加泛型


1.控制台上打印  
---学生管理系统---
1.新增学生信息
2.根据学号修改学生信息
3.根据学号删除学生
4.根据学号查看学生信息
5.查询所有学生信息
6.退出
2.学生信息:学号,姓名和生日
3.使用者选择1
输入学号:             需要判断学号是否已被占用
输入姓名:
输入生日(yyyy-MM-dd):
4.使用者选择5
将所有学生的学号,姓名,和生日进行控制台输出




\t  -- 制表符
\n  -- 换行


\r  -- 回车
0 0
原创粉丝点击