数组:存储同一种数据类型
特点:
1.只能存储一种数据类型
2.一旦初始化,长度固定
3.数组元素的内存地址是连续的
4.Object类型的数组可以存储任意类型的元素
需求:收集同学的兴趣爱好
集合:存储对象数据的集合容器
优势:
1. 集合可以存储任意类型的对象信息,数组只能存储同一类型对象信息(Object除外)
2.集合的长度是任意变化的,数组长度是固定的
--|Collection:单列集合的根接口,表示一组对象
----|List 实现List接口的集合类,特点:有序可以重复
------|ArrayList 维护Object数组实现的,特点:查询快,增删慢
------|LinkedList 底层使用链表数据结构实现的,特点:查询慢,增删快
------|Vector 底部维护Object数组,实现和ArrayList一样,但是Vector是线程安全,效率低
----|Set 实现Set接口的集合类,特点:无序,不可重复
------|HashSet 底层是使用了哈希表来支持的,特点: 存取速度快.
--------|特点:hashSet的实现原理:
往Haset添加元素的时候,HashSet会先调用元素的hashCode方法得到元素的哈希值 ,
然后通过元素的哈希值经过移位等运算,就可以算出该元素在哈希表中的存储位置。
情况1:如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。
情况2: 如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法与该位置的元素再比较一次,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素运行添加。
------|TreeSet
--------|如果元素具备自然顺序的特性,那么就按照元素自然顺序的特性进行排序
双例集合体系
双列集合:
Map:实现Map接口的集合类,具备的特点:存储的数据都是以键值对的方式,键不可以重复,值可重复
--|HashMap
底层使用hashCode表来实现向HashMap中添加元素的时候,首先调用键的hashCode方法得到元素的哈希码的值,经过运算,得到该元素在哈希表中的位置;
1.如果该位置没有存储元素,则元素之间添加到哈希表中
2.如果该位置有其他的元素,会调用元素的equals方法,如果返回false,该元素被储存,返回true,该元素重复不能存储
--|TreeMap
TreeMap:基于二叉树的数据结构实现的,会对具备自然特性的键进行排序存储
1.元素的键具备自然特性,直接排序存储
2.不具备自然特性,实现Comparable接口,在ComparaTo中定义排序规则
3.不具备自然特性,没有实现Comparable接口,在创建TreeMap对象的时候传入比较器
--|HashTable
package com.cloud.day1; import java.util.ArrayList; import java.util.Collection; /* --|Collection:单列集合的根接口,表示一组对象 ----|List 实现List接口的集合类,特点:有序可以重复 ----|Set 实现Set接口的集合类,特点:无序,不可重复 Collection中的方法 添加 add(E e) addAll(Collection<? extends E> c) 删除 clear() remove(Object o) removeAll(Collection<?> c) retainAll(Collection<?> c) 查看 size() 判断 contains(Object o) containsAll(Collection<?> c) equals(Object o) isEmpty() 迭代 iterator() toArray() */ public class Demo1 { public static void main(String[] args) { Collection test=new ArrayList(); test.add("SHsH"); test.add("sjf"); test.add(1); Collection c=new ArrayList(); c.add("Spring"); c.add(1); c.addAll(test); System.out.println("添加成功返回值?"+c.add("Summer")); //c.clear(); c.remove("sjf"); //c.removeAll(test);//删除两个集合的交集 c.retainAll(test);//保留c集合和test集合的交集元素,其余删除 System.out.println(c); } }
package com.cloud.day1; import java.util.ArrayList; import java.util.Collection; public class Demo2 { public static void main(String[] args) { Collection<Person> all=new ArrayList<Person>(); all.add(new Person(1,"Spring1")); all.add(new Person(2,"Spring2")); all.add(new Person(3,"Spring3")); all.add(new Person(4,"Spring4")); System.out.println("判断包含:"+all.contains(new Person(1,"Spring1"))); System.out.println(all); } } class Person{ private int id; private String name; public Person(int id,String name){ this.id=id; this.name=name; } public String toString() { return "编号:"+this.id+";姓名:"+this.name; } /** * 重写比较方法 */ public boolean equals(Object obj) { Person p=(Person) obj;//向下转型 return this.id == p.id; } /** * java的规范,重写equals方法就会重写hashCode方法 */ public int hashCode() { return this.id; } }
package com.cloud.day1; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class Demo3 { public static void main(String[] args) { Collection c=new ArrayList(); c.add("Spring1"); c.add("Spring2"); c.add("Spring3"); /*迭代器输出元素 Iterator it=c.iterator(); while(it.hasNext()){ System.out.println(it.next()); } for(Iterator it=c.iterator();it.hasNext();){ System.out.println("["+it.next()+"]"); } */ //remove:方法删除最后一次返回的元素 // Iterator it=c.iterator();//这时候获取一个迭代器还没有获取元素 // it.next(); // it.remove();//删除Spring1 // Iterator it=c.iterator();//这时候获取一个迭代器还没有获取元素 // it.next(); // it.next(); // it.remove();//删除Spring2 //删除全部 Iterator it=c.iterator();//这时候获取一个迭代器还没有获取元素 while (it.hasNext()){ it.next(); it.remove(); } System.out.println(c); } }
package com.cloud.day1; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Scanner; public class Demo4 { /** * @param模拟注册登录的案例 * 1.如果用户名和密码已经存在,则注册失败 * 2.则注册成功 */ public static void main(String[] args) { Scanner scanner=new Scanner(System.in); Collection users=new ArrayList(); while(true){ System.out.println("请选择功能:A.注册 B.登录"); String option=scanner.next(); if("a".equalsIgnoreCase(option)){ System.out.println("你选择了注册功能"); User user=null; while (true){ System.out.println("请输入账号..."); int id=scanner.nextInt(); user=new User(id, null); if(users.contains(user)){ System.out.println("该用户已经存在,重新输入..."); } else{ break; } } System.out.println("请输入密码..."); String password=scanner.next(); user.setPassword(password); //存入集合中 users.add(user); System.out.println("注册成功"); System.out.println("注册人员信息"+users); /* System.out.println("你选择注册功能"); while(true){ System.out.println("请输入账号..."); int id=scanner.nextInt(); //遍历集合是否存在该账号 Iterator it=users.iterator(); while(it.hasNext()){ User user=(User) it.next(); if(user.id==id){ System.out.println("该账号已经被注册,重新输入..."); break; } } } */ } else if("b".equalsIgnoreCase(option)){ System.out.println("你选择登录功能"); System.out.println("请输入账号..."); int id=scanner.nextInt(); System.out.println("请输入密码..."); String password=scanner.next(); //遍历集合元素查看用户信息 boolean isLogin=false; Iterator it=users.iterator(); while(it.hasNext()){ User user=(User) it.next(); if(user.id==id && user.password.equals(password)){ isLogin=true; } } if(isLogin){ System.out.println("欢迎进入..."); } else{ System.out.println("用户名或者密码错误"); } } else{ System.out.println("你的选择错误,重新输入"); } } } } class User{ int id; String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User(int id,String password){ this.id=id; this.password=password; } @Override public boolean equals(Object obj) { User user=(User) obj; return this.id==user.id; } @Override public String toString() { // TODO Auto-generated method stub return "(账号:"+this.id+",密码:"+this.password+")"; } }
package com.cloud.collection;
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; /* 笔试题:Collection和Collections区别 Collection是单例集合的根接口 Collections是操作集合对象的工具类 */ class Person{ String name; int age; public Person(String name,int age){ this.name=name; this.age=age; } @Override public String toString() { return "[姓名:"+this.name+";年龄:"+this.age+"]"; } } //自定义一个比较器 class AgeComparator implements Comparator<Person>{ @Override public int compare(Person o1, Person o2) { return o1.age - o2.age; } } public class Demo1 { public static void main(String[] args) { ArrayList<Integer> arr = new ArrayList<Integer>(); arr.add(6); arr.add(4); arr.add(2); Collections.sort(arr); //二分查找,要先排序 System.out.println("元素索引的位置:"+Collections.binarySearch(arr, 2)); System.out.println("max="+Collections.max(arr)); System.out.println("min="+Collections.min(arr)); //数组翻转 Collections.reverse(arr); System.out.println(arr); ArrayList<Person> arr1 = new ArrayList<Person>(); arr1.add(new Person("a",5)); arr1.add(new Person("c",3)); arr1.add(new Person("b",6)); AgeComparator act = new AgeComparator(); Collections.sort(arr1, act); System.out.println(Collections.binarySearch(arr1, new Person("a",5),act)); System.out.println(arr1); } } |