1.list接口中常用的特有方法

package cn.jxufe.java.chapter7;

import java.util.ArrayList;
import java.util.List; /*
* List接口派系, 继承Collection接口
* 下面有很多实现类
* List接口特点: 有序,索引,可以重复元素
* 实现类, ArrayList, LinkedList
*
* List接口中的抽象方法,有一部分方法和他的父接口Collection是一样
* List接口的自己特有的方法, 带有索引的功能
*/
public class TestList01 { public static void main(String[] args) {
// TODO Auto-generated method stub
function();
System.out.println();
function_1();
System.out.println();
function_2();
} /*
* E set(int index, E)
* 修改指定索引上的元素
* 返回被修改之前的元素
*/
public static void function_2() {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4); System.out.println(list);
Integer i = list.set(0, 5);
System.out.println(i);
System.out.println(list);
} /*
* add(int index, E) 将元素插入到列表的指定索引上 带有索引的操作,防止越界问题
* java.lang.IndexOutOfBoundsException
* ArrayIndexOutOfBoundsException
* StringIndexOutOfBoundsException
*/
public static void function() {
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4");
System.out.println(list); list.add(1, "itcast");
System.out.println(list);
} /*
* E remove(int index) 移除指定索引上的元素 返回被删除之前的元素
*/
public static void function_1() {
List<Double> list = new ArrayList<Double>();
list.add(1.1);
list.add(1.2);
list.add(1.3);
list.add(1.4); System.out.println(list);
Double d = list.remove(0);
System.out.println(d);
System.out.println(list);
}
}

2.Iterator的并发修改异常

package cn.jxufe.java.chapter7;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; public class Test02IteratorException {
/*
* 迭代器的并发修改异常 java.util.ConcurrentModificationException
* 就是在遍历的过程中,使用了集合方法修改了集合的长度,不允许的
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<String> list = new ArrayList<String>();
list.add("abc1");
list.add("abc2");
list.add("abc3");
list.add("abc4"); // 对集合使用迭代器进行获取,获取时候判断集合中是否存在 "abc3"对象
// 如果有,添加一个元素 "ABC3"
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
// 对获取出的元素s,进行判断,是不是有"abc3"
if (s.equals("abc3")) {
list.add("ABC3");
}
System.out.println(s);
}
} }

3.LinkedList集合(单向链表)

LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。

package cn.jxufe.java.chapter7;

import java.util.LinkedList;

public class Test03LinkedList {

    public static void main(String[] args) {
// TODO Auto-generated method stub
function();
System.out.println();
function_1();
System.out.println();
function_2();
System.out.println();
function_3();
} /*
* addFirst(E) 添加到链表的开头
* addLast(E) 添加到链表的结尾
*/
public static void function() {
LinkedList<String> link = new LinkedList<String>(); link.addLast("heima"); link.add("abc");
link.add("bcd"); link.addFirst("itcast");
System.out.println(link);
} public static void function_1() {
LinkedList<String> link = new LinkedList<String>();
link.addLast("a");
link.addLast("b");
link.addLast("c");
link.addLast("d"); link.addFirst("1");
link.addFirst("2");
link.addFirst("3");
System.out.println(link);
} /*
* E getFirst() 获取链表的开头
* E getLast() 获取链表的结尾
*/
public static void function_2() {
LinkedList<String> link = new LinkedList<String>();
link.add("1");
link.add("2");
link.add("3");
link.add("4");
System.out.println(link);
if (!link.isEmpty()) {
String first = link.getFirst();
String last = link.getLast();
System.out.println(first);
System.out.println(last);
}
} /*
* E removeFirst() 移除并返回链表的开头
* E removeLast() 移除并返回链表的结尾
*/
public static void function_3() {
LinkedList<String> link = new LinkedList<String>();
link.add("1");
link.add("2");
link.add("3");
link.add("4");
System.out.println(link); String first = link.removeFirst();
String last = link.removeLast();
System.out.println(first);
System.out.println(last); System.out.println(link);
} }

4.Vector集合(基本被ArrayList取代了)

Vector集合数据存储的结构是数组结构,为JDK中最早提供的集合。Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。此接口Enumeration的功能与 Iterator 接口的功能是类似的。Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。

Vector集合对ArrayList集合使用的对比:

5.set集合

学习Collection接口时,记得Collection中可以存放重复元素,也可以不存放重复元素,那么我们知道List中是可以存放重复元素的。那么不重复元素给哪里存放呢?那就是Set接口,它里面的集合,所存储的元素就是不重复的。

set集合取出元素的方式:迭代器和增强for,没有索引,因为是无序的。

5.1HashSet

package cn.jxufe.java.chapter7;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set; /*
* Set接口,特点不重复元素,没索引
*
* Set接口的实现类,HashSet (哈希表)
* 特点: 无序集合,存储和取出的顺序不同,没有索引,不存储重复元素
* 代码的编写上,和ArrayList完全一致
*/
public class Test04HashSet { public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String> set = new HashSet<String>();
set.add("cn");
set.add("heima");
set.add("java");
set.add("java");
set.add("itcast"); Iterator<String> it = set.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
System.out.println("=============="); for (String s : set) {
System.out.println(s);
}
}
}

