一、Set接口

//HashSet综合举例
import java.util.*;
public class Test{
public static void main(String[] args){
Set<Name> s = new HashSet<Name>();
s.add(new Name("Li","Ming"));
s.add(new Name("Sun","Lei"));
s.add(new Name("Li","Li"));
System.out.println(s.remove(new Name("Li","Ming")));//equals()方法比较相等不能移除,需要重写hashCode()
System.out.println(s);//无序的!
/*
Iterator t = s.iterator();
while(t.hasNext()){
System.out.println(t.next());
t.remove();
}
System.out.println(s);
*/
//交集、并集
Set<Name> s2 = new HashSet<Name>();
s2.add(new Name("Li","M"));
s2.add(new Name("Sun","Lei"));
s2.add(new Name("Li","Li"));
Set<Name> sj = new HashSet<Name>(s);
sj.retainAll(s2);//交集
System.out.println(sj);
Set<Name> sb = new HashSet<Name>(s);
sb.addAll(s2);
System.out.println(sb);//并集
}
}
class Name{
String fn;
String ln;
public Name(String fn, String ln){
this.fn = fn ;
this.ln = ln ;
}
public boolean equals(Object o){
if(o instanceof Name){
Name n = (Name)o ;
return this.fn.equals(n.fn)&&this.ln.equals(n.ln) ;
}
return false ;
}
public String toString(){
return fn+" "+ln ;
}
public int hashCode(){
return fn.hashCode();
}
}
  Set集合中的对象不按特定的方式排序,不能包含重复对象。Set容器可以与数学中“集合”的概念相对应。
注意:如果改变一个Set中的可变元素,导致重复,将会出现问题。
  Set集合由Set接口和Set接口的实现类组成。Set接口实现了Collection接口,因此包含Collection接口的所有方法。J2SDK API中所提供的Set容器类有HashSet类,TreeSet类等。
1、HashSet类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证Set的迭代顺序,特别是它不保证该顺序恒久不变。此类允许使用null元素。
2、TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,因此它在遍历集合时按照自然顺序递增排序,也可以按照指定比较器递增排序,即可以通过比较器对TreeSet类实现的Set集合中的对象进行排序。TreeSet类新增方法如下:
举例1:
import java.util.*;  //导入java.util包
public class Test{
public static void main(String args[]){
Set s = new HashSet(); //注意HashSet是无序的,不允许重复的!
s.add("hello");
s.add(new Integer(100));
s.add(new Name("f1","l1"));
s.add("hello");
s.add(new Name("f1","l1"));
System.out.println(s);
}
}
//Name
class Name{
private String firstName;
private String lastName;
public Name(String firstName,String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName(){
return firstName;
}
public String toString(){
return firstName + " " + lastName ;
}
public boolean equals(Object obj) {
if(obj instanceof Name){
Name name = (Name) obj;
return (firstName.equals(name.firstName))&&(lastName.equals(name.lastName));
}
return super.equals(obj);
}
public int hashCode(){
return firstName.hashCode();
}
}
输出:
[hello,100,f1 l1]
注意:Name类应该重写equals()方法。
举例2:
import java.util.*;  //导入java.util包
public class Test{
public static void main(String args[]){
Set s1 = new HashSet(); //注意HashSet是无序的!
Set s2 = new HashSet();
s1.add("a");
s1.add("b");
s1.add("c");
s2.add("d");
s2.add("a");
s2.add("b");
//Set和List容器类都有Constructor(Collection c)构造方法用以初始化容器类
Set sn = new HashSet(s1);
sn.retainAll(s2);//求交集,存入sn
Set su = new HashSet(s1);
su.addAll(s2);//求并集,存入su。注意会自动去重!
System.out.println(sn);
System.out.println(su);
}
}
输出:
[b,a]
[d,b,c,a]

二、List接口

List:
  List集合中的元素允许重复,各个元素的顺序就是对象插入的顺序。类似数组,用户可以使用索引(元素在集合中的位置,从0开始)来访问集合中的元素。
  List集合由List接口和List接口的实现类组成。List接口实现了Collection接口,因此包含Collection接口的所有方法。此外List接口还提供下面方法:
  注意:其中add,remove在Collection接口中有,但是形参不同。Collection接口中的声明如下:
  J2SDK所提供的List容器类有ArrayList,LinkedList等。(相当于数组和链表,但是容器类可以自动调节大小)
1、ArrayList类实现了可变数组,允许元素是NULL。  优点:可根据索引位置对集合进行快速访问。缺点:向指定的索引位置插入对象或删除对象的速度较慢。
2、LinkedList类采用链表结构保存对象。                优点:便于向集合中插入和删除对象。缺点:对于随机访问集合中的元素效率较慢。
  使用List集合时通常声明为List类型,可通过不同的实现类(ArrayList,LinkedList)实例化集合。例如:
List list = new ArrayList();
List list = new LinkedList();
举例1:List中各种新增方法的使用
import java.util.*;
public class Test{
public static void main(String[] args){
List<String> l = new LinkedList<String>();
for(int i=0;i<5;i++){
l.add("a"+i);
}
System.out.println(l);
l.add(3,"a111");
System.out.println(l);
l.set(5,"a11111");
System.out.println(l);
System.out.println(l.get(3));
System.out.println(l.indexOf("a3"));
System.out.println(l.remove(3));
System.out.println(l);
System.out.println(l.remove("a3"));
System.out.println(l);
}
}

输出:

[a0, a1, a2, a3, a4]
[a0, a1, a2, a111, a3, a4]
[a0, a1, a2, a111, a3, a11111]
a111
4
a111
[a0, a1, a2, a3, a11111]
true
[a0, a1, a2, a11111]

 
举例2:
import java.util.*;  //导入java.util包
public class Gather{
public static void main(String args[]){
List list = new ArrayList();
System.out.println(list.size());//
list.add("a");
list.add("b");
list.add("c");
System.out.println(list.size());//
int i = (int)(Math.random()*(list.size()-1));//随机打印
System.out.println("随机获取数组中元素:"+list.get(i));
list.remove(2);
System.out.println(list);//[a,b]
for(int j=0;j<list.size();j++){
System.out.println(list.get(j));//a b
}
}
}

三、Collections类

