文章目录
- @[TOC](文章目录)
- 集合
- Collection集合
- List集合
- ArrayList
- LinkedList
- Set集合
- HashSet
- TreeSet
- Map集合
- HashMap
- 迭代器
- Iterator
- ListIterator
- foreach
- Properties
- 小贴士
集合
Collection集合
add()方法用于添加元素 get()方法,用于获取某一下标处的元素 isEmpty()方法返回布尔类型,集合是否为空 size()方法,返回集合的长度 contains()方法,判断集合中是否包含该元素 containsAll()方法,判断某一集合是否包含另一集合的所有元素 remove()方法用于移除元素 removeAll(),移除一个集合中包含另一个集合的所有元素 indexOf()方法,返回某一元素首次出现的下标 lastIndexOf()方法,返回某一元素最后一次出现的下标 equals()方法,用于判断两集合中元素是否相同 subList()方法,用于截取部分元素,得到新集合 LinkedList中特有方法:addFirst()方法,添加元素到首位 addLast()方法,添加元素到末位 getFirst()方法,获取首位元素 getLast(),获取末位元素 removeFirst(),移除首位元素 removeLast(),移除末位元素
public static void main(String[] args) {
//创建Collection对象
Collection<String> c1=new ArrayList();//ArrayList()底层封装的是数组
//集合中添加指定元素
c1.add("路飞");
c1.add("索隆");
c1.add("娜美");
c1.add("山治");
System.out.println(c1);
//移除集合中指定元素,返回布尔类型
System.out.println(c1.remove("山治"));//true
System.out.println(c1.remove("乌索普"));//false
//判断集合是否为空,获取集合元素个数
System.out.println(c1.isEmpty());//false
System.out.println(c1.size());//3
//判段是否包含指定元素
System.out.println(c1.contains("娜美"));//true
System.out.println(c1.contains(""));//false
//c1.clear();//清空元素
System.out.println(c1);//[]
}
List集合
public static void main(String[] args) {
//List是Collection接口的子接口,是一个有序的集合
//创建List的对象
List<String> list=new ArrayList();
list.add("罗宾");
list.add("乌索普");
list.add("弗兰奇");
list.add("布鲁克");
//往指定位置添加元素
list.add(0,"乔巴");
list.add(2,"乔巴");
list.add("乔巴");//不指定位置,则添加在最后
System.out.println(list);
//获取指定下标处的元素
System.out.println(list.get(0));
System.out.println(list.get(2));
//删除指定下标出的元素,并返回该元素
System.out.println(list.remove(0));//乔巴
System.out.println(list);
System.out.println(list.indexOf("乔巴"));//2
System.out.println(list.lastIndexOf("乔巴"));//5
System.out.println(list.lastIndexOf("托尼托尼·乔巴"));//-1,不存在
System.out.println(list);
//获取集合中部分元素组成的新的集合
List<String> list1=list.subList(1,5);//[1,5)
System.out.println(list1);//[乌索普,乔巴,弗兰奇,布鲁克]
//测试集合与集合之间的关系
Collection<String> c2=new ArrayList();
c2.add("罗宾");
c2.add("甚平");
System.out.println("c2="+c2);//c2=[罗宾,甚平]
//判断当前集合是否包含另一个集合中的所有元素
System.out.println("c1是否包含c2:"+c1.containsAll(c2));//c1是否包含c2:false
Collection<String> c3=new ArrayList();
//将另一个集合中的所有元素添加到当前集合中
c3.addAll(c2);
System.out.println(c3);//[罗宾,甚平]
//判段两个集合中的元素是否相同
System.out.println(c3.equals(c2));//true
}
ArrayList
public class ArrayListDemo {
public static void main(String[] args) {
//创建ArrayList集合对象
ArrayList<Student> list=new ArrayList();
//创建学生对象
Role r1=new Role("Luffy",19,"风车村");
Role r2=new Role("Zoro",21,"霜月村");
Role r3=new Role("Nami",20,"可可亚西村");
Role r4=new Role("Usopp",19,"西罗普村");
//往集合添加元素
list.add(r1);
list.add(r2);
list.add(r3);
list.add(r4);
//使用for循环遍历集合
for (int i = 0; i <list.size() ; i++) {
System.out.println(list.get(i));//获取指定下标的元素
}
}
}
class Role{
private String name;
private int age;
private String address;
public Student() {
}
public Student(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
LinkedList
在存储元素前,它会先创建一个节点对象,一个节点对象包括:前引用 元素 后引用。 前引用指向前一个节点的后引用,第一个节点的前引用为null 后引用指向后一个节点的前引用,最后一个节点的后引用为null
public static void main(String[] args) {
//创建LinkedList的对象实例
LinkedList<String> list=new LinkedList();
list.add("前进梅利号");
list.add("飞天梅利号");
list.add("万里阳光号");
System.out.println(list);
System.out.println("--------------(❁´◡`❁)----------------");
//测试特有方法
list.addFirst("出发");
list.addLast("嘻");
System.out.println(list);//[出发,前进梅利号,飞天梅利号,万里阳光号,嘻]
System.out.println("--------------(❁´◡`❁)----------------");
System.out.println(list.getFirst());//出发
System.out.println(list.getLast());//嘻
System.out.println("--------------(❁´◡`❁)----------------");
System.out.println(list.removeFirst());
System.out.println(list.removeLast());
System.out.println(list);//[前进梅利号,飞天梅利号,万里阳光号]
System.out.println("--------------(❁´◡`❁)----------------");
for (int i = 0; i <list.size() ; i++) {
System.out.println(list.get(i));//获取指定下标的元素
}
}
Set集合
set不包含重复元素, 特点:没有下标,不能通过索引获取元素, 元素是无序的,(存入和取出顺序可能不同) 元素不可以重复(包括null) set接口继承父类接口Collection的方法引用
HashSet
HashSet实现了Set接口,不允许重复元素,允许元素值为null,且只有一个,不保证元素顺序 扩充容量,当内容占据0.75倍的内存时,就会扩充内存为前内存的2倍 HashSet(int , float),元素,指定占据多少时扩充
public static void main(String[] args) {
//创建HashSet对象
Set<String> hs1=new HashSet();
//添加元素
boolean b1=hs1.add("香克斯");
hs1.add("路飞");
hs1.add("巴基");
boolean b2=hs1.add("巴基");
System.out.println(hs1);//[香克斯, 路飞, 巴基]
System.out.println("b1:"+b1);//b1:true
System.out.println("b2:"+b2);//b2:false
System.out.println("--------------(❁´◡`❁)----------------");
//测试是否为空,是否包含指定元素,集合大小
System.out.println(hs1.isEmpty());//false
System.out.println(hs1.contains("路飞"));//true
System.out.println(hs1.size());//3
System.out.println("--------------(❁´◡`❁)----------------");
//测试删除指定元素
System.out.println(hs1.remove("巴基"));//true
System.out.println(hs1.remove("巴基"));//false
System.out.println(hs1);//[香克斯,路飞]
System.out.println("--------------(❁´◡`❁)----------------");
HashSet<String> hs2=new HashSet<>();
hs2.add("乔拉可尔·米霍克");
hs2.add("巴索罗米·熊");
hs2.add("波雅·汉库克");
HashSet<String> hs3=new HashSet<>();
hs3.add(" 波雅·汉库克 ");
hs3.add("卡普");
hs3.add("战国");
System.out.println(hs2);//[乔拉可尔·米霍克,巴索罗米·熊,波雅·汉库克]
System.out.println(hs3);//[波雅·汉库克,卡普,战国]
System.out.println(hs2.containsAll(hs3));//false,hs2没有包含hs3的所有元素
System.out.println("--------------(❁´◡`❁)----------------");
System.out.println(hs2.removeAll(hs3));//true,删除hs2包含hs3中的元素
System.out.println(hs2);//[乔拉可尔·米霍克,巴索罗米·熊]
System.out.println(hs3);//[波雅·汉库克,卡普,战国]
//for循环遍历集合
for (int i = 0; i <hs3.size() ; i++) {
System.out.println(hs3.get(i));//获取指定下标的元素
}
}
public static void main(String[] args) {
HashSet<String> s=new HashSet<>();
s.add(new String("龙"));
s.add(new String("卡普"));
s.add(new String("龙"));
//重写了HashCode()(根据内容生成Hash值,内容相同,Hash值相同)
//重写了equals()(根据内容比较,内容相同,比较结果也相同)
System.out.println(s);//[龙,卡普]
}
//去重案例
public class AnLi {
public static void main(String[] args) {
HashSet<Role> s=new HashSet<>();
Role s1=new Role("tom",19,"天津");
Role s2=new Role("tom",19,"天津");
Role s3=new Role("jack",20,"北京");
Role s4=new Role("jack",20,"北京");
s.add(s1);
s.add(s2);
s.add(s3);
s.add(s4);
//当重写HashCode()和equals()方法就会去重
System.out.println(s);
}
}
class Role{
private String name;
private String position;
public Role(String name,String address) {
this.name = name;
this.position=position;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position=position;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Role role = (Role) o;
return name.equals(role.name) &&
position.equals(role.position);
}
@Override
public int hashCode() {
return Objects.hash(name, position);
}
@Override
public String toString() {
return "Role{" +
"name='" + name + '\'' +
", position='" + position + '\'' +
'}';
}
}
TreeSet
特点:不包含重复元素 没有索引 可以将元素按照规则进行排序 空参构造,类实现comparable,重写comparator() 有参构造使用比较器排序,让集合构造重写compareto()
//TreeSet空参
public class TreeSetDemo {
public static void main(String[] args) {
/*
TreeSet<Integer> s = new TreeSet<>();
s.add(2);
s.add(1);
s.add(5);
s.add(6);
s.add(8);
System.out.println(s);//[1, 2, 5, 6, 8],将元素进行了排序*/
TreeSet<Student> ts = new TreeSet<>();//空参构造
Student s1=new Student("艾斯",22);
Student s2=new Student("萨博",22);
Student s3=new Student("路飞",19);
/*
首先空参构造,
类实现comparable
重写comparator方法,后者调用该方法,this就指后者,如果返回值为负数,后者存到左边,
先存入s1,再存s2,s2为后者 如果是正数,后者存到右边,
存s3先和s1比,大则继续往后比 如果是0,表示重复,不存
*/
ts.add(s1);
ts.add(s2);
ts.add(s3);
System.out.println(ts);
//[Student{name='路飞', age=19}, Student{name='艾斯', age=22}, Student{name='萨博', age=22}]
//底层将中文转成拼音,在进行排序,如果拼音相同,那么程序认为重复
}
}
class Student implements Comparable<Student>{
private String name;
private int age;
@Override
public int compareTo(Student o) {
/* //按照年龄进行排序
//只要年龄相同就会认为是重复,其他参数就不考虑
int i= this.age-o.age;
return i;*/
//此方法内,年龄为主判断方法,姓名为次要判断条件
int i= this.age-o.age;
//String类中有CompareTo()方法
i = i==0 ? this.name.compareTo(o.getName()) : i;
return i;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
//TreeSet有参
public class TreeSet1 {
public static void main(String[] args) {
TreeSet<Role> s=new TreeSet<>(new Comparator<Role>() {
@Override
public int compare(Role o1, Role o2) {
//o1表示要存入的元素,o2表示已经存入集合的元素
int result=o1.getAge()-o2.getAge();//判断的主要条件
result= result==0?o1.getName().compareTo(o2.getName()):result;//判断的次要条件
return result;
}
});
Role t1=new Role("黄猿",58);
Role t2=new Role("赤犬",55);
Role t3=new Role("青雉",49);
s.add(t1);
s.add(t2);
s.add(t3);
System.out.println(s);
}
}
class Role{
private String name;
private int age;
public Role() {
}
public Role(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Role{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
Map集合
Map为双列集合,每组元素都包括[key,value],为任意类型 特点:key不允许重复,再添加第二次已有的key时,value会被覆盖 通过key获取value,key和value一对一 元素是无序的 遍历Map需要先将其转成EntrySet,再进行遍历 方法: put()方法,用于添加元素 get()方法,用于获取元素 remove()方法,用于移除元素 size()方法,获取集合的长度 isEmpty()方法,返回布尔型,判断集合是否为空 containsKey()方法,判断是否包含某个Key containsValue()方法,判断是否包含某个Value keySet()方法,获取集合中所有key组成的set集合 values()方法,获取集合中所有value组成的Collection集合 entrySet()方法,获取集合中[key-value]组成的set集合
HashMap
HashMap是Map接口的实现,底层是一个Entry数组
public static void main(String[] args) {
//创建Map对象实例
Map/*<String,String>*/ map=new HashMap<>() ;
map.put("1",1);
map.put("2",2);
System.out.println(map);
//指定泛型
Map<String,String> map1=new HashMap<>() ;
map1.put("罗宾","娜美");
map1.put("索隆","山治");
System.out.println(map1);
System.out.println(map1.get("索隆"));//山治
System.out.println(map1.remove("罗"));//null
System.out.println(map1);//{罗宾=娜美, 索隆=山治}
System.out.println(map1.size());//2
System.out.println(map1.isEmpty());//false
//判断集合中是否包含指定的key,指定的value
System.out.println(map1.containsKey("索隆"));//true
System.out.println(map1.containsValue("山治"));//true
//获取Map集合中所有key组成的set集合
System.out.println(map1.keySet());//[罗宾, 索隆]
//获取Map集合中所有的value组成的Collection集合
System.out.println(map1.values());
//返回Map集合中key-value对儿组成的set集合
//生成一个set集合泛型是map.entry
Set<Map.Entry<String,String>> entires=map1.entrySet();
System.out.println(map1.entrySet());//[罗宾=娜美, 索隆=山治]
for (Map.Entry<String,String> m:entires) {
System.out.println(m);
}
//生成set集合泛型为map.entry
Iterator<Map.Entry<String, String>> iterator = entires.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
/*遍历Map的方法:
keySet()
Collection values()
Set EntrySet()
*/
public static void main(String[] args) {
Map<String,String> map=new HashMap<>() ;
map.put("罗宾","娜美");
map.put("索隆","山治");
Set<String> set= map.keySet();
for (String key:set) {
System.out.println(key+""+map.get(key));
}
Collection<String> value=map.values();
for (String v:value) {
System.out.println(v);
}
Set<Map.Entry<String, String>> entrySet = map.entrySet();
for (Map.Entry<String, String> e:entrySet) {
System.out.println(e.getKey()+e.getValue());
}
}
迭代器
Iterator
迭代器主要用于遍历,且依赖于集合存在 迭代器创建后,指针指向第一个元素上方 调用hasNext()方法,判断指针下方是否有元素,有则返回true 调用Next()方法,将指针下移一位,并获取当前指针指向的元素
public static void main(String[] args) {
//创建List的对象
List<String> list=new ArrayList();
list.add("我");
list.add("是");
list.add("甜");
list.add("崽");
//使用Iterator()方法获取迭代器遍历集合,Collection集合都可以使用这个迭代器
Iterator<String> iterator=list.iterator();//获取迭代器
while(iterator.hasNext()){//判断指针下方是否有元素,
System.out.println(iterator.next());// 指针向下移动一位,打印元素
}
}
ListIterator
ListIterator继承了Iterator 迭代器创建后,指针指向第一个元素上方 调用hasNext()方法,判断指针下方是否有元素,有则返回true 调用Next()方法,将指针下移一位,在获取当前指针指向的元素 previous()方法返回列表中的上一个元素 hasPrevoius()方法如果在相反方向迭代具有更多元素,则返回true
public static void main(String[] args) {
//创建List的对象
List<String> list=new ArrayList();
list.add("我");
list.add("是");
list.add("甜");
list.add("崽");
//使用Iterator()方法获取迭代器遍历集合,Collection集合都可以使用这个迭代器
ListIterator<String> listiterator=list.listIterator();
while(listiterator.hasNext()){
System.out.println(listiterator.next());
}
//反向遍历list集合(先正向遍历,在反向遍历)
while(listiterator.hasPrevious()){
System.out.println(listiterator.previous());
}
}
foreach
格式:for (数组数据类型或者泛型 变量名:数组名或者集合名) { } foreach:增强for循环,简易迭代器 底层为迭代器 与普通for循环的区别:无法获取下标,不可以修改数组或集合中元素 当普通for循环修改元素时,修改的是堆内存当中的值
public static void main(String[] args) {
//创建List的对象
List<String> list=new ArrayList();
list.add("我");
list.add("是");
list.add("甜");
list.add("崽");
for (String l:list) {
System.out.println(l);
}
//使用普通for循环
for (int i = 0; i <list.size() ; i++) {
System.out.println(list.get(i));//获取指定下标的元素
}
}
Properties
当于Hashtable 是一个Map体系的集合 跟IO相关的方法 没有泛型,不需要尖括号 只存字符串
public class PropertiesDemo {
public static void main(String[] args) throws IOException {
Map<String,String> map=new Hashtable();
map.put("1","list");
System.out.println(map.get("1"));
Properties pro=new Properties();
//增加元素
pro.put("name","luffy");
pro.put("age","19");
System.out.println(pro);//{age=19, name=luffy}
//删除元素
//pro.remove("age");
//System.out.println(pro);//{name=luffy}
//修改元素
pro.put("age","20");//键不存在为添加,键存在为覆盖
System.out.println(pro);//{age=20, name=luffy}
//查询元素
System.out.println(pro.get("name"));
//遍历
Set<Object> ob = pro.keySet();
for (Object key:ob) {
System.out.println(key+":"+pro.get(key));
}
System.out.println("------");
//所有键值对组成的对象
Set<Map.Entry<Object, Object>> entries = pro.entrySet();
for (Map.Entry<Object, Object> key:entries
) {
//Object value;
System.out.println(key);
}
//方法(key,value)键和值必须是String类型
Properties pro1=new Properties();
pro1.setProperty("路飞","风车村");
pro1.setProperty("娜美","可可西亚村");
System.out.println(pro1);
System.out.println(pro1.getProperty("路飞"));
System.out.println(pro1.stringPropertyNames());
//IO
//load():将指定文件中的键值对数据读取到Properties集合中
Properties pro2=new Properties();
FileReader fr=new FileReader("a.properties");
//调用load()方法完毕后,文件的数据就已经在pro集合中了
pro2.load(fr);
fr.close();
System.out.println(pro2);//Map为无序的,所以可能和文件中的顺序不同
//Store():将集合中的数据以键值对的形式保存到指定文件中
pro2.setProperty("db1","123");
pro2.setProperty("db2","1231");
pro2.put("db3","12345");
FileWriter fw=new FileWriter("a.properties");
pro2.store(fw,null);//第二个参数为注释
fw.close();
}
}
小贴士
集合中使用泛型,可以避免数据类型混乱 集合长度是动态变化的,类型也是不定的 ArrayList()集合数据存储的结构是数组结构,元素增删慢,查找快 LinkedList()底层结构是链表,查询元素慢,线程不安全,效率高,增删元素快 使用TreeSet需要制定排序规则