JAVA集合相关基础知识

来源:互联网 发布:朱元璋北伐 知乎 编辑:程序博客网 时间:2024/06/05 08:08

本篇文章主要讲述了JAVA集合相关知识,集合的组成如下图所示:


接下来分块从上到下介绍每个部分:

1 collection:是集合的顶层结构,定义了集合的共性功能。
1.1 成员方法:
A:添加功能
   boolean add(Object obj):往集合中添加一个元素
boolean addAll(Collection c):往集合中添加多个元素
 B:删除功能
  void clear():清空所有元素
  boolean remove(Object o):从集合中删除一个元素
  boolean removeAll(Collection c):从集合中删除另一个集合的元素
  C:判断功能
  boolean contains(Object o):判断集合中是否包含指定的元素
  boolean containsAll(Collection c):判断集合中是否包含另一个集合的元素
  boolean isEmpty():判断集合是否为空。
D:交集功能
 boolean retainAll(Collection c)
 E:迭代器(集合特有的遍历方式)
 Iterator iterator()
重点:Iterator的使用
A:使用步骤
B:迭代器原理
 F:长度功能
 int size():返回集合中元素的个数
 
 面试题:
  数组有length()吗?字符串有length()吗?集合有length()吗?
数组和字符串都有length()方法;集合是size()方法。
G:集合转数组
Object[]toArray():把集合转成数组,然后遍历数组,其实就相当于遍历了集合
2.List
(1)List集合的元素有序(存储和取出顺序一致),元素可重复
(2)List的特有功能:
A:添加功能
void add(int index,Object obj):在指定的位置添加元素
B:删除功能
Object remove(int index):通过指定的索引删除元素,并把删除的元素返回
C:获取功能
get(int index) 返回列表中指定位置的元素。
D:替换功能
Object set(int index,Object obj)
(4).List的倒序与洗牌
List中元素顺序可以被洗牌Collections.shuffle(list)
List中元素顺序可以被倒序Collections.reverse(list)
Collections.sort(list)对List元素排序(字母数字分别进行测试)
3.ArrayList:继承了Collection和List的方法。
4.LinkedList:不仅继承了Collection和List的方法。还有其特有方法如下所示:
   public void addFirst(E e)数据序列头部插入数据
   public void addLast(E e)数据序列尾部插入数据
 
  public E getFirst()获得第一个数据
  public E getLast()获得最后一个数据
 
   public E removeFirst()移除第一个数据
  public E removeLast()移除最后一个数据
