黑马程序员 java 基础 毕向东 面向对象 集合框架 List Set

时间:2023-02-11 12:31:27
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 黑马程序员 java 基础 毕向东 面向对象 集合框架 黑马程序员 java 基础 毕向东 面向对象 集合框架 List Set
黑马程序员 java 基础 毕向东 面向对象 集合框架 List Set

1:集合Collection概述  and 共性方法 and 迭代器引述

黑马程序员 java 基础 毕向东 面向对象 集合框架 List Set
集合存储地址 黑马程序员 java 基础 毕向东 面向对象 集合框架 List Set
package day14Collection;

import java.util.ArrayList;
import java.util.Iterator;
/*
* 1:
1:add方法的参数类型是Object(泛型)
以便于接收任意类型对象。
2:集合中存储的都是对象的引用 (地址)

什么是迭代器呢?
集合取出元素的方式

*/
public class CollectionDemo {

public static void main(String[] args) {

//methon_2();
methon_get();
}

static void sop(Object o){
System.out.println(o);
}

static void methon_get(){
ArrayList a1=new ArrayList();
a1.add("java1");
a1.add("java1");
a1.add("java2");
a1.add("java3");
a1.add("java4");
/*------------------------------------*/
Iterator it=a1.iterator();
/*
* 获取迭代器,用于获取集合 的元素
*
* */
while (it.hasNext()) {
sop(it.next());
}
sop("=================");

/*------------------------------------*/
for (Object object : a1) {
sop(object);
}
/*------------------------------------*/

sop("=================");
//相比于while for循环在运行结束后 迭代器对象被释放
for (Iterator iterator = a1.iterator(); iterator.hasNext();) {
sop(iterator.next());
}
/*------------------------------------*/
}
static void methon_2(){

ArrayList a1=new ArrayList();
a1.add("java1");
a1.add("java1");
a1.add("java2");
a1.add("java3");
a1.add("java4");

ArrayList a2=new ArrayList();
a2.add("java1");
a2.add("java2");
//a2.add("java3");
a2.add("java4");

//sop("a1"+a1);
//sop("a2"+a2);
//sop(a1.retainAll(a2));//取交集,保留a2中存在的元素
//sop("a1"+a1);
//sop("a2"+a2);
/*-----------------------------------*/
//sop("a1"+a1);
//sop("a2"+a2);
//sop(a1.removeAll(a2));//取交集,保留a2中存在的元素
//sop("a1"+a1);
//sop("a2"+a2);

/*-----------------------------------*/
sop("a1"+a1);
sop("a2"+a2);
sop(a1.addAll(a2));//取交集,保留a2中存在的元素
sop("a1"+a1);
sop("a2"+a2);

}
static void methon_base(){
//创建一个集合容器,使用Collection接口子类ArrayList
ArrayList arrayList1=new ArrayList();
// 1 添加元素
arrayList1.add("java1");
arrayList1.add("java1");
arrayList1.add("java2");
arrayList1.add("java3");
arrayList1.add("java4");
arrayList1.add(1);
//打印集合
sop(arrayList1);
//2获取个数,集合长度
sop("arrayList1.size():"+arrayList1.size());
//3 删除 元素
arrayList1.remove("java1");
sop("delete:"+arrayList1);

//arrayList1.clear();
//sop("clear:"+arrayList1);
//4 判断元素
sop("java1是否存在"+arrayList1.contains("java1"));
sop(arrayList1);
arrayList1.clear();
sop("集合是否为空"+arrayList1.isEmpty());

sop(arrayList1);

}

}

2 Collection---->List 类 特点 和 增删查改方法  and 特有迭代器ListIterator

黑马程序员 java 基础 毕向东 面向对象 集合框架 List Set
package day14Collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;


