------ ASP.Net+Android+IO开发.Net培训期待与您交流! ------
总结内容来源于黑马毕老师的java基础教学视频
集合框架
为什么出现集合类?
对象是对数据的封装,而集合是对对象的封装。编程中除了对单个象的操作外,
常常还需要对多个对象进行统一操作,这时就需用一个容器将这些对象存储起来,这样的容器就是集合。
集合与数组的区别
他们都是容器,都可以存储对象,他们的区别是:数组的长度是固定的,而集合的长度的可变的;
数组既能存储基本数据类型也能存储引用数据类型,而集合只能存储引用数据类型,
如果给集合添加基本数据类型的元素,这些基本数据类型会自动装箱成对应的引用数据类型;数组存储的元素都是同一类型,而集合可以存储不同类型的元素。
集合的特点: 集合只用于存储对象,它的长度可变,能够存储不同类型的对象。
集合框架为什么有这么多的容器?
因为每一个容器对数据的存储方式都有不同,这个存储方式称之为:数据结构。
接口Collection
共性方法
Collection是一个接口,它定义了一些共性的方法,包括添加、移除、清空元素,是否为空、是否包括某一元素,获取元素个数等操作。
注意:
1.它里边有一个iterator方法,专门用于取出此Collection的Iterator对象。
2.集合的add方法的参数类型是Object,以便于接受任意类型的对象。
3.集合中存放的都是对象的引用(地址)。
Iterator(迭代器)
集合中的的元素取出动作,不足以用一个函数来描述(取出前要先判断有没有),同时不同的存储结构,其取出的方式也不同,
所以定义了一个接口Iterator专门用来实现其取出操作。因为要访问集合内部的元素,所以迭代器的实现放在了具体集合的内部。
- import java.util.*;
- class CollectionDemo
- {
- public static void main(String[] args)
- {
- //method_2();
- method_get();
- }
- //迭代器的使用
- public static void method_get()
- {
- ArrayList al1 = new ArrayList();
- al1.add("java01");//添加元素.
- al1.add("java02");
- al1.add("java03");
- al1.add("java04");
- //获取迭代器,用于取出集合中的元素
- Iterator it = al1.iterator();
- it.next();//返回集合中下一个元素
- //hasNext()方法是判断集合中是否还有元素,返回值为boolean型
- while (it.hasNext())
- {
- sop("next:"+it.next());
- }
- }
- public static void method_2()
- {
- ArrayList al1 = new ArrayList();
- al1.add("java01");//添加元素.
- al1.add("java02");
- al1.add("java03");
- al1.add("java04");
- ArrayList al2 = new ArrayList();
- al2.add("java05");//添加元素.
- al2.add("java06");
- al2.add("java03");
- al2.add("java04");
- //al1.retainAll(al2);//取交集,al1只保留与al2中相同的元素.
- al1.removeAll(al2);//去交集,al1只保留与al2中不同的元素.
- sop(al1);
- sop(al2);
- }
- public static void method_base()
- {
- //创建一个集合容器.使用Collection接口的子类.ArrayList
- ArrayList al = new ArrayList();
- al.add("java01");//添加元素.
- al.add("java02");
- al.add("java03");
- al.add("java04");
- sop("size:"+al.size());//获取个数,集合长度.
- sop(al);//打印原集合
- //al.remove("java01");//删除元素
- //al.clear();//清空集合
- //判断元素是否在集合内
- sop("java03是否在集合内:"+al.contains("java03"));
- sop("集合是否为空:"+al.isEmpty());
- sop("size:"+al.size());//获取改变后的长度
- sop(al);//打印改变后的集合
- }
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- }
Collection
|--List:元素是有序的,元素可以重复.因为该集合体系有索引.
|--ArrayList:底层的数据结构使用的是数组结构.特点:查询快,增删慢.线程不同步.
|--LinkeList:底层使用的是链表数据结构.特点:增删快,查询慢
|--Vector:底层是数组结构.线程同步.被ArryList替代.
|--Set:元素是无序的,元素不可以重复.
List:
特有方法.凡是可以操作角标的方法都是该体系特有的方法.
增
add(index,element);
addAll(index,Collection);
删
remove(index);
改
set(index,element);
查
get(index);
sublist(from,to);
listInterator();
List集合特有的迭代器.ListIterator是Interator的子接口.
在迭代时,不可以通过集合对象的方法操作集合中的元素.
因为会发生ConcurrentModificationException异常
所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator的方法是有限的
只能对元素进行判断,取出,删除等操作.
如果想要其他操作的如添加,修改等,就需要使用其子接口,ListIterator.
该接口只能通过List集合的ListIterator方法获取.
ArrayList底层是数组结构,线程不同步。
- import java.util.*;
- class ListDemo
- {
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void listbase_method()
- {
- ArrayList al = new ArrayList();
- al.add("java01");
- al.add("java02");
- al.add("java03");
- sop("原集合:"+al);
- al.add(1,"java10");//指定位置添加元素
- //al.addAll(2,al);//指定位置添加集合
- al.remove(3);//删除指定位置的元素
- al.set(2,"java03");//修改指定位置的元素
- sop("get(1):"+al.get(1));//获取指定位置的元素
- sop("修改后:"+al);
- //get()获取所有元素
- for (int x=0; x<al.size(); x++)
- {
- sop("al("+x+")"+al.get(x));
- }
- }
- public static void main(String[] args)
- {
- ArrayList al = new ArrayList();
- //使用ListIterator迭代器进行添加删除
- ListIterator li = al.listIterator();
- li.add("java01");
- li.add("java02");
- li.add("java03");
- li.add("java04");
- li.remove("java04");
- //使用ListIteraor迭代器获取所有元素
- while (li.hasPrevious())//hasPrevious判断前面是否有元素与hasNext相反
- {
- sop("next:"+li.previous());//previous从后往前迭代
- }
- }
- }
- /*
- 去除ArrayList集合中的重复元素
- 思路:新建一个容器,把原容器中的元素取出,存进新容器,
- 存的同时,判断新容器中是否存在此元素
- */
- import java.util.*;
- class ArrayListTest
- {
- public static ArrayList getSingleElement(ArrayList al)
- {
- ArrayList newal = new ArrayList();
- ListIterator li = al.listIterator();
- while (li.hasNext())
- {
- Object obj = li.next();
- if (!(newal.contains(obj)))
- {
- newal.add(obj);
- }
- }
- return newal;
- }
- public static void main(String[] args)
- {
- ArrayList al = new ArrayList();
- al.add("java01");
- al.add("java01");
- al.add("java02");
- al.add("java03");
- al.add("java04");
- al.add("java03");
- al.add("java02");
- System.out.println(al);
- getSingleElement(al);
- }
- }
ArrayList练习2
- /*
- 将自定义对象作为元素存到ArrayList集合中,并去除重复元素.
- 比如:存入人对象.同姓名 同年龄,视为一个人,为重复元素.
- 思路:
- 1.对人描述,将数据封装进人对象.
- 2.定义容器,将人存入.
- 3.取出.
- List集合判断元素是否相同,依据是元素的equals方法,contains方法调用了equals方法,
- remove也调用了equals方法.
- */
- import java.util.*;
- class Person
- {
- private String name;
- private int age;
- Person(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- //复写了equals方法,被contains方法调用
- public boolean equals(Object obj)
- {
- if (!(obj instanceof Person))
- {
- return false;
- }
- Person p = (Person)obj;
- System.out.println(this.name+"---"+p.name);
- return this.name.equals(p.name)&&this.age==p.age;
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- }
- class ArrayListTest2
- {
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void main(String[] args)
- {
- ArrayList al = new ArrayList();
- al.add(new Person("2B",15));
- al.add(new Person("2A",30));
- al.add(new Person("2B",15));
- al.add(new Person("3C",50));
- al.add(new Person("4D",60));
- al.add(new Person("3C",50));
- ArrayList al1 = getSingleElement(al);
- Iterator it = al1.iterator();
- while (it.hasNext())
- {
- //由于迭代器next()方法获取的元素是Object类型的,
- //所以需要向下转型为Person
- Person p = (Person)it.next();
- sop(p.getName()+"-------"+p.getAge());
- }
- }
- public static ArrayList getSingleElement(ArrayList al)
- {
- ArrayList newal = new ArrayList();
- ListIterator li = al.listIterator();
- while (li.hasNext())
- {
- Object obj = li.next();
- if (!(newal.contains(obj)))//contain方法调用了底层的equals方法
- {
- newal.add(obj);
- }
- }
- return newal;
- }
- }
LinkedList:特有方法:
addFirst();
addLast();
getFirst(); |
getLast(); |
获取元素,但不删除元素|
|--如果集合中没有元素,会出现NoSuchElementException
removeFirst(); |
removeLast(); |
删除元素,并获取元素 |
在JDK1.6出现了替代方法.
offerFirst()
offerLast()
peekFirst() |
peekLast() |
获取元素,但不删除元素|
|--如果集合中没有元素,会返回null
pollFirst() |
pollLast() |
删除元素,并获取元素 |
- /*
- 使用LinkedList模拟一个堆栈或者队列数据结构.
- 堆栈数据结构:先进后出
- 队列数据结构:先进先出
- */
- import java.util.*;
- //堆栈结构
- //队列结构
- class DuiLie
- {
- private LinkedList link;
- DuiLie()
- {
- link = new LinkedList();
- }
- public void mySet(Object obj)
- {
- link.addFirst(obj);
- }
- public void myGet()
- {
- System.out.println(link.removeLast());
- }
- boolean isEmpty()
- {
- return link.isEmpty();
- }
- }
- class LinkedListTest
- {
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void main(String[] args)
- {
- DuiLie dt = new DuiLie();
- dt.mySet("java04");
- dt.mySet("java03");
- dt.mySet("java02");
- dt.mySet("java01");
- while (!(dt.isEmpty()))
- {
- dt.myGet();
- }
- }
- }
Vector中特有的枚举
枚举Enumeration就是Vector特有的取出方式.
发现枚举和迭代器很像.
其实枚举和迭代时一样的.
因为枚举的名称以及方法的名称都过长.
所以被迭代器取代了.
ArrayList取代了Vector,Iterator取代了Enumeration
- class VectorDemo
- {
- public static void main(String[] args)
- {
- Vector v = new Vector();
- v.add("java01");
- v.add("java02");
- v.add("java03");
- v.add("java04");
- //Enumeration就是枚举,是一个接口,类似迭代器
- Enumeration en = v.elements();
- while (en.hasMoreElements())//类似hasNext
- {
- System.out.println(en.nextElement());//类似next
- }
- }
- }
Set:元素是无序的(存入和取出的顺序不一定一致),元素不可以重复.
HashSet:底层数据结构是哈希表.
HashSet是如何保证元素的唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成.
如果元素的hashCode值相同,才会判断equals是否为true.
果元素的hashCode值不同,就不会调用equals.
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法先判断hashCode,其次equals.
编程中,复写hashCode方法时,要尽量确保哈希值的唯一性,减少equals方法调用的次数,提高效率.
- /*
- 往HashSet集合中存入自定对象
- 姓名和年龄相同为一个人,重复元素
- */
- import java.util.*;
- class HashSetDemo
- {
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void main(String[] args)
- {
- HashSet hs = new HashSet();
- hs.add(new Person("a1",11));
- hs.add(new Person("a2",12));
- hs.add(new Person("a2",12));
- hs.add(new Person("a3",13));
- Iterator it = hs.iterator();
- while (it.hasNext())
- {
- Person p = (Person)it.next();
- sop(p.getName()+"::"+p.getAge());
- }
- }
- }
- class Person
- {
- private String name;
- private int age;
- Person(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- //复写hashCode方法
- public int hashCode()
- {
- System.out.println(this.name+"--hashCoede");
- return this.name.hashCode()+age*37;//尽量确保哈希值唯一性.提高代码效率
- }
- //复写了equals方法,被contains方法调用
- public boolean equals(Object obj)
- {
- if (!(obj instanceof Person))
- {
- return false;
- }
- Person p = (Person)obj;
- System.out.println(this.name+"--equals--"+p.name);
- return this.name.equals(p.name)&&this.age==p.age;
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- }
TreeSet:可以对Set集合中的元素进行排序,底层数据结构是二叉树.
保证元素唯一性的依据:comparaTo方法.
TreeSet排序的第一种方式:让元素自身具备比较性,元素需要实现Comparable接口,覆盖compareTo方法.
这种方式也称为元素的自然顺序,或叫默认顺序.
- */
- import java.util.*;
- class TreeSetDemo
- {
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void main(String[] args)
- {
- TreeSet ts = new TreeSet();
- ts.add(new Student("lisi001",30));
- ts.add(new Student("lisi004",17));
- ts.add(new Student("lisi005",17));
- ts.add(new Student("lisi008",31));
- Iterator it = ts.iterator();
- while (it.hasNext())
- {
- Student s = (Student)it.next();//向下转型
- sop(s.getName()+"::"+s.getAge());
- }
- }
- }
- class Student implements Comparable//该接口强制让学生类具有可比性
- {
- private String name;
- private int age;
- Student(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- //复写Comparable接口的compareTo方法供底层调用
- public int compareTo(Object obj)
- {
- if (!(obj instanceof Student))
- throw new RuntimeException("不是Student对象");
- Student s = (Student)obj;//向下转型
- if (this.age > s.age)
- return 1;
- if (this.age == s.age)
- return this.name.compareTo(s.name);//调用了字符串的compareTo方法
- return -1;
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- }
TreeSet排序的第二种方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的.
这时就需要让集合自身具备比较性.让集合在初始化时,就有了比较方式.
定义比较器实现Comparator接口,将比较器对象作为参数传递给TreeSet集合的构造函数.
当两种排序都在时,以比较器Comparator为主.
- import java.util.*;
- class TreeSetDemo2
- {
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void main(String[] args)
- {
- TreeSet ts = new TreeSet(new MyComparator());
- ts.add(new Student("lisi001",30));
- ts.add(new Student("lisi004",17));
- ts.add(new Student("lisi004",18));
- ts.add(new Student("lisi005",17));
- ts.add(new Student("lisi008",31));
- Iterator it = ts.iterator();
- while (it.hasNext())
- {
- Student s = (Student)it.next();//向下转型
- sop(s.getName()+"::"+s.getAge());
- }
- }
- }
- class Student implements Comparable//该接口强制让学生类具有可比性
- {
- private String name;
- private int age;
- Student(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- //复写Comparable接口的compareTo方法供底层调用
- public int compareTo(Object obj)
- {
- return 1;
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- }
- class MyComparator implements Comparator//实现比较器接口
- {
- public int compare(Object o1,Object o2)
- {
- Student s1 = (Student)o1;
- Student s2 = (Student)o2;
- int num = s1.getName().compareTo(s2.getName());
- if (num == 0)
- return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
- return num;
- }
- }
TreeSet练习
- /*
- 需求:根据字符串长度进行排序.
- 分析:
- 1.建立一个比较器
- 2.比较器中复写compare方法,分别返回1,0,-1.
- */
- import java.util.*;
- class LengthComparator implements Comparator
- {
- public int compare(Object o1,Object o2)
- {
- if(!(o1 instanceof String))
- throw new RuntimeException("传入的数据不是字符串");
- String s1 = (String)o1;
- String s2 = (String)o2;
- int num = new Integer(s1.length()).compareTo(s2.length());
- if(num == 0)
- return s1.compareTo(s2);
- return num;
- }
- }
- class TreeSetTest
- {
- public static void main(String[] args)
- {
- TreeSet ts = new TreeSet(new LengthComparator());
- ts.add("dwadwa");
- ts.add("hfghfdg");
- ts.add("hghh");
- ts.add("fda");
- ts.add("ddd");
- Iterator it = ts.iterator();
- while (it.hasNext())
- {
- System.out.println(it.next());
- }
- }
- }
泛型:JDK1.5版本出现新特性.用于解决安全问题,是一个安全机制.
好处:
1.将运行时期出现的问题ClassCastException转移到了编译时期.
方便与程序员解决问题,让运行时问题减少,安全.
2.避免了强制强转的麻烦.
泛型格式:通过<>来定义要操作的引用数据类型.
在使用java提供的对象时,什么时候写泛型?
通常在集合框架中很常见,
只要见到<>就要定义泛型.
其实<>就是用来接收类型的.
当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可.
- import java.util.*;
- class GenericDemo
- {
- public static void main(String[] args)
- {
- //定义泛型的类型
- ArrayList<String> al = new ArrayList<String>();
- al.add("abc");
- al.add("abcdfd");
- al.add("abc023");
- //al.add(4);//al.add(new Integer(4));//1.5版本自动升级成后面的写法,自动装箱功能
- //定义泛型的类型
- Iterator<String> it = al.iterator();
- while (it.hasNext())
- {
- String s = it.next();
- System.out.println(s+"..s.length.."+s.length());
- }
- }
- }
泛型练习
- /*
- 定义一个对象:现在至少需要hashCode(),equals(),compareTo()方法的覆盖.
- hashCode(),equals()可以直接覆盖.
- compareTo()需要实现Comparable接口覆盖.
- */
- import java.util.*;
- class GenericDemo2
- {
- public static void main(String[] args)
- {
- //明确泛型类型
- TreeSet<String> ts = new TreeSet<String>(new LenComparator());
- ts.add("abc003");
- ts.add("abc0ggh");
- ts.add("abc0223");
- ts.add("abc54");
- ts.add("abcfwa");
- //明确泛型类型
- Iterator<String> it = ts.iterator();
- while (it.hasNext())
- {
- String s = it.next();
- System.out.println(s);
- }
- }
- }
- //定义一个比较器
- class LenComparator implements Comparator<String>
- {
- public int compare(String s1,String s2)
- {
- //s1和s2调换位置既可实现反向排序
- int num = new Integer(s1.length()).compareTo(new Integer(s2.length()));
- if (num == 0)
- return s1.compareTo(s2);
- return num;
- }
- }
泛型类:
什么时候定义泛型类?
当类中操作的引用数据类型不确定的时候,早先定义Object来完成扩展,现在定义泛型.
泛型方法&&静态方法泛型:
泛型类定义的泛型,在整个类中有效.如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所要操作的类型就已经固定了.
为了让不同方法可以操作不同类型,而且类型还不确定.
那么可以将泛型定义在方法上.
特殊之处:
静态方法不可以访问类上定义的泛型.
如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上.
- class Demo
- {
- public <T> void show(T t)
- {
- System.out.println(t);
- }
- public <Q> void print(Q q)
- {
- System.out.println(q);
- }
- public static <W> void method(W w)
- {
- System.out.println(w);
- }
- }
泛型定义在接口上
- interface Inter<T>
- {
- public abstract void show(T t);
- }
- class InterImpl<T> implements Inter<T>
- {
- public void show(T t)
- {
- System.out.println("show :"+t);
- }
- }
泛型的限定
?通配符.也可以理解为占位符.
泛型的限定:
? extends E:可以接受E类型或者E的子类型.
? super E:可以接收E类型或者E的父类型.
- import java.util.*;
- class GenericDemo6
- {
- public static void main(String[] args)
- {
- ArrayList<Person> al = new ArrayList<Person>();
- al.add(new Person("abc1"));
- al.add(new Person("abc2"));
- al.add(new Person("abc3"));
- ArrayList<Student> al2 = new ArrayList<Student>();
- al2.add(new Student("abc1"));
- al2.add(new Student("abc2"));
- al2.add(new Student("abc3"));
- printAl(al2);
- }
- public static void printAl(ArrayList<? extends Person> al)
- {
- Iterator<? extends Person> it = al.iterator();
- while(it.hasNext())
- {
- System.out.println(it.next().getName());
- }
- }
- }
- class Person
- {
- private String name;
- Person(){}
- Person(String name)
- {
- this.name = name;
- }
- public String getName()
- {
- System.out.println("Person");
- return name;
- }
- }
- class Student extends Person
- {
- private String name;
- Student(String name)
- {
- this.name = name;
- }
- public String getName()
- {
- System.out.println("Student");
- return name;
- }
- }
Map子类特点和共性
Map集合:该集合存储键值对.一对一对往里存.但要确保键的唯一性.
1.添加
put(K key,V value)
putAll(Map<? extendes K,?extends V> m)
2.删除
clear()
remove(Object key)
3.修改
containsValue(Object value)
containsKey(Object key)
isEmpty()
4.获取
get(Object key)
size()
values()
entrySet()
keySet()
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值,该集合是线程同步.
|--HashMap:底层是哈希表数据结构,允许使用null键null值,该集合是不同步的.
|--TreeMap:底层是二叉树数据结构,线程不同步.可以给Map集合中的键进行排序.
Map和Set很像.
Set底层就是使用了Map集合.
- import java.util.*;
- class MapDemo
- {
- public static void main(String[] args)
- {
- Map<String,String> map = new HashMap<String,String>();
- //添加元素,put方法会返回此键的原值,并且新值会覆盖原值
- map.put("01","zhangsan1");
- map.put("02","zhangsan2");
- map.put("03","zhangsan3");
- //判断是否包含
- System.out.println("containsKey:"+map.containsKey("002"));
- //System.out.println("remove:"+map.remove("02"));//删除
- map.put(null,"haha");
- System.out.println("get:"+map.get(null));
- //可以通过get方法的返回值判断一个键是否存在,返回值是否是null
- //获取集合中所有的值,并返回一个集合
- Collection<String> coll = map.values();
- System.out.println(coll);
- //获取map集合中所有的键和值
- System.out.println(map);
- }
- }
Map的keySet和entrySet方法
Map集合的取出原理:将Map集合转成Set集合.在通过迭代器取出.
Map集合的两种取出方式:
1.keySet:将Map中所有的键存入到Set集合,因为Set具备迭代器,可以用迭代器取出所有的键,在根据get方法,获取每一个键对应的值.
2.entrySet:将Map集合中的映像关系存入到set集合中,而这个关系的数据类型就是:Map.Entry
- import java.util.*;
- class MapDemo2
- {
- public static void main(String[] args)
- {
- Map<String,String> map = new HashMap<String,String>();
- map.put("001","panfeng01");
- map.put("002","panfeng02");
- map.put("003","panfeng03");
- map.put("004","panfeng04");
- //将Map集合中的映像关系取出,存入到Set集合中.entrySet()
- Set<Map.Entry<String,String>> entry = map.entrySet();
- Iterator<Map.Entry<String,String>> it = entry.iterator();
- while (it.hasNext())
- {
- Map.Entry<String,String> me = it.next();
- String k = me.getKey();
- String v = me.getValue();
- System.out.println("key--"+k+" value--"+v);
- }
- /*
- //先获取Map集合的所有键的Set集合,keySet();
- Set<String> ks = map.keySet();
- //有了Set集合就可以获取其迭代器
- Iterator<String> it = ks.iterator();
- while (it.hasNext())
- {
- String key = it.next();
- String value = map.get(key);
- System.out.println("key--"+key+"::value--"+value);
- }
- */
- }
- }
- /*
- Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口
- 写法:
- interface Map
- {
- public static interface Entry
- {
- public abstract Object getKey();
- public abstract Object getvalue();
- }
- }
- */
Map练习1
- /*
- 每一个学生都有对应的归属地.
- 学生Student,地址String.
- 学生属性:姓名.年龄.
- 注意:姓名和年龄相同视为同一个学生.
- 保证学生唯一性.
- 1.描述学生.
- 2.定义Map容器,将学生作为键,地址作为值.存入.
- 3.获取Map集合中的元素.
- */
- import java.util.*;
- class Student implements Comparable<Student>//实现比较排序接口
- {
- private String name;
- private int age;
- Student(String name,int age)
- {
- this.name = name;
- this.age = age;
- }
- //复写Object的hashCode方法,具备自己的哈希值
- public int hashCode()
- {
- return name.hashCode()+age*34;
- }
- //复写Object的equals方法,具备自己的比较方式
- public boolean equals(Object o)
- {
- if (!(o instanceof Student))
- throw new ClassCastException("类型不匹配");
- Student s = (Student)o;
- return this.name.equals(s.name)&&this.age==s.age;
- }
- //复写了所实现接口的compareTo方法,具备自己独特的排序方式.
- public int compareTo(Student s)
- {
- int num = new Integer(this.age).compareTo(new Integer(s.age));
- if(num == 0)
- return this.name.compareTo(s.name);
- return num;
- }
- public String getName()
- {
- return name;
- }
- public int getAge()
- {
- return age;
- }
- }
- class MapTest
- {
- public static void main(String[] args)
- {
- HashMap<Student,String> map = new HashMap<Student,String>();
- map.put(new Student("lisi01",21),"beijing");
- map.put(new Student("lisi02",9),"tianjin");
- map.put(new Student("lisi03",20),"shanghai");
- map.put(new Student("lisi04",20),"guangzhou");
- //第一种取出方式 keySet
- Set<Student> set = map.keySet();
- Iterator<Student> it = set.iterator();
- while (it.hasNext())
- {
- Student stu = it.next();
- String value = map.get(stu);
- System.out.println(stu.getName()+"-"+stu.getAge()+"-"+value);
- }
- //第二种取出方式 entrySet
- Set<Map.Entry<Student,String>> set2 = map.entrySet();
- Iterator<Map.Entry<Student,String>> it2 = set2.iterator();
- while (it2.hasNext())
- {
- Map.Entry<Student,String> me = it2.next();
- Student stu = me.getKey();
- String value = me.getValue();
- System.out.println(stu.getName()+"::"+stu.getAge()+"::"+value);
- }
- }
- }
Map练习2
- /*
- 需求:对学生对象的年龄进行升序排序.
- 因为数据是以键值对形式存在的.
- 所以要使用可以排序的Map集合,TreeMap.
- */
- import java.util.*;
- class TreeMapTest
- {
- public static void main(String[] args)
- {
- TreeMap<Student,String> tm = new TreeMap<Student,String>(new StuComparator());
- tm.put(new Student("lisi01",21),"beijing");
- tm.put(new Student("lisi02",9),"tianjin");
- tm.put(new Student("lisi03",20),"shanghai");
- tm.put(new Student("lisi04",20),"guangzhou");
- Set<Student> set = tm.keySet();
- Iterator<Student> it = set.iterator();
- while (it.hasNext())
- {
- Student s = it.next();
- String value = tm.get(s);
- System.out.println(s.getName()+"-"+s.getAge()+"-"+value);
- }
- }
- }
- //定义一个比较器实现Comparator接口,并复写compare方法
- class StuComparator implements Comparator<Student>
- {
- public int compare(Student s1,Student s2)
- {
- int num = s1.getName().compareTo(s2.getName());
- if(num == 0)
- return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
- return num;
- }
- }
Map练习3
- /*
- 练习:
- "sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数.
- 希望打印结果:a(1)c(2)....
- 通过结果发现,每一个字母都有对应关系的次数.
- 说明字母和次数之间是映射关系.
- 注意了,当发现有映射关系时,可以选择Map集合.
- 因为Map集合中存放的就是映射关系.
- 什么时候使用Map集合呢?
- 当数据之间存在映射关系时,就要先想到Map集合.
- 思路:
- 1.将字符串转成字符数组.因为要对每一个字母进行操作.
- 2.定义一个Map集合,因为打印结果的字母有顺序,所以使用TreeMao集合.
- 3.遍历字符数组,将每一个字母作为键去查Map集合.
- 如果返回null,将该字母和1存入到Map集合中.
- 如果返回不是null,说明该字母在Map集合中已经存在,
- 那么就获取该次数进行自增,然后将该字母和自增后的次数存入到Map集合中.
- 覆盖调用原键所对应的值
- 4.将Map集合中的数据变成指定的字符窜形式返回.
- */
- import java.util.*;
- class MapTest3
- {
- public static void main(String[] args)
- {
- System.out.println(charCount("abdacdbee"));
- }
- public static String charCount(String str)
- {
- char[] chs = str.toCharArray();
- TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
- int count = 0;
- for (int x = 0;x < chs.length;x++ )
- {
- //判断是否为字母,只取字母
- if(chs[x]>='a'&&chs[x]<='z' || chs[x]>='A'&&chs[x]<='Z')
- {
- Integer value = tm.get(chs[x]);
- if(!(value==null))
- count = value;
- count++;
- tm.put(chs[x],count);
- count = 0;
- }
- continue;
- /*
- if(value==null)
- {
- tm.put(chs[x],1);
- }
- else
- {
- tm.put(chs[x],value+1);
- }
- */
- }
- //定义一个容器,用来存储迭代出的元素.
- StringBuilder sb = new StringBuilder();
- Set<Map.Entry<Character,Integer>> set = tm.entrySet();
- Iterator<Map.Entry<Character,Integer>> it = set.iterator();
- while (it.hasNext())
- {
- Map.Entry<Character,Integer> me = it.next();
- Character ch = me.getKey();
- Integer value = me.getValue();
- sb.append(ch+"("+value+")");
- }
- return sb.toString();
- }
- }
Map练习4--扩展
- /*
- Map扩展知识.
- Map集合被使用是因为具备映射关系.
- 需求:
- 1.
- "yureban";"01","zhangsan"
- "yureban";"02","lisi"
- "jiuyeban";"01","wangwu"
- "jiuyeban";"02","zhaoliu"
- 2.
- "yureban"; Student("01","zhangsan")
- "yureban";Student("02","lisi")
- "jiuyeban";Student("01","wangwu")
- "jiuyeban";Student("02","zhaoliu")
- */
- import java.util.*;
- class Student
- {
- private String id;
- private String name;
- Student(String id,String name)
- {
- this.id = id;
- this.name = name;
- }
- public String toString()
- {
- return id+"::"+name;
- }
- }
- class MapTest4
- {
- public static void main(String[] args)
- {
- //demo1();
- demo2();
- }
- public static void demo2()
- {
- TreeMap<String,List<Student>> sch = new TreeMap<String,List<Student>>();
- List<Student> yure = new ArrayList<Student>();
- sch.put("yureban",yure);
- yure.add(new Student("01","zhangsan"));
- yure.add(new Student("02","lisi"));
- List<Student> jiuye = new ArrayList<Student>();
- sch.put("jiuyeban",jiuye);
- jiuye.add(new Student("01","wangwu"));
- jiuye.add(new Student("01","zhaoliu"));
- Set<String> set = sch.keySet();
- Iterator<String> it = set.iterator();
- while (it.hasNext())
- {
- String s = it.next();
- List l = sch.get(s);
- System.out.println(s);
- for(int x = 0;x<l.size();x++)
- {
- System.out.println(l.get(x));
- }
- }
- }
- public static void demo1()
- {
- //定义一个映射集合,作为学校,集合中的key是教室名称,value是教室
- TreeMap<String,TreeMap<String,String>> tm = new TreeMap<String,TreeMap<String,String>>();
- //定义一个yureban映射集合,作为教室,key是学号,value是学生名字
- TreeMap<String,String> tm1 = new TreeMap<String,String>();
- tm.put("yureban",tm1);
- tm1.put("01","zhangsan");
- tm1.put("02","lisi");
- //定义一个jiuyeban映射集合,作为教室,key是学号,value是学生名字
- TreeMap<String,String> tm2 = new TreeMap<String,String>();
- tm.put("jiuyeban",tm2);
- tm2.put("01","wangwu");
- tm2.put("02","zhaoliu");
- Set<String> set = tm.keySet();
- Iterator<String> it = set.iterator();
- while (it.hasNext())
- {
- String s = it.next();
- System.out.println(s);
- method(tm.get(s));
- }
- }
- public static void method(TreeMap<String,String> tm)
- {
- Set<String> set = tm.keySet();
- Iterator<String> it = set.iterator();
- while (it.hasNext())
- {
- String s = it.next();
- String s1 = tm.get(s);
- System.out.println(s+"::"+s1);
- }
- }
- }
集合框架工具类
Collections:
根据元素的自然顺序 对指定列表按升序进行排序。
sort(List<T> list)
根据指定比较器产生的顺序对指定列表进行排序。
sort(List<T> list, Comparator<? super T> c)
根据元素的自然顺序,返回给定 collection 的最大元素。
max(Collection<? extends T> coll)
根据指定比较器产生的顺序,返回给定 collection 的最大元素。
max(Collection<? extends T> coll, Comparator<? super T> comp)
- import java.util.*;
- class CollectionsDemo
- {
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- public static void main(String[] args)
- {
- //sortDemo();
- maxDemo();
- }
- public static void maxDemo()
- {
- List<String> list = new ArrayList<String>();
- list.add("cdvf");
- list.add("bdvfer");
- list.add("advfdwa");
- list.add("adf");
- list.add("ef");
- Collections.sort(list);
- String max = Collections.max(list,new StrLenComparator());
- sop("max="+max);
- }
- public static void sortDemo()
- {
- List<String> list = new ArrayList<String>();
- list.add("cdvf");
- list.add("bdvfer");
- list.add("advfdwa");
- list.add("adf");
- list.add("ef");
- sop(list);
- Collections.sort(list);
- sop(list);
- Collections.sort(list,new StrLenComparator());
- sop(list);
- }
- }
- class StrLenComparator implements Comparator<String>
- {
- public int compare(String s1,String s2)
- {
- if(s1.length()>s2.length())
- return 1;
- if(s1.length()<s2.length())
- return -1;
- return s1.compareTo(s2);
- }
- }
Collections(binarySearch)
- /*
- 集合框架工具类
- Collections:
- 使用二分搜索法搜索指定列表,以获得指定对象
- binarySearch(List<? extends Comparable<? super T>> list, T key)
- 使用二分搜索法搜索指定列表,以获得指定对象
- binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
- */
- import java.util.*;
- class BinarySearchDemo
- {
- public static void main(String[] args)
- {
- binarySearch();
- }
- public static void binarySearch()
- {
- List<String> list = new ArrayList<String>();
- list.add("cdvf");
- list.add("bdvfer");
- list.add("advfdwa");
- list.add("adf");
- list.add("ef");
- Collections.sort(list);
- System.out.println(list);
- int index = Collections.binarySearch(list,"bdf");
- System.out.println("index="+index);
- Collections.sort(list,new StrLenComparator());
- System.out.println(list);
- int index2 = Collections.binarySearch(list,"bdf",new StrLenComparator());
- System.out.println("index2="+index2);
- }
- }
- class StrLenComparator implements Comparator<String>
- {
- public int compare(String s1,String s2)
- {
- if(s1.length()>s2.length())
- return 1;
- if(s1.length()<s2.length())
- return -1;
- return s1.compareTo(s2);
- }
- }
Collections(fill、replaceAll、reverse)
- /*
- 集合框架工具类
- Collections:
- 将集合中的元素全部替换成obj
- fill(List<? super T> list, T obj)
- 将原值替换成新值
- replaceAll(List<T> list, T oldVal, T newVal)
- 反转指定列表中元素的顺序。
- reverse(List<?> list)
- */
- import java.util.*;
- class FillDemo
- {
- public static void main(String[] args)
- {
- fillDemo();
- }
- /*
- 练习:fill方法可以将list集合中所有元素替换成指定元素.
- 将list集合中部分元素替换成指定元素.
- */
- public static void fillDemo()
- {
- List<String> list = new ArrayList<String>();
- list.add("cdvf");
- list.add("bdvfer");
- list.add("advfdwa");
- list.add("adf");
- list.add("ef");
- sop(list);
- Collections.fill(list,"pp");
- sop(list);
- }
- public static void sop(Object obj)
- {
- System.out.println(obj);
- }
- }
Collections(reverseOrder)
- /*
- 集合框架工具类
- Collections:
- 返回一个比较器,它强行逆转实现了Comparable接口的对象collection的自然顺序
- reverseOrder()
- 返回一个比较器,它强行逆转指定比较器的顺序
- reverseOrder(Comparator<T> cmp)
- */
- import java.util.*;
- class ReverseOrderDemo
- {
- public static void main(String[] args)
- {
- TreeSet<String> list = new TreeSet<String>(Collections.reverseOrder(new StrLenComparator()));
- list.add("cdvf");
- list.add("bdvfer");
- list.add("advfdwa");
- list.add("adf");
- list.add("ef");
- Iterator<String> it = list.iterator();
- while (it.hasNext())
- {
- String s = it.next();
- System.out.println(s);
- }
- }
- }
- class StrLenComparator implements Comparator<String>
- {
- public int compare(String s1,String s2)
- {
- if(s1.length()>s2.length())
- return 1;
- if(s1.length()<s2.length())
- return -1;
- return s1.compareTo(s2);
- }
- }
Collections(其他常见方法)
返回指定 collection 支持的同步(线程安全的)collection
synchronizedCollection(Collection<T> c)
返回指定列表支持的同步(线程安全的)列表。
synchronizedList(List<T> list)
返回由指定映射支持的同步(线程安全的)映射。
synchronizedMap(Map<K,V> m)
返回指定 set 支持的同步(线程安全的)set。
synchronizedSet(Set<T> s)
在指定列表的指定位置处交换元素
swap(List<?> list, int i, int j)
使用默认随机源对指定列表进行位置的调换(随机调换位置)
shuffle(List<?> list)
----------------------------------------------------
数组工具类Arrays(asList(数组变集合))
Arrays:用于操作数组的工具类,里面都是静态方法
其中大部分方法参见 Collections 工具类.
将数组变成list集合
asList(array)
把数组变成集合有什么好处?
可以使用集合的思想和方法操作数组中的元素.
注意:将数组变成集合,不可以使用集合的增删方法.
因为数组的长度是固定的.
如果增删,会发生UnsupportedOperationException(不支持操作异常).
十分注意:如果数组中的元素都是对象.那么变成集合时,数组中的元素就直接转成集合中的元素
如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在.
集合变数组
集合变数组
Collection接口中的toArray方法
返回包含此 collection 中所有元素的数组
toArray()
返回包含此 collection 中所有元素的数组,类型与指定数组的类型相同
toArray(T[] a)
1.指定类型的数组到底要定义多长呢?
当指定类型的数组长度小于集合的size,那么该方法内部会创建一个新的数组.长度为集合的size.
当指定类型的数组长度大于集合的size,就不会创建新的数组,而是使用传递进来的数组,用null补位.
所以创建一个刚刚好的数组最有,长度为size.
2.为什么要将集合变数组?
为何限定对数组的操作,不需要进行增删.
高级for循环
高级for循环
格式
for(数据类型 变量名 : 被遍历的集合(Collection)或者数组)
{
}
对集合进行遍历.
只能获取元素.不能对集合进行操作.
迭代器除了遍历,还可以进行remove集合中的元素操作.
如果是ListIterator,还可以在遍历中对集合进行增删改查操作.
传统for和高级for有什么区别?
高级for有一个局限性,必须有被遍历的目标.
- import java.util.*;
- class ForEachDemo
- {
- public static void main(String[] args)
- {
- //取出List集合
- ArrayList<String> al = new ArrayList<String>();
- al.add("abc1");
- al.add("abc2");
- al.add("abc3");
- for (String s : al )
- {
- System.out.println(s);
- }
- //取出数组
- int[] arr = {2,3,4};
- for (Integer i : arr )
- {
- System.out.println(i);
- }
- //取出Map集合
- HashMap<Integer,String> hm = new HashMap<Integer,String>();
- hm.put(1,"a");
- hm.put(2,"b");
- hm.put(3,"c");
- Set<Map.Entry<Integer,String>> me = hm.entrySet();
- for (Map.Entry<Integer,String> set : me )
- {
- System.out.println(set);
- }
- }
- }
可变参数
- /*
- JDK1.5版本出现的新特性.
- 可变参数:
- 其实就是数组参数的简写形式
- 不用每一次都手动的建立数组对象
- 只要将要操作的元素作为参数传递即可
- 隐式将这些参数封装成了数组
- 在使用时注意:可变参数一定要定义在参数列表最后面
- */
- class ParamMethodDemo
- {
- public static void main(String[] args)
- {
- show(3,4);
- show(3,4,5,6,7,8,8,9);
- show(3,4,3,4,6,6);
- }
- public static void show(int ... i)//int可以为任意类型,要和传递进来的类型保持一致
- {
- System.out.println(i.length);
- }
- }
静态导入
- /*
- StaticImport:静态导入.
- 当类名重名时,需要指定具体的包名.
- 当方法重名时,需要指定所属的对象或者类.
- */
- import java.util.*;
- import static java.util.Arrays.*;//导入的是Arrays的所有静态成员(包括方法和变量)
- import static java.lang.System.*;
- class StaticImport
- {
- public static void main(String[] args)
- {
- int[] arr = {5,4,7,6};
- sort(arr);
- int index = binarySearch(arr,5);
- out.println(Arrays.toString(arr));//Object也有toString方法,所以必须指定Arrays
- out.println("Index="+index);
- }
- }
System--Properties
- /*
- System:类中的方法和属性都是静态的
- out:标准输出,默认是控制台.
- int:标准输入,默认是键盘.
- */
- import java.util.*;
- class SystemDemo
- {
- public static void main(String[] args)
- {
- Properties prop = System.getProperties();
- //因为Properties是HashTable的子类,也就是Map集合的一个子类对象.
- //那么可以通过Map的方法取出该集合中的元素.
- //该集合中存储都是的字符串.没有泛型定义.
- //在系统中自定义一些特有信息
- System.setProperty("mykey","myvalue");
- //获取指定属性信息
- System.out.println(System.getProperty("os.name"));
- /*
- //获取所有属性信息
- for (Object obj : prop.keySet())
- {
- String value = (String)prop.get(obj);
- System.out.println(obj+"::"+value);
- }
- */
- }
- }
Runtime
- /*
- Runtime对象
- 该类并没有提供构造函数.
- 说明不可以new对象,那么会直接想到该类的方法都是静态的.
- 发现该类中还有非静态方法.
- 说明该类中肯定会提供了方法获取本类对象,该方法是静态,返回值是本类类型.
- 由这个特点可以看出该类使用了单例设计模式完成.
- 该方式是static Runtime getRuntime()
- */
- class RuntimeDemo
- {
- public static void main(String[] args) throws Exception
- {
- Runtime r = Runtime.getRuntime();
- Process p = r.exec("D:\\Program Files\\Baidu\\BaiduPlayer\\1.19.0.110\\BaiduPlayer.exe");
- r.exec("notepad Helloworld.java");
- c
- p.destroy();
- }
- }
Date:
- import java.util.Date;
- import java.text.*;
- class DateDemo
- {
- public static void main(String[] args)
- {
- Date d = new Date();
- System.out.println(d);
- //将模式封装到SimpleDateFormat对象中
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日E hh:mm:ss");
- //调用format方法让模式格式化指定date对象
- String time = sdf.format(d);
- System.out.println("时间:"+time);
- }
- <strong>}</strong>
Calendar:类是一个抽象类,它为特定瞬间与一组诸如 YEAR
、MONTH
、DAY_OF_MONTH
、HOUR
等日历字段
之间的转换提供了一些方法
- /*
- 两个练习:
- 1.获取任意年的二月有多少天.
- 2.获取昨天的现在这个时刻.
- */
- import java.util.*;
- class CalendarDemo2
- {
- public static void main(String[] args)
- {
- Calendar c = Calendar.getInstance();
- //c.set(2014,2,23);
- c.add(Calendar.MONTH,5);
- printCalendar(c);
- }
- public static void printCalendar(Calendar c)
- {
- //查表法
- String[] mon = {"一月","二月","三月","四月"
- ,"五月","六月","七月","八月",
- "九月","十月","十一月","十二月"};
- int index = c.get(Calendar.MONTH);
- String[] week = {"","星期日","星期一","星期二","星期三","星期四"
- ,"星期五","星期六"};
- int index2 = c.get(Calendar.DAY_OF_WEEK);
- System.out.println(c.get(Calendar.YEAR)+"年");
- System.out.println(mon[index]);
- System.out.println(c.get(Calendar.DAY_OF_MONTH)+"日");
- System.out.println(week[index2]);
- /*
- Date d = new Date();
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
- String s = sdf.format(d);
- System.out.println(s);
- */
- }
- }
Math:类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数
- /*
- 练习:给定一个小数.
- 保留该小数的后两位.
- */
- import java.util.*;
- class MathDemo
- {
- public static void main(String[] args)
- {
- Random r = new Random();
- for(int x=0; x<10; x++)
- {
- //double d = (int)(Math.random()*10);//取随机数
- int i = r.nextInt(10);//取0到10之间的随机数,不包含10
- System.out.println(d);
- }
- }
- public static void show()
- {
- double d = Math.ceil(12.34);//返回大于指定数字的最小整数
- double d1 = Math.floor(12.34);//返回小于指定数字的最小整数
- long l = Math.round(12.34);//四舍五入
- double d2 = Math.pow(2,3);
- System.out.println(d);
- System.out.println(d1);
- System.out.println(l);
- System.out.println(d2);
- }
- }