目录
1.Collection 接口-定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式
一、集合概念:
在java开发过程中,通常需要保存一些要变长的数据集合,于是我们需要一些能动态增长长度的容器来保存数据,于是就要用到各种各样的数据结构,java中对于各数据结构的实现就是我们用到的集合。
二、集合API
三、Collection接口与 List接口
1.Collection 接口-定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式
2.List接口:
(1)ArrayList:
顺序结构,采用数组方式存储数据;
(2)LinkList:
链表;
(3)Vector:
数组实现,添加同步锁,多线程安全;
(4)代码实现:
import java.util.*;
public class arr {
/*
List接口实现类
ArrayList 可以保存重复元素,底层是数组实现,添加元素的类型可以使任意类型的
虽然集合中默认是可以添加任意数据类型,但是后续处理时,会出现类型转换问题;
所有java中的集合都支持自定义类型(泛型 把类型当做参数传递);
*/
public static void main(String[] args) {
ArrayList<String> array=new ArrayList<>();
array.add("kjo");
ArrayList<Integer>arrayl=new ArrayList<>();
array.add("s");//向末尾添加元素,会自动扩容
array.add("s");
array.add("s");
array.add("s");
array.add("s");
array.add("s");
array.add("s");
array.add("s");
array.add("s");
array.add("s");
array.add("s");
array.add(2,"c");//向指定位置添加元素,从零开始,位置需在实际装入元素个数范围内;
array.remove("s");//根据元素内容删除数据,只删除匹配的第一个元素;
String s=array.remove(2);//删除并返回指定位置的元素;
//array.clear();清空集合;
//System.out.println(array.indexOf("c"));返回元素第一次出现的位置;
//System.out.println(array.contains("s"));判断是否包含指定元素;
//System.out.println(array.get(2));获得指定位置上的元素;
//System.out.println(array.isEmpty());判断集合中的元素是否为空;
//array.set(2,"f");替换指定位置的元素
//System.out.println(array.size());获得集合中实际元素的个数,也是集合的长度;
LinkedList<String> link=new LinkedList<>();
link.add("d");
link.add("d");
link.add("c");
link.add("b");
link.add("v");
link.add("d");
ListIterator<String> itr=link.listIterator(link.size());
while(itr.hasPrevious()){
String r=itr.previous();
if (r.equals("d")){
itr.remove();
}
}
System.out.println(link);
}
}
class Link{
/*
List接口实现类
LinkedList
底层由链表实现,每个数据封装在node中;
*/
/*
数组利用率可能会有浪费的,但是建表不会浪费空间
链表中间增减元素时间复杂度为o(1);数组时间复杂度为o(n);
而数组查找元素的时间复杂度为o(1),链表则为o(n);
*/
public static void main(String[] args) {
LinkedList<String> link =new LinkedList<>();
link.add("w");
link.add("q");
link.add("e");
link.add("r");
link.add(3,"x");
link.contains("jhk");
link.remove("s");
System.out.println(link.contains("j"));
}
}
class vect{
/*
Vector
数组实现,有synchronized修饰,可支持多线程操作;
多线程,安全的;
*/
public static void main(String[] args) {
Vector<String> ve=new Vector<>();
ve.add("1");
ve.add("2");
ve.add("3");
ve.add("4");
ve.add("4");
ve.add("5");
ve.add("6");
ve.add("7");
ve.add("8");
ve.add("9");
ve.add("10");
//与ArrayList一样,初始长度为10,若超过,则会扩容相当于自身50%的长度;
}
}
(5)List类的遍历方式:
/*1.for循环遍历:
for(int x=0;x<array.size();x++){
System.out.println(array.get(x));
}
for循环是支持删除元素的,但后面的元素会向前移动,需要控制索引;
*/
/*2.增强for循环:
for (String c : array){
System.out.println(c);
}
用来从头到尾遍历的,不能指定开始与结束位置,不支持删除元素;
*/
/*3.用迭代器进行遍历:
Iterator<String> it= array.iterator();
while(it.hasNext){
String e=it.next();
if(e.equals("a")){
it.remove();//迭代器中的删除方法;
}
}
迭代器支持删除元素且不会漏掉;
*/
四、Set接口:
1、HashSet:
元素是无序的(既不是添加顺序,也不是自然顺序) 向hashset中添加元素时,是如何判断元素是否重复的 底层用到hashCode()和equals()方法,“sfsgdhjk” 用内容计算一个hash值(整数),用hash值比较速度快;
但是hash值不安全,有可能hash值相同但内容不一样; 所以当hash值相同时,调用equals()判断内容 这样提高了代码效率也保证了安全;
代码实现:
class setdemo implements Comparable<setdemo>{
int num;
String name;
setdemo(){}
setdemo(int num,String name){
this.num=num;
this.name=name;
}
@Override
public int compareTo(setdemo o) {
return this.num-o.num;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
setdemo setdemo = (setdemo) o;
return num == setdemo.num &&
name.equals(setdemo.name);
}
@Override
public int hashCode() {
return Objects.hash(num, name);
}
@Override
public String toString() {
return "\t"+num + " "+name ;
}
public static void main(String[] args) {
HashSet<setdemo> s=new HashSet<>();
setdemo s1=new setdemo(101,"张三");
setdemo s2=new setdemo(102,"李四");
setdemo s3=new setdemo(103,"王五");
setdemo s4=new setdemo(104,"刘六");
s.add(s1);
s.add(s2);Iterator it=s.iterator();
s.add(s3);
s.add(s4);
System.out.println(s.toString());
/*
添加时判断会调用类中hashCode()计算hash值,类中没有hashCode()会调用父类中的hashCode方法;
调用父类的hashCod()是用地址来计算的,若是new两个一模一样的对象,地址会不一样,则两个对象hash值不同;
在本类中重写hashCode()方法和equals(),用内容来计算,则就算new多个相同内容的新对象也不影响;
*/
}
}
2、TreeSet:
底层是树形结构;
代码实现:
class treesetdemo{
/*
Set 不能存储重复元素
TreeSet
底层是树形结构
添加进来的元素可以排序(有序的,不是添加顺序,是元素的自然顺序)
*/
public static void main(String[] args) {
TreeSet<String> ts=new TreeSet<>();
ts.add("9asdf");
ts.add("sgdf");
ts.add("chg");
ts.add("067y");
System.out.println(ts);
ts.pollLast();//删除并返回最后一个元素
ts.pollFirst();//删除并返回第一个元素
}
}
五、Map接口:
1.Map :
键 值对
键不能重复,值可以重复 一个键映射到一个值 HashMap中,键是无序的;
TreeMap 底层使用树形结构 键能排序,键的类型必须实现compare接口
代码实现:
class hashmapdemo{
public static void main(String[] args) {
HashMap<String,String> in=new HashMap<>();
in.put("1","3");
in.put("s","d");
in.put("f","gf");
HashMap<String,String>hm=new HashMap<>();
hm.put("e","s");
hm.put("s","f");
hm.put("f","c");
hm.put("rt","c");
hm.put("e","c");
System.out.println(hm.get("s"));
//hm.clear();删除键值映射,返回该键的值;
System.out.println(hm.containsKey("e"));
System.out.println(hm.containsValue("c"));
System.out.println(hm.size());
Collection<String> key=hm.keySet();
System.out.println(key);
Collection<String> value=hm.values();
System.out.println(value);
}
}
2.Hashtable:
底层结构与HashMap相同,但是相对于HashMap来说安全,其方法添加了synchronized; TreeMap允许键或值中存放null; Hashtable不允许存放null关键字;
代码实现:
class Hashtabledemo{
public static void main(String[] args) {
Hashtable<String,String>ht=new Hashtable<>();
ht.put("s","g");
ht.put("s","v");
ht.put("e","x");
ht.put("d","n");
//通过entrySet 获取到一个Entry类型的集合,entry中放有键值;
Set<Map.Entry<String,String>> entries=ht.entrySet();
for(Map.Entry entry : entries){
System.out.println(entry.getKey()+":"+entry.getValue());
}
}
}
Collection代码实现:
class CollectionsDemo{
/*
类型...参数名 可变长度的参数,本质是数组
一个参数列表中,只能有一个可变长度的参数,而且必须放在参数列表的末尾
可以传入任意个参数;
*/
public static void test(int b,int ...a){
}
public static void main(String[] args) {
ArrayList<Integer> arr=new ArrayList<>();
arr.add(2);
arr.add(3);
Collections.addAll(arr,1,2,3,4,5,6,7,8,9,10);
Collections.sort(arr);
Collections.swap(arr,5,7);
System.out.println(Collections.binarySearch(arr,2));
System.out.println(arr);
ArrayList<Integer> arr1=new ArrayList<>();
arr1.add(13);
arr1.add(26);
arr1.add(35);
Collections.copy(arr,arr1);//将第二个几何元素复制到第一个集合中,注意第一个集合的size要大于第二个集合的size;
System.out.println(arr);
Collections.reverse(arr);//逆序
Collections.shuffle(arr);//随机顺序排放
}
}