public class ListDemo {
/*
* Collection
* |--List:特点:元素是有序,同时元素可以重复。因为该集合体系有索引
* |--ArrayList :底层的数据结构使用数组结构:特点在于查询速度快,增、删、插入麻烦 。线程不同步
* |--LinkedList:底层使用链表数据结构:特点:增删快,查询慢
* |--Vector :底层是数组数据结构。Vector是同步的。被ArrayList 替代
* |--Set 特点:元素是无序,同时元素不可以重复。因为该集合体系没有索引
*List 特有方法:凡是可以操作角标的方法都是该体系特有方法
*增 add(inde.element)
*add(index,Collection)
*删 remove(index)
*改set(index,element)
*查get(index)
*subList(from,to)
*listIterator();
*
*list 集合特有的迭代器
*ListIterator 是Iterator的子接口
*在迭代时不可以通过集合 对象的方法操作集合中的元素
*因为会发生集合并发修改异常
*所以需要在迭代时只能用迭代器的方法操作元素
*可以Iterator的操作方法有限,只能进行判断取出删除的操作
*如果要添加,修改等操作,就应该使用其子接口ListIterator
*该接口只能通过List结合的listIterator()获取
*实现在遍历过程中修改等
* */
public static void main(String[] args) {
//演示列表迭代器
ArrayList a1=new ArrayList();
a1.add("java22");
a1.add("java23");
a1.add("java24");
a1.add("java25");
//在迭代过程中,准备往列表中添加或者删除元素
//Iterator it=a1.iterator();
/*
while (it.hasNext()) {
Object object = (Object) it.next();
if (object.equals("java22")) {
a1.add("java08");
// java.util.ConcurrentModificationException 并发修改异常
}
}
*/
sop(a1);
//while (it.hasNext()) {
//Object object = (Object) it.next();
//if (object.equals("java22")) {
////将java22的引用从集合中删除了
//it.remove();
//}
//}
//sop(a1);

ListIterator li=a1.listIterator();
while (li.hasNext()) {
Object object=li.next();
if (object.equals("java22")) {
//li.add("java009");
li.set("java009");
}
}
while (li.hasPrevious()) {
Object object = (Object) li.previous();
sop(object);

}
sop("hasNext:"+li.hasNext());
sop("hasPrevious:"+li.hasPrevious());
sop("hasNext:"+li.hasNext());
sop(a1);
}
static void method(){
ArrayList a1=new ArrayList();
//添加元素
a1.add("java11");
a1.add("java12");
a1.add("java13");
sop("原来集合"+a1);
//在指定位置添加元素
a1.add(2,"java2");
sop("添加后集合"+a1);
//删除指定位置的元素
a1.remove(1);
sop("删除后集合"+a1);
//修改元素
a1.set(2, "java111");
sop("修改后集合"+a1);

//通过角标获取
a1.get(1);
sop(a1.get(1));

//获取所有元素
for (int i = 0; i < a1.size(); i++) {
sop("a1.get(i):--》"+a1.get(i));
}
for (Iterator iterator = a1.iterator(); iterator.hasNext();) {
sop(iterator.next());
}
//通过indexOf 获取对象位置
sop("a1.indexOf(java11)"+a1.indexOf("java11"));
//通过subList 获取子List
List l2=a1.subList(0,2);
sop("a1.subList(1,2)"+a1.subList(0,2));
}
static void sop(Object o){
System.out.println(o);
}

}



3 Vector 中枚举

package day14Collection;

import java.util.Enumeration;
import java.util.Vector;
/*
* 枚举 就是Vector的特有取出方式
* 迭代器
* 枚举
* get
* 发现枚举和迭代器很像
* 其实两者是一样的
*
* 因为枚举的名称和方法名过长
* 所以被迭代器取代了
* 枚举郁郁而终*/
public class VectorDemo {

public static void main(String[] args) {
Vector vector=new Vector();
vector.add("java1");
vector.add("java2");
vector.add("java3");

sop(vector);
Enumeration e=vector.elements();
while (e.hasMoreElements()) {
Object object = (Object) e.nextElement();
sop(object);
}
}
static void sop(Object o){
System.out.println(o);
}
}


4 Collection-->List -->LinkedList 介绍 

package day14Collection;

import java.util.Iterator;
import java.util.LinkedList;
/*
* LinkedList 特有方法
* addFrist();
* addLaot();
*
* getFirst();
* getLast();
* 获取元素。但不删除元素
*
* removeFirst();
* removeLast();
* 获取元素,并删除元素
* 如果集合中没有元素,抛出NoSuchElementException
* 在jdk 1.6 之后出现了替代
* pollFirst()
*
* peekFirst();
* offerFirst
* */
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList l=new LinkedList();
l.add(1);
l.add(2);
l.add(3);
l.add(4);
l.addFirst("add Frist");
sop(l);
sop("l.getFirst():"+l.getFirst());
sop("l.get(2):"+l.get(2));
sop(l.removeFirst());
sop(l.size());
//while (!l.isEmpty()) {
//sop("l.removeFirst()"+l.removeFirst());
//}
sop("------");
for (Iterator iterator = l.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
sop("object:"+object);
}
}
static void sop(Object o){
System.out.println(o);
}
}

