疯狂Java学习笔记(016)

1.类集合

  • 集合框架
  • Collection接口
  • List接口
  • ArrayList类
  • Iterator迭代器接口
  • Vector类
  • LinkedList类

 2.集合类

  集合是存储对象最常用的一种方式(容器)。Java中,集合也是类,真正用来存储东西的是某种集合类的实例对象。

3.集合类和数组的区别

  数组:

  • 长度是固定的;
  • 可以存储基本数据类型,也可以存储对象的引用
  • 必须是相同类型的数据

  集合:

  • 长度是可变
  • 只能用于存储对象的引用
  • 对象可以是不同类型

4.Collection接口概述

  • Collection层次结构中的根接口
  • Collection表示一组对象,这些对象也称collection的元素。
  • 一些collection允许有重复元素,而另一些不允许。
  • Iterable中不装任何数据,它是用来迭代的

            

5.Collection接口,在java.util下

  List接口:可存放重复元素,元素存取是“有序”的

  Set接口:不可以存放重复元素,通常元素存取是“无序”的,也有一些实现类元素是“有序”的。

   “有序”“无序”指的是存放元素时是否会记住元素存放的顺序,并非对元素进行“排序”。

6.Collection接口中的方法

  添加操作:

  • boolean add(Object object):添加参数为一个元素,如果将一个集合当成一个元素,它的size应该是1.

// 使用接口多态,集合中应该对元素的类型加以限制,出黄线是因为没加泛型
  Collection c = new ArrayList();
  c.add("abv");
  c.add(new Integer(10));
  c.add(10);//自动装箱成包装类对象!这个是JDK1.5之后才有的
  c.add(new Date());

  • boolean addAll(Collection coll):将另一个集合中所有元素一次添加到本集合中,是将元素打散放到另一个集合里

 Collection c2 = new ArrayList<>();
  c2.addAll(c);
  c2.add("abv");//c2里是可以存放相同的字符串的
  
  System.out.println(c2.size());
  System.out.println(c.size());
  //两个打印的内容是一样的,长度都是4

  删除操作:

  • boolean remove(Object object):删除集合中的一个指定的元素
    • Collection s1 = new ArrayList<>();
        s1.add("abc");
        s1.add("abc");
        s1.add("abcd");
        
        s1.remove("abc");//通过查api文档,只删除单个实例,也就是只删除一个。查找ArrayList中的remove方法
        System.out.println(s1.size());
  • boolean removeAll(Collection coll):删除两个集合的交集
    •   Collection s1 = new ArrayList<>();
        s1.add("abc");
        s1.add("abc");
        s1.add("abcd");
        
        Collection s2 = new ArrayList<>();
        s2.add("abcd");
        s2.add("abcd");  
        s2.add("abcd");
        
        s2.removeAll(s1);
        
        System.out.println(s2.size());//打印完值为0,就是只要两个有一样的都删掉

  查询操作:

  • int size()
    • Collection s1 = new ArrayList<>();
        s1.add("abc");
        
        Collection s2 = new ArrayList<>();
        s2.add("abcd");
        s2.add("abcd");  
        s2.add("abcd");
        
        s1.addAll(s2);//这个打印完的结果就是4
        System.out.println(s1.size());
        s1.add(s2);//这个打印完的结果就是2
        System.out.println(s1.size());

  判断操作:

  • boolean isEmpty();是否为空
    •   c1.isEmpty( );
  • boolean contains(Object obj):是否包含元素
    •   c2.contains("abc")
  • boolean containsAll(Collection c):是否包含令一个集合中所有的元素。如果c中有两个“abv”,而另一个由一个“abv”,也算包含
    •  s1.add("abc");
        s1.add("abc");
        s1.add("abcd");
        s1.add("abcdefgh");
    •  s2.add("abcd");
        s2.add("abcd");
    • System.out.println(s1.containsAll(s2));//就是s2有两个 ,s1只有一个,也算s1包含s2;

7.Collection接口中的方法:迭代器,是遍历集合的方式

  迭代操作:Iterator iterator():返回一个在此集合上的迭代器!

   iterator()方法的返回值是一个接口,真实返回是实现子类的对象,不同的集合类返回的是不同的迭代器对象,

  说明:

  • 迭代器不保证取出元素的顺序和存入的顺序一致。如list是可以重复的,arraylist是保证存取顺序,而set不保证顺序。
  • 迭代器本事时一个接口,该方法返回的时一个迭代器实例对象。通常使用的是接口多态使用迭代器。
  • 各个集合中的子类有不同的实现。

  迭代器中常用的两个方法:

  • boolean hasNext():判断是否有下一个元素
  • Object next():取出下一个元素

8.迭代器读取元素示意图

  

  指针最开始指向得是第一个元素得前方,而next返回值是上一个指针指向得元素,比如说现在图中得指针指得是第一个前方,判断后,.next()则是第一个元素。返回的也是这个值。API中这个next翻译的不是很准确。

Collection c = new ArrayList();//创建集合对象

Iterator it = c.iterator();           //获取此集合的迭代器

