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生成二维码的几种方式

    1: 使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着http://sourceforge.jp/projects/qrcode/ ...

  2. 第三周课程总结&实验报告(一)

    实验报告(一) 1.打印输出所有的"水仙花数",所谓"水仙花数"是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个"水仙花数" ...

  3. 深入浅出mysql笔记---1、mysql下载安装

    深入浅出mysql笔记---1.mysql下载安装 一.总结 一句话总结: linux下rpm安装即可 1.linux的wget命令作用? 下载文件的工具:比如wget http://cn.wordp ...

  4. NDK undefined reference to 'rand'

    NDK 编译 结果报错undefined reference to 'rand' 最怪异的是armeabi-v7a armeabi的情况下有问题 但是arm64-v8a编译正常,用网上说的添加头文件s ...

  5. 开发一个Flink应用

    步骤列表本次实战经历以下步骤: 创建应用:编码:构建:提交任务到Flink,验证功能: 环境信息Flink:1.7:Flink所在机器的操作系统:CentOS Linux release 7.5.18 ...

  6. oracle-不完全数据库恢复-被动恢复-ORA-00313/ORA-00366

    继上一篇不完全恢复 oracle-不完全数据库恢复-被动恢复-ORA-00313/ORA-00366 场景2:数据库拥有备份,CURRENT状态日志组中所有的在线日志头损坏,在发生日志切换时实例被自动 ...

  7. mysql 锁超时

    对一个别人正在读写的表执行DDL操作,经常需要先锁表,但是这个表正在被人执行读写操作,那么就会报:Lock wait timeout 类的错误. 通过MDB实例详情页面的进程管理可以看到类似如下的情况 ...

  8. centos7安装java JDK

    Java环境 1.下载jdk(用FileZilla或xshell工具连接服务器后上传到需要安装的目录) 在 /opt/deploy 下新建 java 文件夹: # mkdir / opt/deploy ...

  9. MySQL学习-基础练习题

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

  10. 【Linux开发】Linux启动脚本设置

    前言linux有自己一套完整的启动 体系,抓住了linux启动 的脉络,linux的启动 过程将不再神秘.阅读之前建议先看一下附图.本文中假设inittab中设置的init tree为:/etc/rc ...