Java基础之集合框架类及泛型简介
Collection接口
Collection
通用的常见方法
add()
添加一个元素,可以指定脚标addAll()
将一个collection放入clear()
清除remove()
删除元素,返回该元素retainAll()
将两个collection取交集removeAll()
删除两个集合相同的部分iterator()
返回该集合的迭代器toArray()
转为数组
// 部分通用方法演示
import java.util.ArrayList;
import java.util.List;
public class CollectionDemo {
public static void main(String[] args) {
List<Integer> a = new ArrayList<>();
a.add(1);
a.add(2);
a.add(3);
List<Integer> b = new ArrayList<>(a); // 用另一个集合来初始化
b.add(4);
b.add(5);
b.add(6); // b现在是[1, 2, 3, 4, 5, 6]
b.clear(); // b现在为空
b.addAll(a); // 将另一个集合全放入
b.forEach(System.out::println);
b.remove(2); // 移走了元素'3'
System.out.println(b.contains(2));
System.out.println(a.retainAll(b));
a.forEach(System.out::println); // a和b取交集,只剩下1、2
System.out.println("------------");
a.add(3);
a.removeAll(b);
// a移走了和b相同的部分1、2,只剩3
a.forEach(System.out::println);
}
}
遍历集合的几个方法
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class CollectionDemo {
public static void main(String[] args) {
List<Integer> a = new ArrayList<>();
a.add(1);
a.add(2);
a.add(3);
a.add(0, 0); // 指定下标加入元素
// 三种方法打印每个元素
// 迭代器的用法
for (Iterator<Integer> it=a.iterator(); it.hasNext();) {
System.out.println(it.next());
}
for (Integer each : a) {
System.out.println(each);
}
a.forEach(System.out::println);
}
}
迭代过程中若还进行了set、add操作,可能会发生异常,普通的Iterator
不适用了,换用ListIterator it = a.listIterator();
。
List
三个已实现类有ArrayList 、Vector、LinkedList。他们的区别如下:
- Vector的内部是数组数据结构,是同步的,线程安全,速度慢效率低。
- ArrayList可以看做Vector的替代,不同步,线程不安全,速度快效率高,一般用这个就行。
- LinkedList具有链表的数据结构,增删元素速度很快。数组增删元素,要顺延之后所有的元素,速度慢;但是数组查找速度快,根据下标能快速索引。注意,LinkedList也不是同步的。
ArrayList的部分方法已经在上面的例子演示过了,其他常用方法如可用get(index)
方法来获取元素,类似下标索引。indexOf(object o)
可以获取指定元素的首次出现的下标,set()
指定脚标处的元素,hasNext()
判断是否还有下个元素的修改。
LinkedList还有其独特的方法。比如addFirst/addLast
分别在表头和表尾添加元素。removeFirst/removeLast
分别移除第一个和最后一个元素。indexOf/lastIndexOf
指定元素首次出现/最后一次出现的下标。getFirst/getLast
获取第一个/最后一个元素。等等。
Set
List里面存放的元素可以重复,但是Set里面存放的元素不允许重复。通常使用的有HashSet和TreeSet。
HashSet内部是哈希表结构,即先判断哈希值(hashCode)是否相同,再判断内容是否相同(equals)而ArrayList只判断equals()
TreeSet默认按照自然顺序对其中的元素进行排序,也可以实现Comparator接口,对里面的元素进行指定顺序的排序。
List<Integer> b = new ArrayList<>(); b.add(3); b.add(1); b.add(2); Set<Integer> a = new TreeSet<>(b); a.forEach(System.out::println); // 打印自然顺序的1、2、 class Abc implements Comparator {} Set<Integer> a = new TreeSet(new Abc()); // 传入一个比较器,在初始化的时候就具有比较功能
Map
常用的是Hashtable、HashMap、TreeMap
- value
put(key, value)
返回前一个被替代的value,若无前一个返回null remove(key)
删除该件对应的键值对。get(key)
获取该键对应的值。values()
获取全部值放入一个Collection。Set<E> keys = a.keyset()
取出所有的key放入一个Set中Set<Map.Entry<K, V>> kv = a.entrySet()
Map<String, Integer> a = new HashMap<>();
a.put("a", 1);
a.put("b", 2);
a.put("c", 3);
Set<String> keys = a.keySet();
// 只能获取键
for (String key : keys) {
System.out.println(a.get(key));
}
// Map.Entry<K, V>可以获取键和值
Set<Map.Entry<String, Integer>> kv = a.entrySet();
for (Map.Entry<String, Integer> me : kv) {
System.out.println(me.getKey() + " : " + me.getValue());
}
- HashMap内部数据结构是哈希表,不同步,允许null
- Hashtable内部数据结构是哈希表,同步,不允许null(其下的properties可以用来储存键值配置文件信息)
- TreeMap内部数据结构是二叉树,不同步,可对键排序
总结
- 需要唯一吗?是的话用Set,否则List。List里需要频繁增删吗?是的话LinkedList,否则ArrayList。
- 需要顺序吗?是的话Tree,否则Hash(无序)。
- 看到array就要想到数组、查询、脚标。
- 看到Link就想起链表,add、get、remove等方法都有first和last操作。
- 看到Hash就想到覆盖
hashcode()
和equals()
方法 看到Tree就想到二叉树,可实现排序。和两个接口有关,一个需要
implements Comparable
并覆盖compareTo()
,另外一个implements Comparator
,覆盖compare()
。
注意:遍历集合是为了更方便操作每个元素,其实可以直接写System.out.println()里面放List,Map, Set的实例都可以
,因为重写了toString方法,所以看起来很美观。泛型
public class TemplateDemo<Element> {
// 用的类的泛型参数
public Element show(Element e) {
System.out.println(e);
return e;
}
// 可以和类的泛型参数不一样
public <T> T run(T t) {
System.out.println(t);
return t;
}
// 静态方法不能使用类的泛型参数(Element),因为静态方法无需使用对象
public static Element ss( ) {
//false
}
// 但是静态方法可以使用和类不一样泛型参数
public static <T> T run_2(T t) {
System.out.println(t);
return t;
}
// 通配符'?',可匹配任意类型
List<?> a = new ArrayList<>();
}
泛型限定
- 上限:
<? extends E>
,接收E或者E的子类。 - 下限:
<? super E>
,接收E或者E的父类。
Collections、Arrays工具类
顾名思义,类中包含了许多操作集合、数组的功能。
Collections
Collections.sort()
可对传入的集合排序,还可传入一个比较器。Collections.binarySearch()
可直接使用二分查找。Collections.max/min()
可快速找出集合中的最大/最小值。Collections.fill()
可以给集合中每个元素初始化为相同的值。Collections.shuffle()
随机打乱顺序。Collections.synchronizedList()
返回一个同步(线程安全)的List。
Arrays
Arrays.asList()
数组转为列表。Arrays.binarySearch()
当然也可以直接使用二分查找。copyOf()
复制数组,可指定长度。copyOfRange()
指定范围截取数组复制。Arrays.sort()
当然也有排序。Arrays.toString()
可以直接打印数组
可变参数,用...
表示,可代表任意个参数,必须作为最后一个参数
public static int add(int a, int ...arr) {
int sum = a;
for (int each :arr) {
sum += each;
}
return sum;
}
public static void main(String[] args) {
int val = add(3, 4, 5, 6);
System.out.println(val); // 18
}
Math类
sin/cos/tan、PI、pow、max/min、abs
都是常用的数学计算方法。Math.ceil()/floor()
分别是向上和向下取整。Math.round()
是四舍五入。Math.random()
随机产生0.0~1.0之间的小数。
by @suhaiyu
2017.1.8
Java基础之集合框架类及泛型简介的更多相关文章
- Java基础--说集合框架
版权所有,转载注明出处. 1,Java中,集合是什么?为什么会出现? 根据数学的定义,集合是一个元素或多个元素的构成,即集合一个装有元素的容器. Java中已经有数组这一装有元素的容器,为什么还要新建 ...
- java基础37 集合框架工具类Collections和数组操作工具类Arrays
一.集合框架工具类:Collections 1.1.Collections类的特点 该工具类中所有的方法都是静态的 1.2.Collections类的常用方法 binarySearch(List< ...
- java基础之集合框架
6.集合框架: (1)为什么出现集合类? 面向对象对事物的体现都是以对象的形式,为了方便对多个对象的操作,就对对象进行存储. 集合就是存储对象最常用的一种方式. (2)数组和集合都是容器,两者有何不同 ...
- 黑马程序员——【Java基础】——集合框架
---------- android培训.java培训.期待与您交流! ---------- 一.集合框架概述 (一)集合框架中集合类关系简化图 (二)为什么出现集合类? 面向对象语言对事物的体现都是 ...
- Thinking in java基础之集合框架(转载)
集合简介(容器)把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成一个东西(一个对象),然后我们借用袋子把这20个苹果装起来,而这个袋子就是集合(也叫 ...
- Java基础之集合框架(Collection接口和List接口)
首先我们说说集合有什么作用. 一.集合的作用 1.在类的内部,对数据进行组织: 2.简单而快速的搜索大数量的条目: 3.有的集合接口,提供一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关 ...
- java基础之集合框架--使用ArrayList类动态 存储数据
一.ArrayList是List接口下的一个实现类,实现了长度可变的.连续的数组:拥有数组的特性. 遵循了LIst的规则:不唯一的.有序的. 如果没有增加泛型的话,集合中可以添加任何类型的数据. 使用 ...
- Java基础之集合框架——使用堆栈Stack<>对象模拟发牌(TryDeal)
控制台程序. public enum Rank { TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, A ...
- Java基础之集合框架——使用集合Vector<>挑选演员(TryVector)
控制台程序. public class Person implements Comparable<Person> { // Constructor public Person(String ...
随机推荐
- python 标准库 -- requests
一. 安装 $ pip install requests requests 并不是python 标准库, 但为了汇总方便, 将其放置于此. 二. 用法 requests.get() : GET 请求 ...
- R自带数据包
datasets(R自带数据包) 作者:王彦博 作品来源:百度百科 precip #长度为70的命名向量 euro #欧元汇率,长度为11,每个元素都有命名 landmasses #48个陆地的面积, ...
- 读Zepto源码之属性操作
这篇依然是跟 dom 相关的方法,侧重点是操作属性的方法. 读Zepto源码系列文章已经放到了github上,欢迎star: reading-zepto 源码版本 本文阅读的源码为 zepto1.2. ...
- php中的date函数
一.带零 echo date('Y-m-d');2012-08-08二.不带零 echo date('Y-n-j');2012-8-8
- if和for的几个经典题目
1.有一对幼兔,幼兔1个月后长成小兔,小兔1个月后长成成兔并生下一对幼兔,问几年后有多少对兔子,幼兔.小兔.成兔对数分别是多少. 幼兔 1 小兔 0 成兔 0幼兔 0 小兔 1 成兔 0 幼兔 1 小 ...
- 从Android源码的角度分析Binder机制
欢迎访问我的个人博客,原文链接:http://wensibo.top/2017/07/03/Binder/ ,未经允许不得转载! 前言 大家好,好久不见,距离上篇文章已经有35天之久了,因为身体不舒服 ...
- 最全的CSS浏览器兼容问题(转至http://68design.net/Web-Guide/HTMLCSS/37154-1.html)
最全的CSS浏览器兼容问题 CSS对浏览器的兼容性有时让人很头疼,或许当你了解当中的技巧跟原理,就会觉得也不是难事,从网上收集了IE7,6与Fireofx的兼容性处理方法并整理了一下.对于web2 ...
- web前段2017.6.8
<body></body>background='图片路径'---表示背景图片图片:.jpg .png(透明图片) .gif(动态图)... 路径---绝对路径:相对于磁盘的路 ...
- java基础系列--Date类
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7126930.html 1.Date类概述 Date类是从JDK1.1就开始存在的老类,其提 ...
- (转载)Java内部类的使用小结
原文摘自:http://android.blog.51cto.com/268543/384844/ 内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态stati ...