07java进阶——集合框架(set)
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)的更多相关文章
- 07java进阶——集合框架3(Map)
1.映射表(Map) 1.1基本概念 1.2Map中常用的方法 package cn.jxufe.java.chapter7; import java.util.HashMap; import jav ...
- 06java进阶——集合框架(list和泛型)
1.ArrayList ArrayList集合是程序中最常见的一种集合,它属于引用数据类型(类).在ArrayList内部封装了一个长度可变的数组,当存入的元素超过数组长度时,ArrayList会在内 ...
- J.U.C体系进阶(五):juc-collections 集合框架
Java - J.U.C体系进阶 作者:Kerwin 邮箱:806857264@qq.com 说到做到,就是我的忍道! juc-collections 集合框架 ConcurrentHashMap C ...
- Java7编程高手进阶读书笔记—集合框架
定义:Java集合框架API是用来表示和操作集合的统一框架,它包含接口.实现类.以及帮助程序员完成一些编程的算法 作用: ●编程更加省力,提高城程序速度和代码质量 ● 非关联的API提高互操作性 ● ...
- 知识点:Java 集合框架图
知识点:Java 集合框架图 总结:Java 集合进阶精讲1 总结:Java 集合进阶精讲2-ArrayList Java集合框架图 我们经常使用的Arrayist.LinkedList继承的关系挺复 ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- 【目录】JUC集合框架目录
JUC集合框架的目录整理如下: 1. [JUC]JUC集合框架综述 2. [JUC]JDK1.8源码分析之ConcurrentHashMap(一) 3. [JUC]JDK1.8源码分析之Concurr ...
- java面试题——集合框架
先来看一下集合框架关系图 Collection FrameWork 如下: Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └S ...
- Java使用实现面向对象编程:第七章集合框架的解读=>重中之重
对于集合框架,是非常重要的知识,是程序员必须要知道的知识点. 但是我们为什么要引入集合框架呢? 我们之前用过数组存储数据,但是采用数组存储存在了很多的缺陷.而现在我们引用了集合框架,可以完全弥补了数组 ...
随机推荐
- 如何解决两个相邻的span中间有空隙
span中间不要有换行.或者空格 或者在样式上加上float:left
- 【机器学习速成宝典】模型篇05朴素贝叶斯【Naive Bayes】(Python版)
目录 先验概率与后验概率 条件概率公式.全概率公式.贝叶斯公式 什么是朴素贝叶斯(Naive Bayes) 拉普拉斯平滑(Laplace Smoothing) 应用:遇到连续变量怎么办?(多项式分布, ...
- 微信小程序 API 网络(ajax)
网络 API 类似于 ajax 向服务器请求网络地址,唯一不同的是这个请求有很多的规则,且必须向服务器上请求,不能在本地请求 网络 发送请求: wx.request() 发起https网络请求 参数: ...
- 解决Python print输出不换行没空格的问题
今天在做编程题的时候发现Python的print输出默认换行输出,并且输出后有空格. 题目要求输出 122 而我的输出是: 1 2 2 于是我百度查到取消print自动换行的方法:就是在print的值 ...
- ERROR:imshow、Mat、waitkey找不到标识符(opencv)
可以发现imshow.Mat.waitkey这三个都是opencv相关的. 在添加了相关库文件后还是有问题. #include "stdafx.h" #include <st ...
- 1、maven的下载,安装,配置
下载 1.maven官方下载地址: http://maven.apache.org/download.cgi 进入官网: 下载各历史版本官方地址: https://archive.apache.org ...
- 编译mysql时CMake Error at cmake/readline.cmake:85 (MESSAGE)
CMake Error at cmake/readline.cmake:85 (MESSAGE): Curses library not found. Please install appropr ...
- 三:flask-配置文件的两种方式
项目中,配置的参数一般采用配置文件的形式,方便统一管理 第一种方式:模块的形式:使用app.config.from_object(config)的方式加载配置文件,此方式需要导入配置文件视为模块 第二 ...
- C 语言的运算符
算术运算 C 语言支持 + - * / % 五种运算,加减乘除取模. 所有 CPU 都内建加法器,可以完成加法操作.减法操作可以转为加法操作.大部分 CPU 都没有内置乘法器,此时编译器会把 * / ...
- python字符串-方法
一.1. upper()作用:将字符串中字符转换为大写 In [17]: spam Out[17]: 'hello,world' In [18]: print(spam.upper()) HELLO, ...