Java-数组 集合 队列




数组

数组是一种数据的排列组合的方式,适合数据量小的情况
定义数组的方式
在这里插入图片描述
如 int[] is = { 5, 8, 3, 12, 24, 30, 18, 1, 10, 13 };
数组的位置这index起始为0 对应数组元素
在这里插入图片描述

数组的常见方法

  1. 声明数组
String[] aArray = new String[5];
String[] bArray = {"a","b","c", "d", "e"};
String[] cArray = new String[]{"a","b","c","d","e"};
  1. 打印数组
int[] intArray = { 1, 2, 3, 4, 5 };
String intArrayString = Arrays.toString(intArray);
 
// print directly will print reference value
System.out.println(intArray);// [I@7150bd4d
 
System.out.println(intArrayString);// [1, 2, 3, 4, 5]
  1. 从数组创建一个 ArrayList
String[] stringArray = { "a", "b", "c", "d", "e" };
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));
System.out.println(arrayList);
// [a, b, c, d, e]
  1. 检查数组是否包含某一个值
String[] stringArray = { "a", "b", "c", "d", "e" };
boolean b = Arrays.asList(stringArray).contains("a");
System.out.println(b);// true
  1. 合并数组
int[] intArray = { 1, 2, 3, 4, 5 };
int[] intArray2 = { 6, 7, 8, 9, 10 };
// Apache Commons Lang library
int[] combinedIntArray = ArrayUtils.addAll(intArray, intArray2);
  1. 一行代码声明数组
method(new String[]{"a", "b", "c", "d", "e"});
  1. 把数组中的元素用指定的分隔符连接起来
// containing the provided list of elements
// Apache common lang
String j = StringUtils.join(new String[] { "a", "b", "c" }, ", ");
System.out.println(j);// a, b, c
  1. 把一个 ArrayList 转换成数组
String[] stringArray = { "a", "b", "c", "d", "e" };
ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(stringArray));
String[] stringArr = new String[arrayList.size()];
arrayList.toArray(stringArr);
for (String s : stringArr)
	System.out.println(s);
  1. 把一个数组转换成 Set
Set<String> set = new HashSet<String>(Arrays.asList(stringArray));
System.out.println(set);//[d, e, b, c, a]
  1. 反转数组
int[] intArray = { 1, 2, 3, 4, 5 };
ArrayUtils.reverse(intArray);
System.out.println(Arrays.toString(intArray));//[5, 4, 3, 2, 1]
  1. 移除数组中的元素
int[] intArray = { 1, 2, 3, 4, 5 };
int[] removed = ArrayUtils.removeElement(intArray, 3);//create a new array
System.out.println(Arrays.toString(removed));

附加的方法 - 把 int 转换成字节数组

