欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java基础--常用API--集合类相关API

程序员文章站 2022-06-28 21:08:03
一、泛型 1、泛型的本质是将类型参数化,即将数据类型作为参数。 2、泛型可以在编译期进行检查,其所有的强制转换是隐式且自动的,提高了代码的安全性。 3、泛型可以用在类(泛型类)、接口(泛型接口)、方法(泛型方法)的创建。 4、泛型的类型参数只能为引用类型,不能为基本类型。 二、常用集合类 1、体系分 ......

一、泛型

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

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

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

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

 

二、常用集合类

1、体系分类:

  (1)collection体系: set、list、queue。
    set:元素无序且不可重复。hashset,treeset。
    list:元素有序且可重复。linkedlist,arraylist。
    queue:队列,先进先出。deque。

  (2)map体系:hashmap、treemap。

 

2、分类如下

Java基础--常用API--集合类相关API

 

3、集合与数组的区别

Java基础--常用API--集合类相关API

 

 

三、collection集合

1、相关方法:

Java基础--常用API--集合类相关API

 

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集合的区别:

Java基础--常用API--集合类相关API

 

2、list:

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

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

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

Java基础--常用API--集合类相关API

 

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、总结:

Java基础--常用API--集合类相关API

 

五、队列与栈

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
*/
}

Java基础--常用API--集合类相关API

 

  3、hashtable与hashmap的区别:

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

Java基础--常用API--集合类相关API

 

  4、treemap:

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

Java基础--常用API--集合类相关API

 

七、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