while(it.haxNext()){           //遍历这个集合,这里用while来遍历,也就是迭代。

  Object o =it.next();

}

 9.List接口中常用类*******

  ArrayList:线程不安全,,底层用的是数组查询快,增删慢,底层使用的是数组,因为是引用数据类型,所有的元素保存的是地址值。

  LinkedList:线程不安全,底层用的是链表增删速度快,查询慢,底层使用的是链表

  Vector:线程安全,但速度慢,已被ArrayList代替

  弹栈FILO (first in last out)LIFO(last in first out),关于弹栈压栈

10.List接口的方法&增强for

  特有方法:(凡是和索引有关的方法,都是List接口特有的)

  • void add(int index,Object element);
  • remove(int index);
  • Object get(int index);
  • Object set(int index,Object element);

  增强for:

  for(Object obj :c){ }     其中,Object是元素类型,obj是迭代变量名,c是集合名

11.List接口遍历的方式,ArrayList用前两种

  • 第一种:迭代器遍历(从Collection中继承来的)
  • 第二种:增强for循环(迭代器的简化写法)
  • 第三种:普通for循环配合使用get(index)方法

12.迭代器接口:Iterator

  迭代是取出集合中元素的一种方式,因为Collection中有iterator方法,所以每一个子类集合对迭代器。象都具备

  方法一:(常用)

  Iterator iter = l.iterator();

  while(iter.hasNext()){

    System.out.println(iter.next());

}

 

  方法二: 

for(Iterator iter = iterator();iter.hasNext();){

  System.out.println(iter.next());

}

 13.迭代器注意事项

  迭代器在Collection接口中是通用的。

  迭代器的next方法返回值类型是Object,所以要记得类型转换。

***********************************

习题代码:

**********************************

代码练习:

 1.从键盘录入年份,显示当年的二月份有多少天?(使用Calendar类的方法实现)

package com.test1;

import java.util.Calendar;
import java.util.Scanner;

/*
 * 从键盘录入年份,显示当年的二月份有多少天?(使用Calendar类的方法实现)
 */
class Demo3 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("input a year:");
        
        int year = sc.nextInt();
        
        //
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, year);
        c.set(Calendar.MONTH, 1);
        
        System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH));
        
        
    }
}

 2.从键盘录入两个时间(包含年-月-日),显示二者之间的天数差

package com.test1;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/*
 * 从键盘录入两个时间(包含年-月-日),显示二者之间的天数差
 */
public class Demo4 {

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        System.out.println("input two date:(yyyy-MM-dd)");
        String first = sc.next();
        String second = sc.next();
        
        //
        Date d1 = new SimpleDateFormat("yyyy-MM-dd").parse(first);
        Date d2 = new SimpleDateFormat("yyyy-MM-dd").parse(second);
        
        System.out.println((d2.getTime() - d1.getTime()) / 1000 / 3600 / 24);
    }

}
3.给出生日,求来到世界多少天。 
package com.test1;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

/*
 * 给出生日,求来到世界多少天!
 */
public class Demo1 {

    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        
        System.out.println("input your birthday:(yyyy-MM-dd)");
        
        String birthday = sc.next();
        //
        Date date = new SimpleDateFormat("yyyy-MM-dd").parse(birthday);
        long time = date.getTime();
        System.out.println((System.currentTimeMillis() - time) / 1000 / 3600 / 24);
    }

}

4.将自定义对象存储到集合中,并遍历.

package com.test;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
 * 将自定义对象存储到集合中,并遍历
 */

class Student{
    private String name;
    private int 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;
    }
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Student() {
        super();
    }
    
}

public class Demo {

    public static void main(String[] args) {
        Collection c = new ArrayList();
        //创建元素并添加到集合中
        Student s1 = new Student("toms", 10);
        Student s2 = new Student("Tyson", 12);
        Student s3 = new Student("Jerry", 13);

        c.add(s1);
        c.add(s2);
        c.add(s3);
        
        //
        Iterator it = c.iterator();
        while(it.hasNext()){
            Student s = (Student) it.next();
            System.out.println(s.getName() +","+ s.getAge());
        }
        
        System.out.println("---------------");
        for (Object obj : c) {
            Student s = (Student) obj;
            System.out.println(s.getName() +","+ s.getAge());
        }
        
    }

}

5.从键盘录入一个字符串,将其中的三个字符组成的单词抽取到一个集合中,并遍历输出(待补全)

package com.test;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
 * 从键盘录入一个字符串,将其中的三个字符组成的单词抽取到一个集合中,并遍历输出
 */
public class Demo2 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.println("input a string:");
        
        String line = sc.nextLine();
        Matcher m = Pattern.compile("\b[a-zA-Z]{3}\b").matcher(line);
        //创建集合
        List list = new ArrayList();
        while(m.find()){
            list.add(m.group());
        }
        //
        for (Object obj : list) {
            System.out.println(obj);
        }
        
    }

}
原文地址:https://www.cnblogs.com/akinodoo/p/9932858.html