5.ArrayList与LinkedList的相同点与不同点  
相同点:有顺序的,元素可以重复
(1)ArrayList特点:
底层数据结构是数组,查询快,增删慢                                     
线程不安全,效率高
(2)LinkedList特点:
底层数据结构是链表,查询慢,增删快
线程不安全,效率高
6 接下来将用代码具体展示collection与List
6.1collection遍历:
public class DogTest {public static void main(String[] args) {//1.创建dog对象Dog d1 = new Dog("小黑", 1, "藏獒");Dog d2 = new Dog("小黄", 1, "金毛");Dog d3 = new Dog("小白", 2, "萨摩耶");//2.创建集合Collection c = new ArrayList();//3.将dog对象添加到集合c.add(d1);c.add(d2);c.add(d3);//4.获取迭代器对象,该集合对应的迭代器对象Iterator it = c.iterator();// 5.调用方法进行遍历while (it.hasNext()) {Dog d = (Dog) it.next();System.out.println(d.getName()+"  "+d.getAge()+"  "+d.getType());}}}
程序运行结果:

6.2 List
public class ListDemo {public static void main(String[] args) {//创建学生对象Student s1 = new Student("刘诗诗", 25);Student s2 = new Student("杨幂", 35);Student s3 = new Student("何炅", 43);Student s4 = new Student("鹿晗", 24);//创建List集合List list = new ArrayList();//给集合中添加元素list.add(s1);list.add(s2);list.add(s3);list.add(s4);//普通for循环进行遍历for(int i=0;i<list.size();i++){Object object = list.get(i);Student s = (Student)object;System.out.println(s.getAge()+" "+s.getName());}System.out.println("-----------");//获取迭代器对象Iterator it = list.iterator();while (it.hasNext()) {Object obj = it.next();Student s = (Student)obj;System.out.println(s.getAge()+"  "+s.getName());}System.out.println("------------");//使用增强for循环遍历集合for(Object obj:list){Student s= (Student)obj;System.out.println(s.getAge()+"  "+s.getName());}}}
程序运行结果:

6.3 Arraylist与linkedlist与List相似,次数不再详细讲述。


7.Set(collection的另一个分支):方法基本继承自Collection

8.HashSet
8.1 元素顺序:元素唯一,但是无序(它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变)
8.2如何保证元素的唯一性的呢(分析源码)?
通过简单的分析,我们知道HashSet集合保证元素的唯一性和add()方法相关。
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {...}
左边:e.hash == hash
比较对象的哈希值。

右边:((k = e.key) == key || key.equals(k))
左边:(k = e.key) == key
比较对象的地址值。
右边:key.equals(k)
比较的是对象的内容是否相同。默认情况下比较的是地址值

从以上分析得出结论:
底层数据结构是哈希表。
哈希表依赖两个方法:hashCode()和equals()



执行流程:
首先判断哈希值是否相同,如果不同,就直接添加到集合。
如果相同,继续执行equals(),看其返回值,
如果是false,就直接添加到集合。
如果是true,说明元素重复不添加。

9.TreeSet
元素顺序:使用元素的自然顺序对元素进行排序,或者根据创建 set时提供的 Comparator进行排序(比较器排序),具体取决于使用的构造方法。

10.HashSet与TreeSet的相同点与不同点
相同点:单列集合,元素不可重复
不同点
1.底层存储的数据结构不同
HashSet底层用的是HashMap哈希表结构存储,而TreeSet底层用的是TreeMap树结构存储
2.存储时保证数据唯一性依据不同
HashSet是通过复写hashCode()方法和equals()方法来保证的,而TreeSet通过Compareable接口的compareTo()方法来保证的
3.有序性不一样
HashSet无序,TreeSet有序

11 接下来用代码演示HashSet与TreeSet的实现

11.1HashSet

public class StudentHashSetTest {public static void main(String[] args) {//创建对象Student s1 = new Student("雷军",38);Student s2 = new Student("柳传志",58);Student s3 = new Student("董明珠",36);//Student s4 = new Student("董明珠",36);//创建集合对象HashSet<Student> hs = new HashSet<Student>();//集合中添加元素对象hs.add(s1);hs.add(s2);hs.add(s3);//hs.add(s4);//遍历for (Student str : hs) {System.out.println(str.getName()+" "+str.getAge());}}
程序运行结果:
11.2 TreeSet
public class StudentTreeSetTest {public static void main(String[] args) {TreeSet<Student> ts = new TreeSet<Student>();Student s1 = new Student(26,"Rihanna");Student s2 = new Student(28,"Gigi");Student s3 = new Student(27,"Taylor");ts.add(s1);ts.add(s2);ts.add(s3);for (Student s : ts) {System.out.println(s);}}}
程序运行结果:

集合的基本类就是以上这些,如果需要后续还会继续补充微笑



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 宝贝39度不退烧怎么办 两岁多小儿突然变得口吃怎么办 百度两周岁宝宝口吃怎么办 2岁宝宝偶尔结巴怎么办 两岁宝宝说话磕巴怎么办 宝宝两岁结巴了怎么办 人多说话就紧张怎么办 小孩拉尿不叫人怎么办 2岁宝宝说话有点结巴怎么办 两岁半的宝宝说话结巴怎么办 2个月宝宝怕洗澡怎么办 2岁宝宝不喜欢喝奶粉怎么办 宝宝断奶不喜欢喝奶粉怎么办 宝宝不喜欢奶粉的味道怎么办 四个月宝宝不喜欢吃奶粉怎么办 四岁宝宝有口臭怎么办 4个月宝宝口臭怎么办 2岁宝宝有口臭是怎么办 两岁宝宝有口气怎么办 2岁宝宝口气重是什么原因怎么办 两岁宝宝口气重怎么办 两岁宝宝有口臭怎么办 两岁身高不达标怎么办 两岁宝宝82厘米怎么办 2岁幼儿说话结巴怎么办 2岁的宝宝结巴怎么办 2岁半宝宝口吃怎么办 2周岁宝宝不说话怎么办 三周岁宝宝不说话怎么办 2周岁宝宝突然说话结巴怎么办 两周岁宝宝突然说话结巴怎么办 三周岁宝宝说话突然结巴怎么办 小孩g和d不分怎么办 两岁宝宝皮肤黑怎么办 2岁宝宝肤色偏黄怎么办 2岁宝宝迷上手机怎么办 2岁宝宝说话口吃怎么办 两岁宝宝突然口吃怎么办 两岁半的宝宝还不会说话怎么办 2岁宝宝自闭症怎么办呀 新生儿又吐又拉怎么办