5 LinkedList 练习

package day14Collection;

import java.util.LinkedList;

public class LinkedListTest {
/*
* 使用LinkedList
* 模拟堆栈或者队列数据结构
*
* 堆栈:先进后出 如同杯子
* 队列:先进先出 如同管道*/
public static void main(String[] args) {
Duilie duilie=new Duilie();
duilie.addFirst("java1");
duilie.addFirst("java2");
duilie.addFirst("java3");
duilie.addFirst("java4");

sop(duilie.getLast());
while (!duilie.isEmpty()) {
sop(duilie.getLast());
}
}
static void sop(Object o){
System.out.println(o);
}
}
class Duilie{
private LinkedList link;
public Duilie() {
link=new LinkedList();
}
public void addFirst(Object o) {
link.addFirst(o);
}
public Object getLast() {
return link.removeLast();
}
public boolean isEmpty() {
return link.isEmpty();
}
}

6 ArrayList  练习 去掉重复元素if (!newAl.contains(object)) {newAl.add(object);}
<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">package day14Collection;</span>

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

public class ArrayListTest {
/*
* 去除ArrayList中的重复元素*/
public static void main(String[] args) {

ArrayList arrayList=new ArrayList();
arrayList.add("java1");
arrayList.add("java1");
arrayList.add("java1");
arrayList.add("java2");
arrayList.add("java3");
arrayList.add("java4");
Iterator i=arrayList.iterator();
while (i.hasNext()) {
Object object = (Object) i.next();
sop(i.next());
//迭代时 循环中 只调用一次,就用hasNext 判断一次
}
/*
* */
sop(arrayList);
sop(singleElement(arrayList));
}
public static ArrayList singleElement(ArrayList al) {
ArrayList newAl=new ArrayList();
Iterator i=al.iterator();
while (i.hasNext()) {
Object object = (Object) i.next();
sop(object);
if (!newAl.contains(object)) {
newAl.add(object);
}
}
return newAl;
}
static void sop(Object o){
System.out.println(o);
}
}

7 ArrayList 练习 自定义要存储的对象 and 去除重复元素(核心:集合判断元素是否相同,依据就是元素的equals方法)


package day14Collection;

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

import com.sun.org.apache.bcel.internal.generic.NEW;