  类java.util.Collections提供了一些静态方法实现了基于List容器的一些常用算法。
举例:
import java.util.*;  //导入java.util包
public class Test{
public static void main(String args[]){
List l1 = new LinkedList();
for(int i=0;i<=9;i++){
l1.add("a"+i);
}
System.out.println(l1);
Collections.shuffle(l1);//随机排序
System.out.println(l1);
Collections.reverse(l1);//逆序
System.out.println(l1);
Collections.sort(l1);//排序
System.out.println(l1);
System.out.println(Collections.binarySearch(l1,"a5"));//折半查找
}
}

输出:

四、Comparable接口

问题:上面的算法根据什么确定容器中对象的“大小”顺序?
  所有可以“排序”的类都实现了java.lang.Comparable接口,Comparable接口中只有一个方法:public int compareTo(Object obj);该方法:this==obj时返回0,this>obj时返回正数,this<obj时返回负数。
实现了Comparable接口的类通过实现compareTo方法从而确定该类对象的排序方式。
举例:改写Name类,让其实现Comparable接口,其compareTo方法定义为:(String类已经重写了compareTo方法)
import java.util.*;  //导入java.util包
public class Test{
public static void main(String args[]){
List l1 = new LinkedList();
l1.add(new Name("Karl","M"));
l1.add(new Name("Steven","Lee"));
l1.add(new Name("John","o"));
l1.add(new Name("Tom","M"));
System.out.println(l1);
Collections.sort(l1);
System.out.println(l1);
}
}
//Name
class Name implements Comparable{
private String firstName;
private String lastName;
public Name(String firstName,String lastName){
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName(){
return firstName;
}
public String toString(){
return firstName + " " + lastName ;
}
public boolean equals(Object obj) {
if(obj instanceof Name){
Name name = (Name) obj;
return (firstName.equals(name.firstName))&&(lastName.equals(name.lastName));
}
return super.equals(obj);
}
public int hashCode(){
return firstName.hashCode();
} public int compareTo(Object o){
Name n = (Name) o;
int lastCmp = lastName.compareTo(n.lastName);
return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
}
}
输出:

[Karl M, Steven Lee, John o, Tom M]
[Steven Lee, Karl M, Tom M, John o]

 

JAVA笔记19-容器之三 Set接口、List接口、Collections类、Comparable接口(重要)的更多相关文章

  1. Java基础 TreeSet()来实现数组的【定制排序】 : Comparable接口(自然排序) 或者 Comparator接口 (定制排序)