package cn.jxufe.java.chapter7;

import java.util.HashSet;
import java.util.Set; public class Test05HashSet { public static void main(String[] args) {
Set<String> set1 = new HashSet<>();
// 添加元素
set1.add("London");
set1.add("nanchang");
set1.add("xuzhou");
set1.add("beijing"); System.out.println("set1 is " + set1);
System.out.println(set1.size() + " elements in set1"); // 删除元素
set1.remove("London"); System.out.println("\nset1 is " + set1);
System.out.println(set1.size() + " elements in set1"); Set<String> set2 = new HashSet<>();
set2.add("london");
set2.add("guangzhou");
set2.add("shanghai");
System.out.println("\nset2 is " + set2); System.out.println("is Taipei in set2? " + set2.contains("Taipei"));
System.out.println("is shanghai in set2? " + set2.contains("shanghai")); // addAll
set1.addAll(set2);
System.out.println("now set1 is " + set1); // removeAll
set1.removeAll(set2);
System.out.println("now set1 is " + set1); set1.add("london"); // retainAll
set1.retainAll(set2);
System.out.println(set1);
} }

5.2string类的hash值

5.3hash表的存储过程

5.4重写hashcode

package cn.jxufe.java.chapter7;

import java.util.HashSet;

public class Test06HashSet {

    public static void main(String[] args) {
// TODO Auto-generated method stub // 将Person对象中的姓名,年龄,相同数据,看作同一个对象
// 判断对象是否重复,依赖对象自己的方法 hashCode,equals
HashSet<Person> setPerson = new HashSet<Person>();
setPerson.add(new Person("a", 11));
setPerson.add(new Person("b", 10));
setPerson.add(new Person("b", 10));
setPerson.add(new Person("c", 25));
setPerson.add(new Person("d", 19));
setPerson.add(new Person("e", 17));
System.out.println(setPerson);
} } class Person {
private String name;
private int age; public Person(String name, int age) {
// TODO Auto-generated constructor stub
this.name = name;
this.age = 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;
} @Override
public String toString() {
// TODO Auto-generated method stub
return name + ".." + age;
}
}

如果不重写hashcode发现加入了两个person对象b..10,因为他们的名字和年龄相同,假如现在把名字和年龄相同的对象看成一个对象,那么set如何存储呢?

我们需要重写hashcode方法和equals方法。

package cn.jxufe.java.chapter7;

import java.util.HashSet;

public class Test06HashSet {

    public static void main(String[] args) {
// TODO Auto-generated method stub // 将Person对象中的姓名,年龄,相同数据,看作同一个对象
// 判断对象是否重复,依赖对象自己的方法 hashCode,equals
HashSet<Person> setPerson = new HashSet<Person>();
setPerson.add(new Person("a", 11));
setPerson.add(new Person("b", 10));
setPerson.add(new Person("b", 10));
setPerson.add(new Person("c", 25));
setPerson.add(new Person("d", 19));
setPerson.add(new Person("e", 17));
System.out.println(setPerson);
} } class Person {
private String name;
private int age; public Person(String name, int age) {
// TODO Auto-generated constructor stub
this.name = name;
this.age = 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;
} @Override
public String toString() {
// TODO Auto-generated method stub
return name + ".." + age;
} @Override
public int hashCode() {
// TODO Auto-generated method stub
return name.hashCode() + age * 55;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (obj instanceof Person) {
Person p = (Person) obj;
return name.equals(p.name) && age == p.age;
}
return false;
} }

eclipse也可以直接生成重写的hashcode和equals方法。

5.5LinkedHashSet

package cn.jxufe.java.chapter7;

import java.util.LinkedHashSet;
import java.util.Set; public class Test07LinkedHashSet { public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String> set = new LinkedHashSet<>();
set.add("nanjing");
set.add("beijing");
set.add("dongjing");
set.add("shanghai");
set.add("xuzhou"); System.out.println(set); for (String e : set) {
System.out.print(e + " ");
}
} }

5.6TreeSet

package cn.jxufe.java.chapter7;

import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet; public class Test08TreeSet { public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String> set = new HashSet<>();
set.add("nanjing");
set.add("beijing");
set.add("dongjing");
set.add("shanghai");
set.add("xuzhou");
System.out.println(set); TreeSet<String> treeSet = new TreeSet<>(set);
System.out.println("sorted tree set " + treeSet); // 排序的set System.out.println("first(): " + treeSet.first());// 返回第一个元素
System.out.println("last(): " + treeSet.last());// 返回最后一个元素
System.out.println("headSet: \"dongjing\" " + treeSet.headSet("nanjing"));// 返回dongjing之前的那些元素 System.out.println("lower:\"N\" " + treeSet.lower("nanjing"));// 返回小于N的最大的元素
System.out.println("higher:\"N\" " + treeSet.higher("nanjing"));// 返回大于N的最小的元素
System.out.println("floor:\"N\" " + treeSet.floor("nanjing"));// 返回小于等于nanjing的最大的元素
System.out.println("ceiling:\"N\" " + treeSet.ceiling("nanjing"));// 返回大于等于nanjing的最小的元素
System.out.println("pollfirst: " + treeSet.pollFirst());// 删除第一个元素
System.out.println("pollLast: " + treeSet.pollLast());// 删除最后一个元素
System.out.println(treeSet);
} }