public class ArrayListTest2 {
/*
* 将 自定义对象作为元素
* 存储到ArrayLIst集合中
* 并去除重复元素
* 比如 人对象,同姓名同年龄看做重复
*
* 思路:
* 1:对人描述,将数据封装
* 2:定义容器,存入
* 3:去除重复
* List 集合判断元素是否相同,依据就是元素的equals方法
* */
public static void main(String[] args) {
ArrayList al=new ArrayList();
al.add(new Person2("lisi1", 31));
al.add(new Person2("lisi1", 31));
al.add(new Person2("lisi2", 32));
al.add(new Person2("lisi3", 33));
al.add(new Person2("lisi4", 34));
al =singleElement(al);
Iterator iterator=al.iterator();
while (iterator.hasNext()) {
Person2 person2 = (Person2) iterator.next();
sop("person2.getName():"+person2.getName()+"person2.getAge():"+person2.getAge());
}

sop("al.remove new :"+al.remove(new Person2("lisi1", 31)));
}
static void sop(Object o){
System.out.println(o);
}
public static ArrayList singleElement(ArrayList al) {
ArrayList newAl=new ArrayList();
Iterator i=al.iterator();
while (i.hasNext()) {
Person2 p = (Person2) i.next();
//sop(p);
System.out.println("------->contains");
if (!newAl.contains(p)) {
newAl.add(p);
}
}
return newAl;
}

}
class Person2{
private String name;
private int age;
public Person2(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public boolean equals(Object object) {
System.out.println("---->equals");
if(!(object instanceof Person2)) {
return false;
}
Person2 p=(Person2) object;
return this.name.equals(p.getName())&&this.name==(p.getName());
}
}

8 HashSet 简介(元素唯一,无序,底层数据结构为哈希表)黑马程序员 java 基础 毕向东 面向对象 集合框架 List Set


package day14Collection;

import java.util.HashSet;
import java.util.Iterator;

public class HashSetDemo {

/**
* --Set 特点:元素是无序,同时元素不可以重复。因为该集合体系没有索引
* |--HashSet:底层数据结构式哈希表
* |--TreeSet:
* 元素无序 :也就是存入和取出元素的顺序不一定一致,元素不可以重复
*set 集合的功能和Collection 是一致的
*
*/
public static void main(String[] args) {
//Demo d1=new Demo();
//Demo d2=new Demo();
//sop(d1);
//sop(d2);
HashSet hs=new HashSet();
sop(hs.add("java01"));
sop(hs.add("java01"));
hs.add("java01");
hs.add("java02");
hs.add("java03");
hs.add("java04");
for (Iterator iterator = hs.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
sop("hs:"+object);
}
}
static void sop(Object o){
System.out.println(o);
}
}
//class Demo{
//public int hashCode() {
//return 60;
//
//}
//}

9  Hashset  练习  存入自定义对象 年龄相同视为相同元素(核心:HashSet 实现元素唯一的原理依赖于 hashCode() 和 equals())

package day14Collection;

import java.util.HashSet;
import java.util.Iterator;


public class HashSetTest {

/**
*向HashSet 存入自定义对象
*姓名年龄相同视为相同元素
*
*HashSet 如何保证元素唯一性的呢???
*通过元素是两个方法看,hashCode 和equals方法
*如果hashCode相同,会判断equals是否为true
*如果hashCode不同,不会调用equals
在java的集合中,判断两个对象是否相等的规则是:
1:判断两个对象的hashCode是否相等
如果不相等,认为两个对象也不相等,完毕
如果相等,转入2)
2:判断两个对象用equals运算是否相等
如果不相等,认为两个对象也不相等
如果相等,认为两个对象相等(equals()是判断两个对象是否相等的关键)

注意:
对于元素是否存在,已经删除操作。
依赖的方法是:hashCode和equals方法
ArrayList 依赖equals
而Hashset 依赖 hashCode和equals
*/
public static void main(String[] args) {
HashSet hs=new HashSet();
hs.add(new Person3("a1",11));
hs.add(new Person3("a2",12));
hs.add(new Person3("a3",13));

sop("-->"+hs.contains(new Person3("a2",12)));
sop("remove:--->"+hs.remove(new Person3("a2",12)));
sop("remove:--->"+hs.remove(new Person3("a3",13)));
sop("remove:--->"+hs.remove(new Person3("a1",11)));
for (Iterator iterator = hs.iterator(); iterator.hasNext();) {
Person3 object = (Person3) iterator.next();
sop("object.getName():"+object.getName()+"---object.getAge():"+object.getAge());
}
}
static void sop(Object o){
System.out.println(o);
}

}
class Person3{
private String name;
private int age;
public Person3(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public boolean equals(Object object) {
System.out.println(this.name+"---->equals"+this.age);
if(!(object instanceof Person3)) {
return false;
}
Person3 p=(Person3) object;
return this.name.equals(p.getName())&&this.age==p.getAge();
}
//public boolean equals(Object obj) {
//System.out.println("equals:>>this:"+this+"---obj"+obj);
// return (this == obj);
// }
public int hashCode() {
System.out.println("hashCode:>>"+this.name+"--------"+this.age);
return 60;

}
}

10 TreeSet  有序 ,唯一,底层数据结构为二叉树/红黑树 ;存入的对象需要实现Comparable接口  或者  TreeSet(Compartor c)唯一依赖于compareTo 方法 return  0

黑马程序员 java 基础 毕向东 面向对象 集合框架 List Set
黑马程序员 java 基础 毕向东 面向对象 集合框架 List Set
</pre><pre code_snippet_id="471367" snippet_file_name="blog_20140919_12_4620803" name="code" class="java">package day14Collection;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetDemo {
/*
* Set 无序 不可以重复
* |————Hashset :数据结构式哈希表,线程非同步
* 保证元素唯一性的原理是:
* 判断元素的hashCode是否相同
* 如果相同,判断equals方法
* |————TresSet:
* 可以对set集合中的元素进行排序
* 底层数据结构二叉树
* 保证元素唯一性的依据是:
* compareTo 方法 return 0;
* TreeSet 排序方式是
* 让元素自身具有比较性
* 元素需要实现Comparable接口
* 覆盖CompareTo 方法
* 这种方式也称为元素 是自然顺序或者默认顺序。
*
* TreeSet第二种排序方式
* 当元素自身不具备比较性时,或者具备的不是不是需要的比较性时:
* 这是需要让集合本身具有比较性
* 在集合初始化时具有比较方式
* 让让排序参与构造函数
*
* 需求:
* 向TreeSet集合中存储自定义对象 学生
* 想按照学生的年龄进行排序
* Treeset排序时:
* 当主要条件相同时,一定判断一下次要条件
*
* 怎么存 然后怎么取:
* 将CompareTo(Object c){
* return 1;
* }
*
* */
public static void main(String[] args) {
TreeSet ts=new TreeSet();
//ts.add("cba");
//ts.add("abcd");
//ts.add("aaa");
//ts.add("bca");
//ts.add("2");
//ts.add("1");
sop(ts.add(new Student("lisi1",22)));
sop(ts.add(new Student("lisi2",23)));
sop(ts.add(new Student("lisi3",24)));
sop(ts.add(new Student("lisi4",24)));
sop(ts.add(new Student("lisi4",24)));
/* java.lang.ClassCastException:
* day14Collection.Student
cannot be cast to java.lang.Comparable*/
for (Iterator iterator = ts.iterator(); iterator.hasNext();) {
Student object = (Student) iterator.next();

sop("getAge:"+object.getAge()+"--getName:"+object.getName());
}
}
static void sop(Object o){
System.out.println(o);
}
}

class Student implements Comparable{
//Comparable 让实现它的类具有比较性
private String name;
private int age;
public Student(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Object o) {
if(!(o instanceof Student))
throw new RuntimeException("不是学生对象");
Student s=(Student) o;

System.out.println(this.name+":compara:"+s.name);
if(this.age>s.getAge())
return 1;
else{
if(this.age<s.getAge())
return -1;
}
return this.name.compareTo(s.name);
}
}


11 TreeSet  当元素自身不具备比较性  或者具备的不是需要的比较性,这是让容器自身具有比较性

package day14Collection;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetDemo2 {
/*
* 当元素自身不具备比较性
* 或者具备的不是需要的比较性
*
* 这是让容器自身具有比较性
*
* 这时定义比较器
* 将比较器对象作为构造函数参数进行构造
*
* 当两种方式同时存在时
* 以比较器为主
* 定义一个类
* 实现Comparator接口, 实现compare方法
*
* */
public static void main(String[] args) {

TreeSet ts=new TreeSet(new MyCompare());
ts.add(new Student2("lisi02",22));
ts.add(new Student2("lisi02",21));
ts.add(new Student2("lisi007",20));
ts.add(new Student2("lisi09",19));
ts.add(new Student2("lisi06",18));
ts.add(new Student2("lisi06",18));
ts.add(new Student2("lisi007",29));
for (Iterator iterator = ts.iterator(); iterator.hasNext();) {
Student2 object = (Student2) iterator.next();

sop("getAge:"+object.getAge()+"--getName:"+object.getName());
}
}
static void sop(Object o){
System.out.println(o);
}
}
class MyCompare implements Comparator{
public int compare(Object o1, Object o2) {
Student2 s1=(Student2) o1;
Student2 s2=(Student2) o2;
int m=s1.getName().compareTo(s2.getName());
if(m==0)
return Integer.valueOf(s1.getAge()).compareTo(Integer.valueOf(s2.getAge()));
return m;
}

}
class Student2 implements Comparable{
private String name;
private int age;
public Student2(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Object o) {
if(!(o instanceof Student2))
throw new RuntimeException("不是学生对象");
Student2 s=(Student2) o;

System.out.println(this.name+":compara:"+s.name);
if(this.age>s.getAge())
return 1;
else{
if(this.age<s.getAge())
return -1;
}
return this.name.compareTo(s.name);
}
}


12 自定义对象具有比较性  存储器也具有比较性

package day14Collection;
import java.util.*;

/*
当元素自身不具备比较性,或者具备的比较性不是所需要的。
这时需要让容器自身具备比较性。
定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。

当两种排序都存在时,以比较器为主。

定义一个类,实现Comparator接口,覆盖compare方法。


*/
class Student3 implements Comparable//该接口强制让学生具备比较性。
{
private String name;
private int age;

Student3(String name,int age)
{
this.name = name;
this.age = age;
}

public int compareTo(Object obj)
{

//return 0;

if(!(obj instanceof Student3))
throw new RuntimeException("不是学生对象");
Student3 s = (Student3)obj;

//System.out.println(this.name+"....compareto....."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
{
return this.name.compareTo(s.name);
}
return -1;
/**/
}

public String getName()
{
return name;

}
public int getAge()
{
return age;
}
}
public class TreeSetDemo22
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new MyCompare3());

ts.add(new Student3("lisi02",22));
ts.add(new Student3("lisi02",21));
ts.add(new Student3("lisi007",20));
ts.add(new Student3("lisi09",19));
ts.add(new Student3("lisi06",18));
ts.add(new Student3("lisi06",18));
ts.add(new Student3("lisi007",29));
//ts.add(new Student3("lisi007",20));
//ts.add(new Student3("lisi01",40));

Iterator it = ts.iterator();
while(it.hasNext())
{
Student3 stu = (Student3)it.next();
System.out.println(stu.getName()+"..."+stu.getAge());
}
}
}

