一、泛型

  1、泛型的本质是将类型参数化,即将数据类型作为参数。
 

  2、泛型可以在编译期进行检查,其所有的强制转换是隐式且自动的,提高了代码的安全性。
  

  3、泛型可以用在类(泛型类)、接口(泛型接口)、方法(泛型方法)的创建。
   

  4、泛型的类型参数只能为引用类型,不能为基本类型。

二、常用集合类

1、体系分类:

  (1)Collection体系: Set、List、Queue。
    Set:元素无序且不可重复。HashSet,TreeSet。
    List:元素有序且可重复。LinkedList,ArrayList。
    Queue:队列,先进先出。Deque。

  (2)Map体系:HashMap、TreeMap。

2、分类如下

3、集合与数组的区别

三、Collection集合

1、相关方法:

2、迭代器

  (1)使用Iterator接口,不能直接new,使用集合的方法去调用。即Iterator it = c.iterator();
 

  (2) java.util.Iterator; 其使用流程为问,取,删(不必须)。
  

  (3)方法:
    boolean hasNext();问操作,查询当前集合是否还有元素。
    Object next();取操作,取出集合元素。
    Iterator remove() ;删操作,删除集合元素。
   

  (4)使用迭代器过程中,不能使用集合的相关方法去改变集合中的元素,只能使用迭代器的方法。比如现有集合c,迭代器t,则只能使用 t.remove()删除刚next出来的元素,不能使用 c.remove(),使用的话会抛出异常。

for (Object t :  c ) { //foreach循环
}
//等价于
Iterator it = c.iterator();
while(it.hasNext){
Object obj = it.next();
}

四、Set、List集合

1、Set与List集合的区别:

2、List:

  (1)ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素

  (2)LinkedList 底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素

  (3)Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素

3、Set:

  (1)HashSet:底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素(key只能有一个为null),元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。equals相同的两个对象,hashcode也要相同。但hashcode相同的两个对象,equals却不一定相同。

  (2)LinkedHashSet:底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。线程不安全,效率高。

  (3)TreeSet:底层数据结构采用二叉树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。根据构造方法不同,分为自然排序(无参构造,使元素自身具备比较性)和比较器排序(有参构造,使集合自身具备比较性),自然排序要求元素必须实现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;比较器排序需要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法;

4、数组转集合(List):

  (1)数组只能转到List集合,不能为Set集合,因为数组可能有重复的值,但Set为不可重复集合。

  (2)List Arrays.asList(T array)方法来将数组转为集合。但此操作不能对集合进行任何添加删除操作,即此集合只可读。否则抛出异常java.lang.UnsupportedOperationException。若想操作集合,则将此集合整体加入到另一个集合中,使用构造方法加入,或者调用addAll()方法。

5、总结:

五、队列与栈

1、队列:

  (1)先进先出原则(FirstInputFirstOutput)。

  (2)java.util.Queue.。JDK提供Queue接口,LinkedList是其实现类,这是由于Queue频繁增删。offer添加,poll取出。

  (3)方法:

    boolean offer(T t); 入队方法,添加到队尾。
    T poll();出队方法,用于获取队首元素。
    T peek();不出队方法,用于获取队首元素。
    遍历方法是一次性的,每次都是出队操作。

Queue<String> queue = new LinkedList<String>();
queue.offer("1");
queue.offer("2");
System.out.println(queue); //[1,2]
String str = queue.poll();
System.out.println(queue);//[2]
str = queue.peek();
System.out.println(queue);//[2]

2、双端队列与栈:

  (1)Deque为Queue的子接口。为双端队列,即两端均可以进行offer与poll操作。

  (2)若将其限制为只准一端进行offer与poll操作,那么即为栈(Stack)的数据结构。其中入栈push,出栈pop。栈遵循先进后出原则(FirstInputLastOutput),用于记录一组可回溯的操作,比如撤销与前进操作。

  (3)方法:
    void push(T t); 入栈操作,压入一个元素。
    T pop() ;出栈操作,取出栈顶元素。
    T peek(); 取出栈顶元素,但不出栈。
    遍历也是一次性的。

Deque<String> stack = new LinkedList<String>();
stack.push("1");
stack.push("2");
System.out.println(stack);//[2,1],后进先出
String str = stack.peek();
System.out.println(stack);//[2,1]
str = stack.pop();
System.out.println(stack);//[1]

六、Map

  1、 Map 没有继承 Collection 接口。

    Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。 Map是接口,通常使用其实现类HashMap来创建它。也可以通过LinkedHashMap来创建它,可以保证存入与取出的顺序一致。

  2、Map 接口提供 3 种集合的视图.

    Map 的内容可以被当作一组 key 集合(Set keySet()),一组 value 集合(Collection values),或者一组 key-value 映射(Set entrySet())。

    想要获取map中的元素,由于map没有迭代器,但Collection有迭代器,所以需将map集合转换为set集合,然后就可以使用迭代器了。之所以转为set集合,是因为map集合具备着键的唯一性。set集合底层用的就是map方法。

