最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出。初学者对于本篇博客只建议作为参考,欢迎留言共同学习。

  之前有介绍集合框架的体系概念(http://www.cnblogs.com/yjboke/p/8761195.html),本篇介绍一下常用方法及常用工具类。


Collection→List→ArrayList:

 增(add)、删(remove)、改(set)、查(get)。

List<String> alist = new ArrayList<String>();
alist.add("abc1"); //.add 增加
alist.add("abc2");
alist.add("abc3");
alist.add("abc4");
System.out.println(alist.get(2)); //.get 查询
System.out.println(alist.remove(1));//.remove 删除元素,并输出删除元素
alist.set(1,"a"); //.set 修改
System.out.println(alist);

Collection→List→LinkedList:

除了以上介绍的增删改查方法外还有LinkedList的特有方法。

//在首末添加元素
addFirst();
addLast();
//获取首末元素,但不删除元素,如果集合中没有元素,会出现NoSuchElementException
getFirst();
getLast();
//获取首末元素,但会删除元素,如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast():
//判断是否包含元素,如果包含返回true
isEmpty
-------------------------------------在JDK1.6出现了替代方法:----------------------------------------------------
//添加元素
offerFirst();
offerLast();
//获取元素,但不会删除元素,如果集合中没有元素,会返回null
peekFirst();
peekLast();
//获取元素,但会删除元素,如果集合中没有元素,会返回null
pollFirst();
pollLast();
alist.addFirst("abc1");                       //.addFirst在集合前添加
alist.addLast("abc4");   //.addLast在集合后方添加
System.out.println(alist);        //输出结果为:[abc3, abc2, abc1, abc4]
System.out.println(alist.getFirst()); //获得首个元素
System.out.println(alist.getLast());   //获得最后的元素
System.out.println(alist.removeFirst());//删除首个元素,并输出元素值
System.out.println(alist.removeLast()); //删除最后的元素,并输出元素值

Collection→Set→HashSet:

添加:add(添加元素);addAll(添加集合中所有元素)

删除:remove(删除元素);

查询集合长度:size

查询是否存在:contains

HashSet<String> set1 = new HashSet<String>();         //定义Set集合set1
HashSet<String> set2 = new HashSet<String>(); //定义Set集合set2 set1.add("abc1");             //add:将set集合中添加元素
set1.add("abc2");
set1.add("abc3");
set1.add("abc3");             //添加重复元素不会添加进去,
set2.addAll(set1);           //addAll:将集合set1添加到set2中
System.out.println(set1);            //输出内容为:[abc1, abc3, abc2] 无序
System.out.println(set2);            //输出内容为:[abc1, abc3, abc2] 和set1相同
set1.remove("abc2");            //remove:删除元素
System.out.println(set1);            //输出内容为:[abc1, abc3]
     System.out.println(set1.size());         //输出内容为:2 set1的长度
     System.out.println(set1.contains("abc1"));   //输出内容为:true

使用HashSet存储自定义对象,包含重写hashCode和equals的方法

  首先定义一个手机类(Phone),包含价格(price)和名称(name);

 class Phone{

     private int price;
private String name; Phone(int price,String name) {
super();
this.name = name;
this.price = price;
} public int getPrice(){
return price;
}
public void setPrice(int price){
this.price = price;
} public String getName(){
return name;
}
public void setName(String name){
this.name = name;
} public String toString(){
return "Phone:price = "+price + ",name = " + name; //输出格式
}
//复写hashCode方法
public int hashCode(){
final int prime = 31;
int result = 1;
result = prime * result + price;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
//复写equals方法
public boolean equals(Object obj){ if(!(obj instanceof Phone)){
throw new ClassCastException("类型不匹配"); //也可写为:return false;
}
Phone p = (Phone)obj;
System.out.println(this.name + " and " + p.name + "重复了"); //如果重复数据则打印输出
return this.name.equals(p.name) && this.price==p.price;
}
}

  创建一个HashSet集合,并添加数据并输出,添加重复数据进行验证:

public static void main(String[] args) {
HashSet<Phone> hs = new HashSet<Phone>(); //定义HashSet集合
hs.add(new Phone(4888, "xiaomi"));
hs.add(new Phone(8388, "iphoneX"));
hs.add(new Phone(8388, "iphoneX"));
hs.add(new Phone(3288, "vivo")); //重复数据
//迭代器输出
for(Iterator<Phone> it = hs.iterator();it.hasNext();){
System.out.println(it.next());
}
}

  输出结果为:

iphoneX and iphoneX重复了
Phone:price = 4888,name = xiaomi
Phone:price = 3288,name = vivo
Phone:price = 8388,name = iphoneX

--------------------------------------------------------------------------------------------------------------

Collection→Set→TreeSet:

  操作元素方式与HashSet相同,但TreeSet是有序的,现介绍TreeSet如何存储自定义对象。

  现封装一个Person类,其中有年龄和姓名两种属性,实现Comparable接口使元素具备比较性,并创建一个比较器。

 class Person implements Comparable{                //注:Comparable接口可让Person类具备比较性

     private int age;
private String name; Person(int age,String name) {
super();
this.name = name;
this.age = age;
} public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
} public String getName(){
return name;
}
public void setName(String name){
this.name = name;
} public String toString(){
return "年龄为 : "+age + ",姓名为: " + name; //输出格式
}
//比较器
public int compareTo(Object obj){
if(!(obj instanceof Person)){
throw new ClassCastException("不是人"); //可用:return false;代替
}
Person p = (Person)obj;
if(this.age > p.age){
return 1; //比较大小进行排序
}
if (this.age == p.age) {
return this.name.compareTo(p.name); //如果年龄相同则比较姓名,返回1、0、-1
}
return -1;
}
43 }

创建一个TreeSet集合,并添加数据进行验证。

public static void main(String[] args) {
TreeSet<Person> hs = new TreeSet<Person>(); //定义HashSet集合
hs.add(new Person(4888, "xiaomi"));
hs.add(new Person(8388, "iphoneX"));
hs.add(new Person(8388, "iphoneX")); //重复数据
hs.add(new Person(3288, "vivo"));
//迭代器输出
for(Iterator<Person> it = hs.iterator();it.hasNext();){
Person per = (Person)it.next();
System.out.println(per.getAge() + "....." + per.getName() );
}
}

输出结果为:

3288.....vivo
4888.....xiaomi
8388.....iphoneX

另:在不改变当前代码的前提下要求按照姓名排序。可定义一个类,实现Comparator接口,覆盖compare方法。

class MyCompars implements Comparator{

    public int compare(Object o1,Object o2){
Person s1 = (Person) o1;
Person s2 = (Person) 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()) {
num = 1;
}
if(s1.getAge() == s2.getAge()){
num = 0;
}
return -1;*/
}
return num;
}
}