class MyCompare3 implements Comparator
{
public int compare(Object o1,Object o2)
{
Student3 s1 = (Student3)o1;
Student3 s2 = (Student3)o2;

int num = s1.getName().compareTo(s2.getName());
//if(num==0)
//{
//
//return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
///*
//if(s1.getAge()>s2.getAge())
//return 1;
//if(s1.getAge()==s2.getAge())
//return 0;
//return -1;
//*/
//}


return num;

}
}


13TreeSet 练习 按照字符长度进行排序

package day14Collection;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class TreeSetTest {
/*
* 练习 按照字符长度进行排序
*
* 字符串本身具有比较性
* 但是他的方式不是需要的*/
public static void main(String[] args) {
TreeSet ts=new TreeSet(new StringLengthComparator());
ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("a");
ts.add("hahaha");
for (Iterator iterator = ts.iterator(); iterator.hasNext();) {
String object = (String) iterator.next();
sop(object);
}
}
static void sop(Object o){
System.out.println(o);
}
}
class StringLengthComparator implements Comparator{

public int compare(Object o1, Object o2) {
String s1=(String) o1;
String s2=(String) o2;
int num=new Integer(s1.length()).compareTo(new Integer(s2.length()));
if(num==0)
return s1.compareTo(s2);
return num;

}

}



