-1-3 java集合框架基础 java集合体系结构 Collection 常用java集合框架 如何选择集合 迭代器 泛型 通配符概念 Properties 集合 迭代器

集合又称之为容器存储对象的一种方式

•数组虽然也可以存储对象,但长度是固定的;显然需要可变长度的容器

集合和数组的区别?

                A:长度区别

                        数组固定

                        集合可变

                B:内容区别

                        数组可以是基本类型,也可以是引用类型

                        集合只能是引用类型

                C:元素内容

                        数组只能存储同一种类型

                        集合可以存储不同类型(其实集合一般存储的也是同一种类型)

基本框架

Collection

        |--List

                |--ArrayList

                |--Vector

                |--LinkedList

        |--Set

                |--HashSet

                |--TreeSet

集合框架中常用关系图

Collection接口有两个子接口:

List(列表) ,Set(集)

List:可存放重复元素,元素存取是有序的。

Set:不可以存放重复元素,元素存取是无序的。

List常用方法

Vector:底层数据结构是数组,线程安全,但速度慢,已被  ArrayList替代。

•public void addElement(E obj)

•public E elementAt(intindex)

•publicEnumerationelements()

ArrayList:底层数据结构是数组 ,线程不安全,查询速度快。

LinkedList:底层数据结构是链表,链表结构,增删速度快。

•public void addFirst(E e)及addLast(E e)

•public E getFirst()及getLast()

•public E removeFirst()及public E removeLast()

取出LIst集合中元素的方式:

•get(int  index):通过脚标获取元素。

•iterator():通过迭代方法获取迭代器对象。

   public static <T> void sort(List<T> list)

                public static <T> int binarySearch(List<?> list,T key)

                public static <T> T max(Collection<?> coll)

                public static void reverse(List<?> list)

                public static void shuffle(List<?> list)

迭代

迭代是取出集合中元素的一种方式。

因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。

用法:

for(Iterator iter = iterator();iter.hasNext();  )
{   System.out.println(iter.next());
} 
  Iterator iter = list.iterator();
while(iter.hasNext())
{   System.out.println(iter.next());
}

迭代器在Collcection接口中是通用的,它替代了Vector类中的Enumeration(枚举)。

迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException。

迭代器的next方法返回值类型是Object,所以要记得类型转换。

Set

HashSet:线程不安全,存取速度快。

通过equals方法和hashCode方法来保证元素的唯一性。

不保证set的迭代顺序,也不保证顺序是恒久不变的

1:底层数据结构是哈希表(是一个元素为链表的数组)

               2:哈希表底层依赖两个方法:hashCode()和equals()

                  执行顺序:

                        首先比较哈希值是否相同

                                相同:继续执行equals()方法

                                        返回true:元素重复了,不添加

                                        返回false:直接把元素添加到集合

                                不同:就直接把元素添加到集合

TreeSet: 线程不安全,可以对Set集合中的   元素进行排序。

通过compareTo或者compare方法中的来保证元素的唯一性。元素是以二叉树的形式存放的。

1:底层数据结构是红黑树(是一个自平衡的二叉树)

2:保证元素的排序方式

        a:自然排序(元素具备比较性)

                让元素所属的类实现Comparable接口

        b:比较器排序(集合具备比较性)

                让集合构造方法接收Comparator的实现类对象

LinkedHashSet:

元素有序唯一

由链表保证元素有序

由哈希表保证元素唯一

泛型

早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。

也就存在这隐患,所以Java提供了泛型来解决这个安全问题。

JDK1.5以后出现的机制

提高了程序的安全性

将运行期遇到的问题转移到了编译期

省去了类型强转的麻烦

泛型类的出现优化了程序设计

泛型类

  •把泛型定义在类上

  •格式:public class 类名<泛型类型1,…>

  •注意:泛型类型必须是引用类型

泛型方法

  •把泛型定义在方法上

  •格式:public <泛型类型> 返回类型 方法名(泛型类型 .)

泛型接口

  •把泛型定义在接口上

  •格式:public  interface 接口名<泛型类型1…>

泛型通配符<?>

任意类型,如果没有明确,那么就是Object以及任意的Java类了

? extends E

向下限定,E及其子类

? super E

向上限定,E及其父类

Map

