黑马程序员—JAVA基础——集合

-----------android培训java培训、java学习型技术博客、期待与您交流!------------

1List集合:

   A:概述:

         List接口继承了Collection接口。List中的元素是按顺序存放的,可以有重复   元素。

                 ArrayList类:实现数组的动态操作,线程不安全,执行效率比Vector

                 Vector类:实现动态数组线程安全向量类

                Stack类:表示后进先出的对象栈,是Vector类的子类,

   B构造方法:

        Arraylist类的构造方法:

           apublic ArrayList();//构造一个初始容量为10的列表

           bpublic ArrayList(Collection c);//构造一个包含指定集合Collection对象元素的列表

           cpublic ArrayList(int initialCapacity);//构造一个初始容量为指定值initialCapacity  列表

    C: List集合的特有功能:

         a:添加功能

               void add(int index,Object element):在指定位置添加元素

         b:获取功能

               Object get(int index):获取指定位置的元素

         c:列表迭代器

               ListIterator listIterator()List集合特有的迭代器

        d:删除功能

              Object remove(int index):根据索引删除元素,返回被删除的元素

        e:修改功能

              Object set(int index,Object element):根据索引修改元素,返回被修饰的元素

Eg:

<span style="font-family:Arial Black;">public class ListDemo {

public static void main(String[] args) {

// 创建集合对象

List list = new ArrayList();

 

// 添加元素

list.add("hello");

list.add("world");

list.add("java");

 

// void add(int index,Object element):在指定位置添加元素

// list.add(1, "android");//没有问题

// IndexOutOfBoundsException

// list.add(11, "javaee");//有问题

// list.add(3, "javaee"); //没有问题

// list.add(4, "javaee"); //有问题

 

// Object get(int index):获取指定位置的元素

// System.out.println("get:" + list.get(1));

// IndexOutOfBoundsException

// System.out.println("get:" + list.get(11));

 

// Object remove(int index):根据索引删除元素,返回被删除的元素

// System.out.println("remove:" + list.remove(1));

// IndexOutOfBoundsException

// System.out.println("remove:" + list.remove(11));

 

// Object set(int index,Object element):根据索引修改元素,返回被修饰的元素

System.out.println("set:" + list.set(1, "javaee"));

 

System.out.println("list:" + list);

}

}</span>


 

      D:注意:

              由于ArrayList是动态数组,它可以自动地进行数组的扩容。如果元素的个数超过了     ArrayList的容量,它就会将当前的容量扩大1倍,并 将原来的元素放到这个扩容以                 后的新的数组中。为了提高ArrayList的使用效率,可以使用trimToSize方法将     ArrayList的容量调整为 当前的容量大小,以便释放多余的空间。

 

2Set集合:

   ASet集合的特点

            无序,唯一

   BHashSet集合

       a:底层数据结构是哈希表(是一个元素为链表的数组)

       b:哈希表底层依赖两个方法:hashCode()equals()

          执行顺序:首先比较哈希值是否相同

          相同:继续执行equals()方法

          返回true:元素重复了,不添加

          返回false:直接把元素添加到集合

         不同:就直接把元素添加到集合

      c:如何保证元素唯一性的呢?

           由hashCode()equals()保证的

       d:开发的时候,代码非常的简单,自动生成即可。

      eHashSet存储字符串并遍历

       fHashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)

  CTreeSet集合

      a:底层数据结构是红黑树(是一个自平衡的二叉树)

            

      b:保证元素的排序方式

        (1):自然排序(元素具备比较性)

            让元素所属的类实现Comparable接口

        (2):比较器排序(集合具备比较性)

             让集合构造方法接收Comparator的实现类对象

    c:把我们讲过的代码看一遍即可

Eg:

<span style="font-family:Arial Black;">package cn.itcast_06;

import java.util.TreeSet;

/*

 * 需求:请按照姓名的长度排序

 */

public class TreeSetDemo {

public static void main(String[] args) {

// 创建集合对象

TreeSet<Student> ts = new TreeSet<Student>();

 

// 创建元素

Student s1 = new Student("zhangsan", 27);

Student s2 = new Student("lisi", 29);

Student s3 = new Student("wangwu", 23);

Student s4 = new Student("maliu", 27);

Student s5 = new Student("xiaoming", 22);

Student s6 = new Student("xioali", 40);

Student s7 = new Student("qiqin", 22);

Student s8 = new Student("laoshi", 29);

 

// 添加元素

ts.add(s1);

ts.add(s2);

ts.add(s3);

ts.add(s4);

ts.add(s5);

ts.add(s6);

ts.add(s7);

ts.add(s8);

 

// 遍历

for (Student s : ts) {

System.out.println(s.getName() + "---" + s.getAge());

}

}

}</span>