14  泛型简介 类型安全机制 <> 定义
</pre></h1><div><pre code_snippet_id="471367" snippet_file_name="blog_20140919_17_3562837" name="code" class="java">package day14Collection;

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

public class GenericDemo {
/*
* 泛型
* JDK1.5版本以后出现新特性
* 用于解决安全问题,是一个类型安全机制
* 好处:
* 1:将运行时问题转移到编译时期
* 2:避免了强制转换
* 类型安全机制
*
* 泛型的格式:
* 通过 <> 定义要操作 的数据类型
*
* 在使用java对象时,何时使用泛型
* 通常在集合框架中很常见
*
* 只有见到 <> 就使用泛型
*
* 其实 <>就是定义接受类型的
*
* 当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
* */
public static void main(String[] args) {
ArrayList<String> al=new ArrayList<String>();
al.add("abc01");
al.add("abc01");
al.add("abc01");
al.add("abc0991");
al.add("abc014");
for (Iterator<String> iterator = al.iterator(); iterator.hasNext();) {
String object = iterator.next();
sop("长度:"+object.length());
}
}
static void sop(Object o){
System.out.println(o);
}

}

15 泛型Generic 示例

package day14Collection;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class GenericDemo2 {
public static void main(String[] args) {
TreeSet<String> ts=new TreeSet<String>(new StringLengthComparator2());
ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("a");
ts.add("hahaha");
for (Iterator<String> iterator = ts.iterator(); iterator.hasNext();) {
sop( iterator.next());
}
}
static void sop(Object o){
System.out.println(o);
}
}
class StringLengthComparator2 implements Comparator<String>{
@Override
public int compare(String o1, String o2) {
int num=new Integer(o1.length()).compareTo(new Integer(o2.length()));
if(num==0)
return o1.compareTo(o2);
return num;
}

}