Map与Collection在集合框架中属并列存在

Map存储的是键值对

Map存储元素使用put方法,Collection使用add方法

Map集合没有直接取出所有元素的方法(可以get获取指定的),而是先转成Set集合,在通过迭代获取元素

Map集合中键要保证唯一性

Hashtable:线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。

HashMap:线程不安全,速度快,允许存放null键,null值。 键是哈希表结构,可以保证键的唯一性

TreeMap:对键进行排序,排序原理与TreeSet相同。键是红黑树结构,可以保证键的排序和唯一性

LinkedHashMap: Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。

集合框架工具类 Collections

对集合进行查找

取出集合中的最大值,最小值

对List集合进行排序

foreach

for(数据类型 变量名 : 数组或Collection集合) {         执行语句; }      

常见数据结构

队列

数组

链表

哈希表

静态导入

•格式:import static 包名….类名.方法名;

•可以直接导入到方法的级别

注意事项

•方法必须是静态的

如果有多个同名的静态方法,容易不知道使用谁?这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用

可变参数

•定义方法的时候不知道该定义多少个参数

格式

•修饰符 返回值类型 方法名(数据类型…  变量名){}

•注意:

•这里的变量其实是一个数组

•如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个

Arrays工具类中的一个方法

•public static <T> List<T> asList(T... a)

集合选择

Collection

        |--List        有序,可重复

                |--ArrayList

                        底层数据结构是数组,查询快,增删慢。

                        线程不安全,效率高

                |--Vector

                        底层数据结构是数组,查询快,增删慢。

                        线程安全,效率低

                |--LinkedList

                        底层数据结构是链表,查询慢,增删快。

                        线程不安全,效率高

        |--Set        无序,唯一

                |--HashSet

                        底层数据结构是哈希表。

                        如何保证元素唯一性的呢?

                                依赖两个方法:hashCode()和equals()

                                开发中自动生成这两个方法即可

                        |--LinkedHashSet

                                底层数据结构是链表和哈希表

                                由链表保证元素有序

                                由哈希表保证元素唯一

                |--TreeSet

                        底层数据结构是红黑树。

                        如何保证元素排序的呢?

                                自然排序

                                比较器排序

                        如何保证元素唯一性的呢?

                                根据比较的返回值是否是0来决定

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

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

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

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

Properties集合

Properties作为Map集合的使用

Properties的特殊功能

•public Object setProperty(String key,String value)

•public String getProperty(String key)

•public Set<String> stringPropertyNames()

Properties和IO流的结合使用

•public void load(Reader reader)

•public void store(Writer writer,String comments)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小灰灰

JDK容器学习之LinkedHashMap (一):底层存储结构分析

LinkedHashMap 底层存储结构分析 HashMap 是无序的kv键值对容器,TreeMap 则是根据key进行排序的kv键值对容器,而LinkedH...

22150
来自专栏吾爱乐享

java之学习集合的并发修改及案例

14630
来自专栏云霄雨霁

字符串查找----三向单词查找树

23510
来自专栏java一日一条

Java核心技术点之集合框架

Java集合框架由Java类库的一系列接口、抽象类以及具体实现类组成。我们这里所说的集合就是把一组对象组织到一起,然后再根据不同的需求操纵这些数据。集合类型就是...

8510
来自专栏郭耀华‘s Blog

Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法

Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法 ArrayList 和Vector是采用...

42580
来自专栏Bingo的深度学习杂货店

Q14 Longest Common Prefix

Write a function to find the longest common prefix string amongst an array of st...

38680
来自专栏微信公众号:Java团长

大公司最喜欢问的Java集合类面试题

看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧。

10620
来自专栏Java学习网

Java中实现解码字符串的方法,实用代码

需求:给定一个经过编码的字符串,要求返回它的解码后的字符串。 编码规则是:k[str],这个编码的含义是str出现了k次,k是一个正整数。 具体例子: s = ...

31150
来自专栏吾爱乐享

java之学习泛型的概述和基本使用

16660
来自专栏编程

《4》python数据类型和变量

(4)python数据类型和变量 ? 整数 Python可以处理任意大小的整数,例如:1,100,-8080,0,等等。 十六进制用0x前缀和0-9,a-f表示...

35890

扫码关注云+社区

领取腾讯云代金券