<span style="font-family:Arial Black;">/*

 * 如果一个类的元素要想能够进行自然排序,就必须实现自然排序接口

 */

public class Student implements Comparable<Student> {

private String name;

private int age;

 

public Student() {

super();

}

 

public Student(String name, int age) {

super();

this.name = name;

this.age = age;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public int getAge() {

return age;

}

 

public void setAge(int age) {

this.age = age;

}

 

@Override

public int compareTo(Student s) {

// 主要条件 姓名的长度

int num = this.name.length() - s.name.length();

// 姓名的长度相同,不代表姓名的内容相同

int num2 = num == 0 ? this.name.compareTo(s.name) : num;

// 姓名的长度和内容相同,不代表年龄相同,所以还得继续判断年龄

int num3 = num2 == 0 ? this.age - s.age : num2;

return num3;

}

}</span>


 

3Collection集合

        Collection

            |--List 有序,可重复

            |--ArrayList

                 底层数据结构是数组,查询快,增删慢。

                 线程不安全,效率高

           |--Vector

                底层数据结构是数组,查询快,增删慢。

               线程安全,效率低

          |--LinkedList

              底层数据结构是链表,查询慢,增删快。

              线程不安全,效率高

         |--Set 无序,唯一

         |--HashSet

             底层数据结构是哈希表。

             如何保证元素唯一性的呢?

                依赖两个方法:hashCode()equals()

            

        |--LinkedHashSet

           底层数据结构是链表和哈希表

           由链表保证元素有序

           由哈希表保证元素唯一

       |--TreeSet

           底层数据结构是红黑树。

          如何保证元素排序的呢?

             自然排序

             比较器排序

        如何保证元素唯一性的呢?

           根据比较的返回值是否是0来决定

Eg:

<span style="font-family:Arial Black;">package cn.itcast_04;

import java.util.ArrayList;

import java.util.Collection;

import java.util.Iterator;

/*

 * 需求:存储自定义对象并遍历Student(name,age)

 * 分析:

 *  A:创建学生类

 *  B:创建集合对象

 *  C:创建学生对象

 *  D:把学生对象添加到集合对象中

 *  E:遍历集合

 */

public class CollectionTest2 {

public static void main(String[] args) {

// 创建集合对象

Collection c = new ArrayList();

 

// 创建学生对象

Student s1 = new Student("张三", 25);

Student s2 = new Student("李四", 16);

Student s3 = new Student("王五", 20);

Student s4 = new Student();

s4.setName("马六");

s4.setAge(26);

// 把学生对象添加到集合对象中

c.add(s1);

c.add(s2);

c.add(s3);

c.add(s4);

c.add(new Student("赵七", 18)); // 匿名对象

// 遍历集合

Iterator it = c.iterator();

while (it.hasNext()) {

Student s = (Student) it.next();

System.out.println(s.getName() + "---" + s.getAge());

}

}

}

package cn.itcast_04;

 

public class Student {

private String name;

private int age;

 

public Student() {

super();

}

 

public Student(String name, int age) {

super();

this.name = name;

this.age = age;

}

 

public String getName() {

return name;

}

 

public void setName(String name) {

this.name = name;

}

 

public int getAge() {

return age;

}

 

public void setAge(int age) {

this.age = age;

}

 

}</span>


 

4、针对Collection集合到底使用谁呢?

  If(唯一吗?){

       Set

    if(排序吗?){

      TreeSet

     }else{HashSet

      }

  }else{

      List

      If(要安全吗?){

      Vector

   }else{

      ArrayList或者LinkedList

  }

 }

   查询多用:ArrayList

   增删多用:LinkedList

   如果你知道是Set,但是不知道是哪个Set,就用HashSet

   如果你知道是List,但是不知道是哪个List,就用ArrayList

   如果你知道是Collection集合,但是不知道使用谁,就用ArrayList

   如果你知道用集合,就用ArrayList

5、在集合中常见的数据结构

        ArrayXxx:底层数据结构是数组,查询快,增删慢

        LinkedXxx:底层数据结构是链表,查询慢,增删快

        HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()equals()

        TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

6Map类:

         

    A:特点:

         将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 

    BMapCollection的区别?

        aMap 存储的是键值对形式的元素,键唯一,值可以重复。夫妻对

        bCollection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可    重复。光棍

   CMap接口功能:

       a:添加功能

       b:删除功能

       c:判断功能

       d:获取功能

       e:长度功能

   DMap集合的遍历

        a:键找值

         (1):获取所有键的集合

         (2):遍历键的集合,得到每一个键

         (3):根据键到集合中去找值