    笔记: //排序真麻烦!没有C++里的好用又方便!ORZ!ORZ!数组排序还还自己写个TreeSet()和( Comparable接口(自然排序) 或者 Comparator接口 (定制排序))imp ...

  2. Java笔记:与系统交互、系统相关的类,Object类

    1.程序与用户交互 (1)运行一个Java程序的时候要给它提供一个main方法入口,这边分析一下这个main方法的签名public static void main(String[] args);pu ...

  3. Thinking in Java——笔记(19)

    Enumerated Types Basic enum features When you create an enum, an associated class is produced for yo ...

  4. Java笔记19:Java匿名内部类

    匿名内部类也就是没有名字的内部类.正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写.但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 例1:不使用匿名内部类来实现抽象方 ...

  5. Java笔记(十八)同步和协作工具类

    同步和协作工具类 一.读写锁ReentrantReadWriteLock ReadWriteLock接口的定义为: public interface ReadWriteLock { Lock read ...

  6. spring测试junit事务管理及spring面向接口注入和实现类单独注入(无实现接口),实现类实现接口而实现类单独注入否则会报错。

    1.根据日志分析,spring junit默认是自动回滚,不对数据库做任何的操作. 18:16:57.648 [main] DEBUG o.s.j.d.DataSourceTransactionMan ...

  7. 转:java多线程--同步容器

    java同步容器 在Java的集合容器框架中,主要有四大类别:List.Set.Queue.Map.List.Set.Queue接口分别继承了Collection接口,Map本身是一个接口.注意Col ...

  8. Java之Comparable接口和Comparator接口

    Comparable & Comparator 都是用来实现集合中元素的比较.排序的: Comparable 是在集合内部定义的方法实现的排序: Comparator 是在集合外部实现的排序: ...

  9. java中Collection容器

    1.容器(Collection)也称为集合, 在java中就是指对象的集合. 容器里存放的都只能是对象. 实际上是存放对象的指针(头部地址): 这里对于八种基本数据类型,在集合中实际存的是对应的包装类 ...

随机推荐

  1. java:(设置编码集,密码的加密,JSTL,EL表达式,权限设置)

    1.设置编码集: package cn.zzsxt.lee.web.sevlet; import java.io.IOException; import javax.servlet.ServletEx ...

  2. 封装cookie,自定义过期时间,domain,path

    在使用Cookie进行存储的时候,遇到了许多不可思议的bug,特地标识出来,以作总结. 是这样一个项目,登录是放在官网进行操作的,而登录进入的是后台,后台和官网属于同一域名的不同目录,那么常规进行co ...

  3. unity快捷放置物体操作

    https://connect.unity.com/p/zui-jia-shi-jian-dui-xiang-fang-zhi-he-wu-li-xiao-guo 最佳实践系列文章将探讨我们在与客户合 ...

  4. C#程序员经常用到的10个实用代码片段 - 操作系统

    原文地址  如果你是一个C#程序员,那么本文介绍的10个C#常用代码片段一定会给你带来帮助,从底层的资源操作,到上层的UI应用,这些代码也许能给你的开发节省不少时间.以下是原文: 1 读取操作系统和C ...

  5. 初相识|performance_schema全方位介绍

    初相识|performance_schema全方位介绍 |导 语 很久之前,当我还在尝试着系统地学习performance_schema的时候,通过在网上各种搜索资料进行学习,但很遗憾,学习的效果并不 ...

  6. Ubuntu下软件打开时状态图标与原始图标不重合问题解决

    问题描述 如下图书所示,pycharm打开时,运行的pycharm图标与原始的在收藏夹中的图标不重合.而其他软件不会这样,运行软件的图标与原始图标会重合, 解决办法 把鼠标悬浮在打开的pycharm上 ...

  7. D - 秋实大哥与快餐店

    秋实大哥与快餐店 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  8. [Wpf]在C#中添加 collectionViewSource

    Products = new ObservableCollection<Product>(products); ProductOptions = new ObservableCollect ...

  9. php转码 iconv和mb_convert_encoding

    最近在给公司做一个小工具,将excel表格按照一定的格式转为txt文本格式,要求转后的txt文本是GBK编码,但是总会有几个excel表格无法正常转码,最后查阅相关资料,得到解决方案 先说明下,在ph ...

  10. 06.AutoMapper 之内联映射(Inline Mapping)

    https://www.jianshu.com/p/623655d7cb34 内联映射(Inline Mapping) AutoMapper在 6.2 以上版本将动态创建类型映射. 当第一次调用Map ...