然后将其传入到集合中:

public static void main(String[] args) {
TreeSet<Person> hs = new TreeSet<Person>(new MyCompars()); //定义HashSet集合
hs.add(new Person(4888, "xiaomi"));
hs.add(new Person(8388, "iphoneX"));
hs.add(new Person(8188, "iphoneX")); //重复数据
hs.add(new Person(3288, "vivo"));
//迭代器输出
for(Iterator<Person> it = hs.iterator();it.hasNext();){
Person per = (Person)it.next();
System.out.println(per.getAge() + "....." + per.getName() );
}
}

输出结果为:

8188.....iphoneX
8388.....iphoneX
3288.....vivo
4888.....xiaomi

总结:当元素自身不具备比较性或者所具备的比较性不是自己所需要的,就可以让容器自身具备比较性。当两种排序都存在时,以比较器为主。

浅谈集合框架二 List、Set常用方法的更多相关文章

  1. 浅谈集合框架三、Map常用方法及常用工具类

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  2. 浅谈集合框架六——集合扩展:Arrays工具类、集合与数组相互转换方式;

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  3. 浅谈集合框架五——集合框架扩展:Collections工具类的使用,自定义比较器

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  4. 浅谈集合框架四——集合扩展:集合循环输出方式及list输出方式的效率对比

    最近刚学完集合框架,想把自己的一些学习笔记与想法整理一下,所以本篇博客或许会有一些内容写的不严谨或者不正确,还请大神指出.初学者对于本篇博客只建议作为参考,欢迎留言共同学习. 之前有介绍集合框架的体系 ...

  5. 浅谈Java代理二:Cglib动态代理-MethodInterceptor

    浅谈Java代理二:Cglib动态代理-MethodInterceptor CGLib动态代理特点: 使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM字节码生 ...

  6. 浅谈Kotlin(二):基本类型、基本语法、代码风格

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 通过上面的文章,在A ...

  7. 手撸ORM浅谈ORM框架之基础篇

    好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...

  8. 手撸ORM浅谈ORM框架之Add篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  9. 手撸ORM浅谈ORM框架之Update篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

随机推荐

  1. OpenCV灰度化图像

    OpenCV2版本号非常多函数发生了变化.比如二值化,其演示样例: void CmyMFC2Dlg::OnBnClickedButton1() { // TODO: Add your control ...

  2. 计算机网络.{wireshark的使用实验}

    ---恢复内容开始--- 三种选择 1 2 3 端口镜像:交换机的某个端口,接受或者发送的数据给另外一个端口 ARP欺骗: ARP欺骗是利用ARP协议自身的不足进行的欺骗 1 执行ping命令, 2 ...

  3. PHPCMS快速建站系列之getcache()的用法

    /** * 读取缓存,默认为文件缓存,不加载缓存配置. * @param string $name 缓存名称 * @param $filepath 数据路径(模块名称) caches/cache_$f ...

  4. es安装遇到的问题

    问题1: es一闪即逝的问题?java的jdk环境变量没有配置好, JAVA_HOME没有配置好 必须在系统变量里面添加JAVA_HOME: C:\Program Files\Java\jre1.8. ...

  5. 使用curl指令实现restful接口操作

    curl 是很方便的Rest客戶端,可以很方便的完成許多Rest API測試的需求,甚至,如果是需要先登入或認證的rest api,也可以進行測試,利用curl指令,可以送出HTTP GET, POS ...

  6. SDUT-3363_驴友计划

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 做为一个资深驴友,小新有一张珍藏的自驾游 ...

  7. 【Leetcode链表】环形链表(141)

    题目 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 1: ...

  8. QT 建立信号和槽的联系(事件处理)

    Qt中事件处理机制叫做“信号”和“槽”signal &slot. 其模型为: 对象a中有一个信号signal:XXX(代表一个事件) 对象b中有一个槽slot:YYY(事件处理函数) 用con ...

  9. 快递查询API接口集成,有需要的可以直接用

    适用于涉及经常发货.寄快递的人群.企业.电商网站.微信公众号平台等对接使用.支持国内外三百多家快递及物流公司的快递单号一站式查询. 使用说明: 1.KuadidiAPI.php 不需要修改改任何东西 ...

  10. ImportError: No module named libqt_gui_cpp_shiboken

    在使用 rosrun rqt_publisher rqt_publisher 调用ROS图形化界面的过程中出现: 而且在使用图像化界面添加/cmd_vel时,无法添加,命令窗口显示“段错误”. 在网上 ...