      b:键值对对象找键和值

       (1):获取所有的键值对对象的集合

        (2):遍历键值对对象的集合,获取每一个键值对对象

        (3):根据键值对对象去获取键和值

Eg

<span style="font-family:Arial Black;">public class MapDemo {

public static void main(String[] args) {

// 创建集合对象

Map<String, String> map = new HashMap<String, String>();

 

// 添加元素

// V put(K key,V value):添加元素。

// System.out.println("put:" + map.put("文章", "马伊俐"));

// System.out.println("put:" + map.put("文章", "姚笛"));

 

map.put("邓超", "孙俪");

map.put("黄晓明", "杨颖");

map.put("周杰伦", "蔡依林");

map.put("刘恺威", "杨幂");

 

// void clear():移除所有的键值对元素

// map.clear();

 

// V remove(Object key):根据键删除键值对元素,并把值返回

// System.out.println("remove:" + map.remove("黄晓明"));

// System.out.println("remove:" + map.remove("黄晓波"));

 

// boolean containsKey(Object key):判断集合是否包含指定的键

// System.out.println("containsKey:" + map.containsKey("黄晓明"));

// System.out.println("containsKey:" + map.containsKey("黄晓波"));

 

// boolean isEmpty():判断集合是否为空

// System.out.println("isEmpty:"+map.isEmpty());

//int size():返回集合中的键值对的对数

System.out.println("size:"+map.size());

 

// 输出集合名称

System.out.println("map:" + map);

}

}</span>


7Collections

    A:是针对集合进行操作的工具类

    B:CollectionCollections的区别

      a:Collection 是单列集合的顶层接口,有两个子接口ListSet

     b:Collections 是针对集合进行操作的工具类,可以对集合进行排序和查找等

  C:常见的几个小方法:

     a:public static <T> void sort(List<T> list)

     b:public static <T> int binarySearch(List<?> list,T key)

     c:public static <T> T max(Collection<?> coll)

     d:public static void reverse(List<?> list)

     e:public static void shuffle(List<?> list)

Eg:

package cn.itcast_04;

 

import java.util.ArrayList;

import java.util.Collections;

import java.util.HashMap;

import java.util.TreeSet;

 

/*

 * 思路:

 *  A:创建一个HashMap集合

 *  B:创建一个ArrayList集合

 *  C:创建花色数组和点数数组

 *  D:从0开始往HashMap里面存储编号,并存储对应的牌

 *        同时往ArrayList里面存储编号即可。

 *      E:洗牌(洗的是编号)

 *      F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)

 *      G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)

 */

<span style="font-family:Arial Black;">public class PokerDemo {

public static void main(String[] args) {

// 创建一个HashMap集合

HashMap<Integer, String> hm = new HashMap<Integer, String>();

 

// 创建一个ArrayList集合

ArrayList<Integer> array = new ArrayList<Integer>();

 

// 创建花色数组和点数数组

// 定义一个花色数组

String[] colors = { "♠", "♥", "♣", "♦" };

// 定义一个点数数组

String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q",

"K", "A", "2", };

 

// 从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。

int index = 0;

 

for (String number : numbers) {

for (String color : colors) {

String poker = color.concat(number);

hm.put(index, poker);

array.add(index);

index++;

}

}

hm.put(index, "小王");

array.add(index);

index++;

hm.put(index, "大王");

array.add(index);

 

// 洗牌(洗的是编号)

Collections.shuffle(array);

 

// 发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)

TreeSet<Integer> fengQingYang = new TreeSet<Integer>();

TreeSet<Integer> linQingXia = new TreeSet<Integer>();

TreeSet<Integer> liuYi = new TreeSet<Integer>();

TreeSet<Integer> diPai = new TreeSet<Integer>();

 

for (int x = 0; x < array.size(); x++) {

if (x >= array.size() - 3) {

diPai.add(array.get(x));

} else if (x % 3 == 0) {

fengQingYang.add(array.get(x));

} else if (x % 3 == 1) {

linQingXia.add(array.get(x));

} else if (x % 3 == 2) {

liuYi.add(array.get(x));

}

}

 

// 看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)

lookPoker("张三", fengQingYang, hm);

lookPoker("李四", linQingXia, hm);

lookPoker("王五", liuYi, hm);

lookPoker("底牌", diPai, hm);

}

 

// 写看牌的功能

public static void lookPoker(String name, TreeSet<Integer> ts,

HashMap<Integer, String> hm) {

System.out.print(name + "的牌是:");

for (Integer key : ts) {

String value = hm.get(key);

System.out.print(value + " ");

}

System.out.println();

}

}</span>


-----------android培训java培训、java学习型技术博客、期待与您交流!------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值