概述
Collection集合和常用数据结构
一、collection和collections的区别
collection是集合类的上层接口,本身是一个接口,里面包含了一些集合的基本操作。
collections是集合类的一个工具类,里面提供了一些静态的方法可以直接操作集合对象
比如:1、Collections.addAll( coll ,”1”,”2”) ; //一次添加多个数据进集合coll
2、Collections.shuffle(coll); //打乱集合coll中的顺序
3、Collections.sort(coll); //对coll集合排序
4、Collections.srort(coll,new Compartor()); //更改排序规则
二、Collection集合
1、栈Stack 先进后出
//初始化一个栈
Stack<Integer> stack = new Stack<Integer>();
//数据进栈
stack.push("value");
//数据出栈
stack.pop();
//取出栈顶值(且值不会被弹出栈)
stack.peek();
//判断栈是否为空
stack.isEmpty();
栈的应用:用两个栈来实现队列
(原理把一组数据放进栈1后,在将栈1的数据弹出放进栈2,这样数据完成了一次交换,第一个入栈的数据,在栈1中是在最后面,在栈2中是在最上面,栈2的栈顶,就是构建的队列的头,栈1的栈顶,就是队列的尾。)
public class Solutcion{
//初始化两个栈
Stack<Integer> stack1 = new Stack<Integer>();
Stack<Integer> stack2 = new Stack<Integer>();
//入队操作,入队的数据就先存储在stack1中
public void puph(int node){
stack1.push(node);
}
//出队操作,出队先进stack1的数据传个stack2,同时会清空stack1,那么下次数据进入stack1的时候 数据的顺序是不会被改变的。
public int pop(){
//如果stack2为空就从stack1中获得数据 不为空就直接弹栈
if(stack2.isEmpty()){
//将stack1的所有数据传给stack2
while(!stack1.isEmpty()){
//stack1弹栈的同时,stack2进栈
stack2.push(stack1.pop());
}
}
//返回stack2的栈顶元素,即队列的头部元素
return stack2.pop();
}
}
三、队列Queue 先进先出
队列的基本操作 LinkedList集合实现了queue接口,可以当作Queue使用
//初始化队列
Queue<Integer> queue = new LinkedList<>();
//添加有两个方法 add和offer add添加失败会报错,offer添加失败返回false
//移除队首:poll()和remove(), 如果队为空,poll会返回null.reomve会抛出异常
//获得队首且不移除:peek()和element(),队列为空,peek返回ull,element会抛出异常
//因此推荐使用 offer(),poll(),peek()进行操作
queue.offer(12);
queue.poll();
queue.peek();
四、Set集合 无序(不会记住元素的添加顺序)、不可不重复
4.1 HashSet
HashSet是接口的典型实现,使用set集合时多数是使用HashSet类来实现。HashSet按Hash算法存储集合中的元素,因此具有很好的存取和查找功能。底层数据结构是哈希表
哈希表是指一个元素为链表的数组,综合楼数组与链表的优点
HashSet特点:
无序,存储顺序与添加顺序可能会不一样
HashSet不是同步的
集合元素值可以为NULL
如果使用自定义类,则该类需要重写hashCode()和equals()方法
4.2 LinedHashSet
LinkedHashSet集合也是根据元素的hashCode值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得元素看起来是以插入的顺序保存的,也就是说当遍历集合LinkedHashSet集合里的元素时,集合将会按元素的添加顺序来访问集合里的元素。
五、list集合 有序(按照加入顺序排序)可重复
List集合代表一个元素有序、可重复的集合,集合中每个元素都有其对应的顺序索引。List集合允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。List集合默认按元素的添加顺序设置元素的索引
5.1 ArrayList
ArrayList是基于数组实现的List类,它封装了一个动态的增长的、允许再分配的Object[]数组。(查找快、增删慢)
5.2LinkedList
实现List接口,能对它进行队列操作,即可以根据索引来随机访问集合中的元素。同时它还实现Deque接口,即能将LinkedList当作双端队列使用。自然也可以被当作"栈来使用"(增收快 )
六、Map
map:map集合的key不允许重复
Java.util.HashMap<k,v>集合:
1、hashMap集合底层是哈希表,查询的速度特别快
JDK1.8之后:数组+单向链表/红黑树(链表的长度超过8使用)
2、hashMap集合是一个无序的集合,存进来的顺序和取出来的顺序不一样,因为会进行排序
LinkedHashMap集合继承了HashMap集合:
1、LinkedHashMap集合是哈希表+链表(保证迭代的顺序)
2、LinkedHashMap集合是有序的集合
map接口中常用的方法
Map<String,String> map = new HashMap<String,String>();
//1、加元素 k value
map.put("胡歌","霍建华");
map.put("迪丽热巴","马儿扎哈");
//2、移除元素 根据键值
map.remove("胡歌");
//3、根据键值,获得对应的值
String name = map.get("迪丽热巴");
//4、判断集合中是否包含指定的键
boolean isContains = map.containsKey("胡歌");
//5、获得map集合中所有的key 生成一个set集合 keySet(); 可以用来遍历
Set<String> set = map.keySet();
for(String key : set){
//通过key获得value
String value =map.ge(key);
System.out.println(value);
}
//6、通过迭代器遍历map集合
Interator<String> it = set.iterator();
while(it.hasNext()){
//通过key获得value
String key = it.next();
String value =map.ge(key);
System.out.println(value);
}
//7、map接口中entry对象 类似于c++的pari<T,T>;对象
// entry有getKey()和getValue()两个方法
// 将map集合中所以属性和值,生成对应的entry对象,并保存在set集合中
// map接口中的方法:Set<map.Entry<String,String>> entrySet();
// 通过entyset遍历map
Set<<Map.Entry<String,String>> set = map.entrySet();
Interator<<Map.Entry<String,String>> it = set.iterator();
while(it.hashNext()){
//取出每一个entry对象
<Map.Entry<String,String>> entry = it.next();
String value = entry.getValue;
String key = entry.getKey;
}
Map集合保证key是唯一的:
作为key的元素,必须重写hashCode方法和equals方法。以保证key唯一
set集合也是一样的,set中的类型是重现了hashCode和equals方法的所以可以保持唯一
LinkedHashMap存储进来是有序的,也就是存进来是怎么样的,拿出来就是怎么样的。
HashTable 集合
特点:
1、非空对象都可以作为键或值(hashMap可以存储null值,null键)
2、同步的代表单线程,线程安全,但是速度慢
3、底层也是哈希表
4、HashTable和vector都在1.2后被更先进的集合(hashMap,ArrayList)取代了
5、而HashTable的子类Properties依然活跃。Properties集合是一个唯一和IO流相结合的集合
数组
数组的声明的两种方式:
数据类型[] 数组名字 : int[] a;
数据类型 数组名字[] : int a[];
数组的初始化的方式
int[] a = new int[20];
int[] a = new int[]{1,2,3};
int[] a = {1,2,3};
数组常用操作
//根据数组创建ArrayList
String[] str1 = {"a","b"};
ArrayList<String> array = new ArrayList<String>(Arrays.asList(str1));
//利用list判断数组内部是否包含某个值
boolean isContain = Arrays.asList(str1).contains("a");
//连接两个数组
int[] a1 = {1,2,3};
int[] a2 = {4,5,6};
int[] a3 = ArrayUtils.addAll(a1,a2);
//根据分隔符拼接数组元素
String s = StringUtils.join(str1,"-");
最后
以上就是强健硬币为你收集整理的JAVA Collection集合和常用数据结构的全部内容,希望文章能够帮你解决JAVA Collection集合和常用数据结构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复