方法:
1、Set keySet(); //将map中的键存入Set集合,迭代后只能通过get(key)方法取值。(无序存放) 2、Set<Map.Entry<K, V>> entrySet(); //取的是键与值的映射关系,返回的是Entry接口, 迭代后可以用e.getKey()取键,用e.getValue()取value。返回一个entry接口。 注:entrySet(推荐使用)速度比keySet快。 实例(keySet):
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test{
public static void main(String[] args){
    //实例化一个map集合
Map<String, String> map = new HashMap<String, String>();
//添加数据
map.put("1", "zhangsan");
map.put("2", "lisi");
map.put("3", "wangermazi");
    //使用keySet去将map转为set
Set<String> keySet = map.keySet();
    //使用迭代器
Iterator<String> it = keySet.iterator();
while (it.hasNext()) {
String key = it.next();
      //通过get(key)取value值
String value = map.get(key);
System.out.println("key:" + key + "->value: " + value);
}
}
/*
输出
key:1->value: zhangsan
key:2->value: lisi
key:3->value: wangermazi
*/
} 实例(entrySet):
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HelloWorld{
public static void main(String[] args){
//实例化一个map集合
Map<String, String> map = new HashMap<String, String>();
//添加数据
map.put("1", "zhangsan");
map.put("2", "lisi");
map.put("3", "wangermazi");
//使用entrySet去将map转为set
Set<Map.Entry<String, String>> entrySet = map.entrySet();
//使用迭代器
Iterator<Map.Entry<String, String>> it = entrySet.iterator();
while (it.hasNext()) {
//获取Map.Entry关系对象me。
Map.Entry<String, String> me = (Map.Entry) it.next();
//通过关系对象去获取key与value
System.out.println(me.getKey()+ "-> " + me.getValue());
}
}
/*
输出
1-> zhangsan
2-> lisi
3-> wangermazi
*/
}

  3、HashTable与HashMap的区别:

    (1)HashMap: 基于哈希表实现。使用HashMap要求添加的键类明确定义了hashCode()和equals()[可以重写hashCode()和equals()],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。由链表与数组组合实现。首先根据hashcode计算一个哈希值,再根据hash算法计算一个值,此值代表的是数据在数组中的存储位置。当定位到同一个数组位置上时,会通过链表的形式将值保存。即使用数组保存数据的位置,使用链表保存每个数组位置的值。JDK8后,当链表的存储的数据个数大于8时,将自动转为红黑树保存。

  4、TreeMap:

    非线程安全基于红黑树实现。TreeMap没有调优选项,因为该树总处于平衡状态。适用于按自然顺序或自定义顺序遍历键(key)。

七、Collections工具类

1、Collections是java.util下的一个类,是针对集合类的一个工具类,提供了一系列的静态方法,实现对集合的查找、排序、替换、线程安全化等操作。

2、Collection是java.util下的一个接口,是各种集合结构的父接口,实现它的接口主要为Set与List,提供了一些关于集合的操作,比如插入、删除、判断元素是否存在、以及遍历。

常用方法:
Collections.sort(list); //list集合进行元素的自然排序
Collections.sort(list, new ComparatorBylen()); //按指定比较器排序
Collections.max(list); //返回list字典顺序最大的元素
int index = Collections.binarySearch(coil,"c"); //二分查找,返回下标(角标,从0开始)
Collections.reverse(list); //反转排序
Collections.shuffle(list); //随机将list中的元素进行位置的置换 import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; //自己构造一个比较器,重写compare方法
class ComparatorBylen implements Comparator<String> {
public int compare(String s1, String s2) {
int temp = s1.length() - s2.length();
return temp == 0? s1.compareTo(s2) : temp;
}
} public class Test{
public static void main(String[] args){
//实例化一个list集合
List<String> coil = new ArrayList();
//添加数据
coil.add("c");
coil.add("bw");
coil.add("a");
System.out.println(coil); //对元素进行自然排序
Collections.sort(coil);
System.out.println(coil); //调用自己建的比较器进行排序
Collections.sort(coil, new ComparatorBylen());
System.out.println(coil); //返回list中字典顺序最大的元素
System.out.println(Collections.max(coil)); //二分查找,返回下标(角标,从0开始)
System.out.println(Collections.binarySearch(coil,"c")); //逆向输出
Collections.reverse(coil);
System.out.println(coil); //随机对list中元素进行位置的互换
Collections.shuffle(coil);
System.out.println(coil);
}
/*
输出
[c, bw, a]
[a, bw, c]
[a, c, bw]
c
1
[bw, c, a]
[c, a, bw]
*/
}

八、总结