15 使用泛型场景之一当 类中要操作的类类型不确定时(早期定义Object来完成扩展)

package day14Collection;

public class GenericDemo3 {
/*什么时候需要泛型
*
* 当 类中要操作的类类型不确定时
* 早期定义Object来完成扩展
*
* 现在定义泛型类来完成扩展
* */
public static void main(String[] args) {
Utils<Worker> t=new Utils<Worker>();
t.setT(new Worker());
//t.setT(new Student4());编译错误
Worker w=t.getT();
}

}
class Worker{

}
class Student4{

}

//泛型类

class Utils<T>{
private T t;

public T getT() {
return t;
}

public void setT(T t) {
this.t = t;
}

}
//class Tool{
//泛型之前的做法
//private Object obj;
//
//public Object getObj() {
//return obj;
//}
//
//public void setObj(Object obj) {
//this.obj = obj;
//}
//}
//class Tool{
//private Worker w;
//
//public Worker getW() {
//return w;
//}
//
//public void setW(Worker w) {
//this.w = w;
//}
//}

16 泛型定义范围  类   or 方法

package day14Collection;

public class GenericDemo4 {
/*泛型类定义的泛型,在整个类中有效。如果被方法使用,
那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。
为了让不同方法可以操作不同类型,而且类型还不确定。
静态方法不可以访问类上定义的泛型。
如果静态方法操作的应用数据类型不确定
那么可以将泛型定义在方法上。 * */public static void main(String[] args) {//Demo<String> d=new Demo<String>();//d.show("haha");//d.print("hwhh");Demo<Integer> d=new Demo<Integer>();//Demo d=new Demo();d.show(new Integer(4));d.print(4);//自动装箱//d.show("haha");d.print("hwhh");Demo.method(d);}}//class Demo<T>{//public void show(T t){//System.out.println("show:"+t);//}//public void print(T t){//System.out.println("print:"+t);//}////}//class Demo{//public <T> void show(T t){//System.out.println("show:"+t);//}//public <T> void print(T t){//System.out.println("print:"+t);//}////}class Demo <T>{public  void show(T t){System.out.println("show:"+t);}public <Q> void print(Q t){System.out.println("print:"+t);}public static <W> void method(W w){System.out.println("method:"+w);//Cannot make a static reference to the non-static type T//静态方法不可以方法类上定义的泛型//如果静态操作的应用数据类型不确定 ,可以定义在方法上}}

17  泛型定义在接口

package day14Collection;

public class GenericDemo5 {
/*
* 泛型定义在接口上
* */
public static void main(String[] args) {
InterImpl<String> i=new InterImpl<String>();
i.show("haha");
}

}
interface Inter<T>{
void show(T t);
}
//class InterImpl implements Inter<String>{
//public void show(String t) {
//System.out.println("show:"+t);
//}
//
//}

class InterImpl<T> implements Inter<T> {
public void show(T t) {
System.out.println("show:" + t);
}
}

18泛型限定  范围 。向上限定 ? extends  E 可以接受E 或者E类型的子类 and 向下限定 ? super    E 可以接受E 或者E类型的父类

package day14Collection;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class GenericDemo6 {
/*
* ? 通配符。占位符
* 泛型限定
*
* 向上限定 ? extends E 可以接受E 或者E类型的子类
* 向下限定 ? super E 可以接受E 或者E类型的父类*/
public static void main(String[] args) {
//ArrayList<String> al=new ArrayList<String>();
//al.add("abc1");
//al.add("abc2");
//al.add("abc3");
//pingtColl(al);
//
//ArrayList<Integer> all=new ArrayList<Integer>();
//all.add(3);
//all.add(2);
//all.add(1);
//pingtColl(all);//编译错误

ArrayList<Person> al=new ArrayList<Person>();
al.add(new Person("abc1"));
al.add(new Person("abc2"));
al.add(new Person("abc3"));
pingtColl(al);

ArrayList<Student5> all=new ArrayList<Student5>();
al.add(new Student5("abc1"));
al.add(new Student5("abc2"));
al.add(new Student5("abc3"));

pingtColl(all);//编译失败


}
public static void pingtColl(ArrayList<? extends Person> al) {
for (Iterator<? extends Person> iterator = al.iterator(); iterator.hasNext();) {

System.out.println("pingtColl:"+iterator.next().getName());
}
}
//public static void pingtColl(ArrayList<?> al) {
//for (Iterator<?> iterator = al.iterator(); iterator.hasNext();) {
//System.out.println("pingtColl:"+iterator.next());
////System.out.println("pingtColl:"+iterator.next().lentgh());编译错误
//}
//}
//public static <T> void pingtColl(ArrayList<T> al) {
//for (Iterator<T> iterator = al.iterator(); iterator.hasNext();) {
//
//System.out.println("pingtColl:"+iterator.next());
//}
//}
}
class Person{
private String name;
public Person(String name){
this.name=name;

}
public String getName() {
return name;
}

}
class Student5 extends Person{
public Student5(String name){
super(name);
}

}
package day14Collection;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class GenericDemo6 {
/*
* ? 通配符。占位符
* 泛型限定
*
* 向上限定 ? extends E 可以接受E 或者E类型的子类
* 向下限定 ? super E 可以接受E 或者E类型的父类*/
public static void main(String[] args) {
//ArrayList<String> al=new ArrayList<String>();
//al.add("abc1");
//al.add("abc2");
//al.add("abc3");
//pingtColl(al);
//
//ArrayList<Integer> all=new ArrayList<Integer>();
//all.add(3);
//all.add(2);
//all.add(1);
//pingtColl(all);//编译错误

ArrayList<Person> al=new ArrayList<Person>();
al.add(new Person("abc1"));
al.add(new Person("abc2"));
al.add(new Person("abc3"));
pingtColl(al);

ArrayList<Student5> all=new ArrayList<Student5>();
al.add(new Student5("abc1"));
al.add(new Student5("abc2"));
al.add(new Student5("abc3"));

pingtColl(all);//编译失败


}
public static void pingtColl(ArrayList<? extends Person> al) {
for (Iterator<? extends Person> iterator = al.iterator(); iterator.hasNext();) {

System.out.println("pingtColl:"+iterator.next().getName());
}
}
//public static void pingtColl(ArrayList<?> al) {
//for (Iterator<?> iterator = al.iterator(); iterator.hasNext();) {
//System.out.println("pingtColl:"+iterator.next());
////System.out.println("pingtColl:"+iterator.next().lentgh());编译错误
//}
//}
//public static <T> void pingtColl(ArrayList<T> al) {
//for (Iterator<T> iterator = al.iterator(); iterator.hasNext();) {
//
//System.out.println("pingtColl:"+iterator.next());
//}
//}
}
class Person{
private String name;
public Person(String name){
this.name=name;

}
public String getName() {
return name;
}

}
class Student5 extends Person{
public Student5(String name){
super(name);
}

}

19  泛型限定示例


package day14Collection;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class GenericDemo7 {
/*
* */
public static void main(String[] args) {
TreeSet<Student7> ts=new TreeSet<Student7>(new Comp());
ts.add(new Student7("abc3"));
ts.add(new Student7("abc2"));
ts.add(new Student7("abc6"));
ts.add(new Student7("abc1"));
ts.add(new Student7("abc3"));
for (Iterator<Student7> iterator = ts.iterator(); iterator.hasNext();) {
Student7 student7 = (Student7) iterator.next();
System.out.println(student7.getName());
}

TreeSet<Worker7> ts1=new TreeSet<Worker7>(new Comp());
ts1.add(new Worker7("abc3"));
ts1.add(new Worker7("abc2"));
ts1.add(new Worker7("abc6"));
ts1.add(new Worker7("abc1"));
ts1.add(new Worker7("abc3"));
for (Iterator<Worker7> iterator = ts1.iterator(); iterator.hasNext();) {
Worker7 w = (Worker7) iterator.next();
System.out.println(w.getName());
}
}

}
class Person7{
private String name;
public Person7(String name){
this.name=name;

}
public String getName() {
return name;
}

}
class Student7 extends Person7{
public Student7(String name){
super(name);
}

}
class Worker7 extends Person7{
public Worker7(String name) {
super(name);
}
}
class Comp implements Comparator< Person7>{
public int compare(Person7 o1, Person7 o2) {
return o1.getName().compareTo(o2.getName());
}
}

《黑马程序员 java 基础 毕向东 面向对象 集合框架》
介绍了java中的集合框架,让我对集合框架组成有了初步了解,掌握了一下集合处理方法,而泛型也是其中非常重要的部分,对于程序安全有着重要的判定作用