07java进阶——集合框架(set)的更多相关文章

  1. 07java进阶——集合框架3(Map)

    1.映射表(Map) 1.1基本概念 1.2Map中常用的方法 package cn.jxufe.java.chapter7; import java.util.HashMap; import jav ...

  2. 06java进阶——集合框架(list和泛型)

    1.ArrayList ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类).在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内 ...

  3. J.U.C体系进阶(五):juc-collections 集合框架

    Java - J.U.C体系进阶 作者:Kerwin 邮箱:806857264@qq.com 说到做到,就是我的忍道! juc-collections 集合框架 ConcurrentHashMap C ...

  4. Java7编程高手进阶读书笔记—集合框架

    定义:Java集合框架API是用来表示和操作集合的统一框架,它包含接口.实现类.以及帮助程序员完成一些编程的算法 作用: ●编程更加省力,提高城程序速度和代码质量 ● 非关联的API提高互操作性 ● ...

  5. 知识点:Java 集合框架图

    知识点:Java 集合框架图 总结:Java 集合进阶精讲1 总结:Java 集合进阶精讲2-ArrayList Java集合框架图 我们经常使用的Arrayist.LinkedList继承的关系挺复 ...

  6. 一起学 Java(三) 集合框架、数据结构、泛型

    一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...

  7. 【目录】JUC集合框架目录

    JUC集合框架的目录整理如下: 1. [JUC]JUC集合框架综述 2. [JUC]JDK1.8源码分析之ConcurrentHashMap(一) 3. [JUC]JDK1.8源码分析之Concurr ...

  8. java面试题——集合框架

    先来看一下集合框架关系图 Collection FrameWork 如下: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └S ...

  9. Java使用实现面向对象编程:第七章集合框架的解读=>重中之重

    对于集合框架,是非常重要的知识,是程序员必须要知道的知识点. 但是我们为什么要引入集合框架呢? 我们之前用过数组存储数据,但是采用数组存储存在了很多的缺陷.而现在我们引用了集合框架,可以完全弥补了数组 ...

随机推荐

  1. Java字符串的不可变性

    声明一个字符串引用变量: String  s = "abcd"; s是一个引用变量,指向 堆内存中的字符串常量 "abcd" 再声明一个字符串引用变量: Str ...

  2. 如何获得select被选中option的value和text和其他属性值

    比如这个: <select id="select"> <option value="A" url="http://www.baidu ...

  3. 用Vue来实现音乐播放器(四十):歌单详情页布局以及Vuex实现路由数据通讯

    1.歌单详情页是推荐页面的二级路由页面 将推荐页面歌单的数据传到歌曲详情页面  利用vuex 1.首先在state下定义一个歌单对象 disc{} 2.在mutaions-types中  定义一个别名 ...

  4. java数字加密算法

    数字加密在项目中时常会遇到,如手机号,身份证号信息等,下面小白将自己手写的数字加密算法分享给大家,可在项目中直接运用.加密规则,入参时传递一个字段时间戳 time:* 1.以字母代替数字,0-9分别为 ...

  5. spring的组件工厂后置处理器——BeanFactoryPostProcessor

    作用和调用时机 spring有两种后置处理器: 1. 组件后置处理器——org.springframework.beans.factory.config.BeanPostProcessor: 2. 工 ...

  6. Octavia 项目加速 OpenStack LBaaS 落地大规模应用场景

    目录 文章目录 目录 OpenStack LBaaS Octavia 软件架构 网络架构 操作对象基本概念 功能实现基本概念 Ocatvia Daemon 列表 部署 Ocatvia 手动方式集成 O ...

  7. ETF替代规则

    0)禁止现金替代:是指在申购.赎回基金份额时,该成份证券不允许使用现金作为替代. 1)允许现金替代:是指在申购基金份额时,允许使用现金作为全部或部分该成份证券的替代,但在赎回基金份额时,该成份证券不允 ...

  8. 6.824 Lab 2: Raft 2B

    Part 2B We want Raft to keep a consistent, replicated log of operations. A call to Start() at the le ...

  9. MySQL学习-基础练习题

    day1 学生表操作: 1. 查询出班级205有多少个男生 2. 查询出名字为4个字的所有学生信息(编号.姓名,年龄,班级) 3. 查询出所有姓王的学生信息(编号.姓名,年龄,班级) 4. 查询出班级 ...

  10. python每日一练:0014题

    第 0014 题: 纯文本文件 student.txt为学生信息, 里面的内容(包括花括号)如下所示: { "1":["张三",150,120,100], &q ...