1、按线程是否安全分类:

  (1)LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;

  (2)HashMap是非线程安全的,HashTable是线程安全的;

  (3)StringBuilder是非线程安全的,StringBuffer是线程安全的。

2、按数据结构分类:

  (1)ArrayXxx:底层数据结构是数组,查询快,增删慢

  (2)LinkedXxx:底层数据结构是链表,查询慢,增删快

  (3)HashXxx:底层数据结构是哈希表。依赖两个方法:hashCode()和equals()

  (4)TreeXxx:底层数据结构是二叉树。两种方式排序:自然排序和比较器排序

参考:

https://blog.csdn.net/feiyanaffection/article/details/81394745

Java基础--常用API--集合类相关API的更多相关文章

  1. Java基础--常用API--日期相关API

    一.java.util.Date 1.只用于显示系统时间,其大部分操作由Calendar代替. 格林威治时间(GMT):指的是1970年1月1日0时,不同地区有时间差. 默认输出格式:星期.月.日.时 ...

  2. Java基础--常用API--IO流相关API

    一.IO流 1.定义: IO流指的是Input/Output流,即输入流/输出流. 输入流:将外界信息写入程序,即从外界获取信息,属于读操作. 输出流:将程序数据发送给外界,即向外界传输数据,属于写操 ...

  3. java基础--常用函数总结

    java基础--常用函数总结 2019-3-16-23:28:01-----云林原创 1.split()字符串分割函数 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.Math.flo ...

  4. Java基础__Java中集合类

    ArrayList:有序.可重复.线程不安全.内部使用数组进行存储 LinkedList:有序.可重复.线程不安全.内部使用引用进行存储[可以很方便的进行插入.删除数据] Vector:有序.可重复. ...

  5. Java基础--常用API--字符串相关API

    一.java.lang.String 1.string对象不可变,被final修饰,不能被继承. 2.赋值方式: (1)直接赋值.比如: String name = "rick"; ...

  6. Java 基础 常用API (Object类,String类,StringBuffer类)

    Java API Java 的API(API: Application(应用) Programming(程序) Interface(接口)) Java API就是JDK中提供给我们使用的类,这些类将底 ...

  7. Java 基础 常用API (System类,Math类,Arrays, BigInteger,)

    基本类型包装类 基本类型包装类概述 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类 ...

  8. Java 基础 常用API ( 正则表达式,Date类,DateFormat类,Calendar类 )

    正则表达式 正则表达式的概念 正则表达式(英语:Regular Expression,在代码中常简写为regex). 正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个 ...

  9. Hibernate基础学习(二)—Hibernate相关API介绍

    一.Hibernate的核心接口      所有的Hibernate应用中都会访问Hibernate的5个核心接口.      (1)Configuration接口: 配置Hibernate,启动Hi ...

随机推荐

  1. Python with MYSQL - sytax problem

    Con= MySQLdb.connect(host=',db='test') cur=Con.cursor() cur.execute('insert into staff_daily(Date,Na ...

  2. Linux_笔记_01_设置静态IP与 SecureCRT连接Linux

    步骤一至三,即可设置好静态IP 步骤四至九,使SecureCRT连接Linux 步骤一:编辑ifcfg-eth0 文件 1.打开ifcfg-eth0 文件 使用命令:vi /etc/sysconfig ...

  3. L105

    A pill could soon radio signals from inside your gut to help doctors diagnose diseases from ulcers t ...

  4. Android数据传递的五种方法汇总

    Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,我把常用的几种 方法都收集到了一起.它们各有利弊,有各自的应用场景. 我现在把它们集中到一个例子中展示,在例 ...

  5. SQLite优化方法

    1.建表优化 SQLite的数据库本质文件读写操作,频繁操作打开和关闭是很耗时和浪费资源的: 优化方法事务机制: 这里要注意一点:事务的开启是要锁定DB的,其他对DB的写入操作都是无法成功的. db. ...

  6. tensorflow CUDA 9.0安装成功

    berli@berli-dev:~/tensorflow$ bazel-bin/tensorflow/examples/label_image/label_image 2017-12-18 00:04 ...

  7. hdp 集群问题解决记录

    2019-04-23 14:16:21,769 WARN namenode.FSImage (EditLogFileInputStream.java:scanEditLog(359)) - Caugh ...

  8. 【LeetCode】081. Search in Rotated Sorted Array II

    题目: Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would t ...

  9. Oracle 12c 新特性之 PDB 级别闪回数据库

    在Oracle Database 12.1中,闪回数据库操作仅限于 CDB ,Oracle Database 12.2支持 CDB 与 PDB 数据库的闪回. PDB 的还原点种类:1. normal ...

  10. PCB设计基础及技巧

    一.设计步骤 (1)PCB布局 先放置接口类外设: 根据飞线的接口方向,定位各个模块的方位: 局部模块化(按照一个方向逐个局部化): (2)PCB布线 设置设计规则: 先布过孔(电源.地.长线),防止 ...