byte[] bytes = ByteBuffer.allocate(4).putInt(8).array();
for (byte t : bytes) {
   System.out.format("0x%x ", t);

集合

什么是集合

集合类存放于java.util包中。
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
集合类型主要有3种:set(集)、list(列表)和map(映射)。
通俗的说,集合就是一个放数据的容器,准确的说是放数据对象引用的容器

集合分类

Collection接口是集合类的根接口,Java中没有提供这个接口的直接的实现类。但是却让其被继承产生了两个接口,就是Set和ListSet中不能包含重复的元素。List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。

Map是Java.util包中的另一个接口,它和Collection接口没有关系,是相互独立的,但是都属于集合类的一部分。Map包含了key-value对。Map不能包含重复的key,但是可以包含相同的value。
Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:
1.hasNext()是否还有下一个元素。
2.next()返回下一个元素。
3.remove()删除当前元素
简易关系如下图所述
在这里插入图片描述
集合主要分为Collection和Map2个接口
Collection又分别被List和Set继承
List被AbstractList实现,然后分为3个子类,ArrayList,LinkList和Vector
Set被AbstractSet实现,又分为HashSet和TreeSet
而Map衍生出的集合分为HashMap,HashTable和TreeMap

Collection接口

Collection接口是集合类的根接口
Collection接口中定义的方法:

  • int size():返回集合中元素的数量
  • boolean isEmpty():判断集合中是否包含元素,不包含返回true
  • boolean contains(Object o):判断当前集合中是否包含给定的元素
  • void clear():清空集合
  • boolean add(E e):向集合中添加元素,添加成功返回true
  • boolean remove(Object o):从集合中删除给定的元素,删除成功返回true
  • boolean addAll(Collection c):将给定集合中的元素添加到当前集合
  • boolean removeAll(Collection c):删除当前集合中与给定集合相同的元素
  • boolean retainAll(Collection c):只保留当前集合中与给定集合相同的元素
  • Iterator iterator():返回用于遍历集合的迭代器

List和Set 区别(数据结构,存储特点,线程安全)

集合里面的各类区别围绕 是否有序、是否重复、数据结构、存储特点,线程安全
集合里面的各类区别围绕 是否有序、是否重复、数据结构、存储特点,线程安全
集合里面的各类区别围绕 是否有序、是否重复、数据结构、存储特点,线程安全

  • List:集合:是一个可重复集,并且是一个有序集合
    1.可以允许重复的对象。
    2.可以插入多个null元素。
    3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
    常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适
  • Set:元素唯一的不可重复的无序集合
    1.不允许重复对象
    2.只允许一个 null 元素
    3.无序容器,你无法保证每个元素的存储顺序,TreeSet通过Comparator 或Comparable 维护了一个排序顺序。
    Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器

ArrayList,LinkList和Vector比较(数据结构,存储特点,线程安全)

ArrayList 底层是有序的数组结构,,查询和修改快,线程不安全
LinkList 底层是无序的链表结构的,增和删比较快,查询和修改比较慢,线程不安全
Vector 底层是数组结构,线程安全

HashMap和Hashtable的区别(数据结构,存储特点,线程安全)

数据结构
HashMap和Hashtable都实现了Map接口,并且都是key-value的数据结构
存储特点
HashMap允许将null值作为key或value,但Hashtable不允许(会抛出NullPointerException)
线程安全
Hashtable是线程安全的,也就是说是线程同步的,而HashMap是线程不安全的。也就是说在单线程环境下应该用HashMap,这样效率更高

队列:Queue(接口)

队列:Queue(接口)

  • 队列也是用来保存一组数据,但是有别于数组和集合,队列存取元素必须遵循先进先出的原则(FIFO)
  • 双端队列 Deque
    所谓的双端队列:队列的两端都可以出队入队当我们使用双端队列存取元素时,只从一侧操作时,就形成了一种存取模式:先进后出,就形成了经典的数据结构:栈,使用栈是为了操作具有可追溯性,通常我们事先某个操作有后退功能
  • LinkedList具有存取效率高的特点,所以java使用该类作为队列的实现类使用
    单端队列类Queue
	Queue<String> queue = new LinkedList<String>();

双端队列类Deque

	Deque<String> stack = new LinkedList<String>();
  • 队列的遍历是一次性的,想要获取队列中的某一个元素,就必须将队列中该元素之前的所有的元素从队列中取出之后才能使用和访问(因为使用LinkedList作为队列的实现类使用)
队列的相关方法

单端队列Queue

  • Queue的插入操作
boolean add(E e)	// 向队列末尾追加新元素(入队),添加失败,抛出异常
boolean offer(E e)  // 向队列末尾追加新元素(入队),添加失败,返回false

注意 : 队列中不允许插入为null的元素,否则会报空指针.推荐使用offer()

  • Queue的取出操作
/**
* 相同点:
* 都是Queue的取出操作,获取并从队列中删除队首元素(出队)

* 不同点:
* 当处于空队列状态时,remove()方法会抛出队列为空,没有匹配元素的的异常
* 而poll()方法则会返回null值,不会报异常.推荐使用poll()来取出元素
* Queue的检索操作
 */
E remove();
E poll();
  • Queue的检索操作
/**
 * 相同点:
 * 都是Queue的检索操作,获取队首元素,但不将其从对列中删除.
 * 
 * 不同点:
 * 当处于空队列状态时,element()方法会抛出队列为空,没有匹配元素的的异常
 * 而peek()方法则会返回null值,不会报异常.
 */
E element();
E peek();

双端队列Deque
由于双端队列接口实现了队列接口,因此它支持队列接口的所有方法。此外,双端队列接口提供了以下方法,可用于对双端队列对象执行各种操作

Map接口

hashmap便利集合的方式

	①遍历map value值map.values()
		for(String testValue1:map.values()){
			syso(testValue1)
		}
	②遍历map值	keyset()方法
		for(String testkey:map.keyset()){
			syso(testkey)
			String value = map.get(testkey)
		}
	③通过entrySet()方法
	for<Entry<string string>>entry = map.entrySet();
		string key = entry.getKey();
		string value = entry.getValue();

HashMap 和Hashtable 区别

HashMap是最常用的Map,它根据键的HashCode值存储数据,根据键可直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的因为键对象不可以重复,所以HashMap最多只允许一条记录的键为Null,允许多条记录的值为Null,是非同步的线程不安全

Hashtable与HashMap类似,是HashMap的线程安全版,它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢,它继承自Dictionary类,不同的是它不允许记录的键或者值为null,同时效率较低

另外的几种Map集合

  • ConcurrentHashMap
    线程安全,并且锁分离。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。

  • LinkedHashMap
    LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,有HashMap的全部特性。

  • TreeMap
    TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。不允许key值为空,非同步的;

List 和 Map 区别(数据结构,存储特点)

数据结构
在数据结构方面,List存储的是单列数据的集合,而Map存储的是key、value类型的数据集合。
存储数据
在数据存储方面,List存储的数据是有序且可以重复的,而Map中存储的数据是无序且key值不能重复(value值可以重复

Iterator接口

Iterator接口的使用和注意事项

Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口
迭代器接口要求实现其的类必须提供三种方法
hasNext() :遍历过程中,判定是否还有下一个元素(从Collection对象的第一个元素开始)
next() : 遍历该元素。(即取出下一个元素)
remove(): 移除刚刚遍历过的元素。
从定义可以发现,该三个方法经常是被搭配使用的。

Iteraotr it= arrayList.Iterator();
while(it.hasNext())
{ print(it.next());
	it.remove();
}

基本思路为:在遍历下一个元素前,先判断其是否存在。对于想删除的元素,必须先遍历其,故 remove()方法总是接在 next()方法之后(不然会出现空指针异常)

ListIterator:List特有迭代器

  • ①ListIterator是List特有迭代器,是Iterator的子接口
 public interface ListIterator extends Iterator{
	ListIterator<E> ListIterator();
 }
  • ②比起迭代器Iterator接口,除了有hasNext():next() :remove(): ListIterator比它多了几个方法
    所以Iterator只能对元素进行获取和删除,ListIterator还可以对List内元素进行修改和添加
void hasPrevious() 	//判断游标前面是否有元素;

Object previous() 	//返回游标前面的元素,同时游标前移一位游标前没有元素
					//就报 java.util.NoSuchElementException 的错,所以使用前最好判断一下;

int nextIndex() 	//返回游标后边元素的索引位置,初始为0;遍历N个元素结束时为N;

int previousIndex() //返回游标前面元素的位置,初始时为-1,
					//同时报java.util.NoSuchElementException 错;

void add(E) 		//将指定元素插入列表(可选操作),该元素将插入next返回的下一个元素前面

void set(E) 		//指定元素E替换调用next()或者previous()返回的最后一元素。

//注意,当没有迭代,也就是没有调用next()或者 previous() 
//直接调用 set 时会报 java.lang.IllegalStateException错;

void remove() 	//删除迭代器最后一次操作的元素,注意事项和set一样。
  • ListIterator 有两种获取方式
    List.listIterator()
    List.listIterator(int location)

Iterater和ListIterator之间有什么区别

A.Iterator只可以向前遍历
B.LIstIterator可以双向遍历
C.ListIterator只能遍历List
D.Iterator只能对元素进行获取和删除,ListIterator还可以对List内元素进行修改和添加

常见的遍历的几种方式

在类集中提供了以下四种的常见输出方式:
1)Iterator:迭代输出,是使用最多的输出方式。
2)ListIterator:List特有迭代器,是Iterator的子接口,专门用于输出List中的内容。
3)foreach输出:增强For循环化,可以输出数组或集合。
4)for循环

Collection框架中实现比较要实现什么接口

第一种,实体类实现Comparable接口,并实现 compareTo(T t) 方法,我们称为内部比较器
第二种,创建一个比较器,这个比较器要实现Comparator接口的 compare(T t1, T t2)

Collection和Collections的区别

Collection是集合类上级接口,继承他的主要有List和Set
Collections(java.util包下)是集合类的帮助类,提供了对集合的搜索、排序、线程安全化等操作


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值