1.集合概述
1)什么是集合?有什么用? 数组其实就是一个集合。集合实际上就是一个容器。可以用来容纳其他类型的数据。 集合为什么说在开发中使用较多? 集合是一个容器,是一个载体,可以一次容纳多个对象。 在实际开发中,假设连接数据库,数据库当中有10条记录, 那么假设把这10条记录查询出来,在java程序中会将10条 数据封装成10个java对象,然后将10个java对象放到某一个 集合当中,将集合传到前端,然后遍历集合。将一个数据一个 数据展现出来。
2)集合中存储的是引用。 集合不能直接存储基本数据类型,另外集合也不能直接存储java对象, 集合当中存储的都是java对象的内存地址。(或者说集合中存储的是引用。) list.add(100);//自动装箱Integer 注意: 集合在java中本身是一个容器,是一个对象。 集合中任何时时候存储的都是"引用"。
3)在java中每一个不同的集合,底层会对于不同的数据结构。往不同的集合中 存储元素,等于将数据放到了不同的数据结构当中。什么是数据结构?数据存储的 结构就是数据结构。不同的数据结构,数据存储方式不同。例如: 数组,二叉树,链表,哈希表… 以上这些都是从常见的数据结构。
你往集合c1中放数据,可能是放到数组上了。 你往集合c2中放数据,可能是放到二叉树上了。 … 你是要不同的集合等同于使用不同的数据结构。
new ArrayList(); 创建一个集合,底层是数组。 new LinkedList(); 创建一个集合对象,底层是链表。 new TreeSet(); 创建一个集合对象,底层是二叉树。
4)集合在java JDK中哪个包下? java.util.*; 所有的集合类和集合接口都在java.util包下。
5)集合的继承结构图背会!
6)在java中集合分为两大类: 一类是单个方式存储元素: 单个方式存储元素,这一类集合中超级父接口: java.util.Collection;
一类是以键值对儿的方式存储元素: 以键值对的方式存储元素,这一类集合中超级父接口: java.util.Map;
2.集合继承结构图(老杜)
3.集合接口中常用的方法
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest01 {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add(1200);
c.add(3.14);
c.add(new Object());
c.add(new Student());;
c.add(true);
System.out.println("集合中的元素个数:"+c.size());
c.clear();
System.out.println("集合中的元素个数:"+c.size());
c.add("Hello");
c.add("World");
c.add("浩克");
c.add("花木兰");
boolean flag=c.contains("浩克");
System.out.println(flag);
boolean flag2=c.contains("浩克2");
System.out.println(flag2);
System.out.println("集合中的元素个数:"+c.size());
c.remove("浩克");
System.out.println(c.contains("浩克"));
System.out.println("集合中的元素个数:"+c.size());
System.out.println(c.isEmpty());
c.clear();
System.out.println(c.isEmpty());
c.add("abc");
c.add("HelloWorld!");
c.add("efg");
c.add(new Student());
Object[] obj=c.toArray();
for(int i=0;i<obj.length;i++)
{
System.out.print(obj[i].toString()+" ");
}
System.out.println();
}
}
class Student{
}
4.迭代专题
样例1(迭代器的使用)
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class CollectionTest02 {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add(100);
c.add("abc");
c.add("def");
c.add(new Object());
Iterator it=c.iterator();
while (it.hasNext())
{
System.out.println(it.next());
}
}
}
样例2(迭代器是通用的)
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
public class CollectionTest03 {
public static void main(String[] args) {
Collection c1=new ArrayList();
c1.add(1);
c1.add(2);
c1.add(3);
c1.add(4);
c1.add(1);
Iterator it=c1.iterator();
while(it.hasNext())
{
Object obj=it.next();
System.out.println(obj);
}
Collection c2=new HashSet();
c2.add(100);
c2.add(400);
c2.add(300);
c2.add(100);
Iterator it2=c2.iterator();
while(it2.hasNext())
{
System.out.println(it2.next());
}
}
}
5.深入Collection的conatins方法
1)contain方法底层调用equals方法
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest04 {
public static void main(String[] args) {
Collection c=new ArrayList();
String s1=new String("abc");
c.add(s1);
String s2=new String("def");
c.add(s2);
String s3=new String("abc");
System.out.println("元素的个数是:"+c.size());
System.out.println(c.contains(s3));
}
}
2)测试contains方法
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Objects;
public class CollectionTest05 {
public static void main(String[] args) {
Collection c=new ArrayList();
User u1=new User("jack");
c.add(u1);
User u2=new User("jack");
System.out.println(c.contains(u2));
}
}
class User{
private String name;
public User(){}
public User(String name){
this.name=name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof User)) return false;
User u = (User) o;
return u.name.equals(this.name);
}
}
6.深入Collection的remove方法
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
public class CollectionTest06 {
public static void main(String[] args) {
Collection c=new ArrayList();
User u1=new User("jack");
c.add(u1);
System.out.println(c.size());
User u2=new User("jack");
c.remove(u2);
System.out.println(c.size());
}
}
class User{
private String name;
public User(){}
public User(String name){
this.name=name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || !(o instanceof User)) return false;
User u = (User) o;
return u.name.equals(this.name);
}
}
7.Collection接口中的contains方法和remove方法底层都会重写equals。
8.关于集合中元素的删除
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionTest07 {
public static void main(String[] args) {
Collection c=new ArrayList();
c.add(1);
c.add(2);
c.add(3);
Iterator it=c.iterator();
while(it.hasNext())
{
Object obj=it.next();
it.remove();
System.out.println(obj);
}
System.out.println(c.size());
}
}
9.List接口特有方法
package com.jmpower.javase.collection;
import java.util.*;
public class ListTest01 {
public static void main(String[] args) {
List myList=new ArrayList();
myList.add("A");
myList.add("B");
myList.add("C");
myList.add("C");
myList.add("D");
myList.add(1,"King");
Iterator it=myList.iterator();
while(it.hasNext())
{
Object obj=it.next();
System.out.println(obj);
}
System.out.println("``````````````````````````");
System.out.println(myList.get(1));
System.out.println(myList.indexOf("C"));
System.out.println(myList.lastIndexOf("C"));
myList.remove(0);
System.out.println(myList.size());
System.out.println("```````````````````````````");
myList.set(2,"Soft");
Iterator it2=myList.iterator();
while(it2.hasNext())
{
Object obj=it2.next();
System.out.println(obj);
}
}
}
10.ArrayList集合初始化容量及扩容
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.List;
public class ArrayListTest01 {
public static void main(String[] args) {
List list1=new ArrayList();
System.out.println(list1.size());
List list2=new ArrayList(20);
System.out.println(list2.size());
}
}
11.ArrayList集合的构造方法
package com.jmpower.javase.collection;
import java.util.*;
public class ArrayListTest02 {
public static void main(String[] args) {
List myList1=new ArrayList<>();
List myList2=new ArrayList<>(100);
Collection c=new HashSet();
c.add(100);
c.add(200);
c.add(50);
List myList3=new ArrayList<>(c);
for(int i=0;i<myList3.size();i++)
{
System.out.println(myList3.get(i));
}
}
}
12.LinkedList集合
链表优点: 由于链表上的元素在空间存储上内存地址不连续。 所以随机增删元素的时候不会有大量的元素位移,因此随机增删效率较高。 在以后开发中,如果遇到随即增删集合中的元素的业务比较多时,建议使用 LinkedList。
链表缺点: 不能通过数学表达式计算被查找元素的内存地址。每一次查找都是从头 结点开始遍历,直到找到为止。所以LinkeList集合检索/查找的效率 较低。
ArrayList: 把检索发挥到极致。(末尾添加元素的效率还是很高的) LinkedList: 把随机增删发挥到极致。 加元素往往都是往末尾添加,所以ArrayList用的比LinkedList多。
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class LinkedListTest01 {
public static void main(String[] args) {
List list=new LinkedList();
list.add("a");
list.add("b");
list.add("c");
for(int i=0;i<list.size();i++)
{
Object obj=list.get(i);
System.out.println(obj);
}
List list2=new LinkedList();
list2.add("abc");
list2.add("def");
list2.add("ghi");
for(int i=0;i<list2.size();i++)
{
System.out.println(list2.get(i));
}
}
}
13.Vector集合
Vector: 1.底层也是一个数组. 2.初始化容量: 10 3.怎么扩容的? 扩容之后是原容量的2倍。 10–>20–>40–>80
4.ArrayList集合扩容特点: ArrayList集合扩容是原容量1.5倍数。
5.Vector中的所有方法都是线程同步的,都带有synchronized关键字。 是线程安全的。效率比较低,使用较少了。
6.怎么讲一个线程不安全的ArrayList集合转换成线性安全的呢? 使用集合工具类: java.util.Collections
java.util.Collection 是集合接口 java.util.Collections 是集合工具类
package com.jmpower.javase.collection;
import java.util.*;
public class VectorTest01 {
public static void main(String[] args) {
List vector=new Vector();
vector.add(1);
vector.add(2);
vector.add(3);
vector.add(4);
vector.add(5);
vector.add(6);
vector.add(7);
vector.add(8);
vector.add(9);
vector.add(10);
vector.add(11);
Iterator it=vector.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
List myList=new ArrayList();
Collections.synchronizedCollection(myList);
myList.add("111");
myList.add("222");
myList.add("333");
}
}
14.泛型机制
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class GenericTest01 {
public static void main(String[] args) {
List<Animal> myList=new ArrayList<Animal>();
Cat c=new Cat();
Bird b=new Bird();
myList.add(c);
myList.add(b);
Iterator<Animal> it=myList.iterator();
while(it.hasNext())
{
Animal a= it.next();
if(a instanceof Cat)
{
Cat x=(Cat) a;
x.catchMouse();
}
if(a instanceof Bird)
{
Bird y=(Bird) a;
y.fly();
}
}
}
}
class Animal{
public void move(){
System.out.println("动物在移动!");
}
}
class Cat extends Animal{
public void catchMouse(){
System.out.println("猫捉老鼠!");
}
}
class Bird extends Animal{
public void fly(){
System.out.println("鸟儿在飞行!");
}
}
15.自动类型推断
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class GenericTest02 {
public static void main(String[] args) {
List<Animal> myList=new ArrayList<>();
myList.add(new Animal());
myList.add(new Cat());
myList.add(new Bird());
Iterator<Animal> it=myList.iterator();
while(it.hasNext())
{
Animal a=it.next();
a.move();
}
}
}
16.自定义泛型
package com.jmpower.javase.collection;
public class GenericTest03<标识符随便写> {
public void doSome(标识符随便写 o){
System.out.println(o);
}
public static void main(String[] args) {
GenericTest03<String> gt=new GenericTest03<>();
gt.doSome("abc");
GenericTest03<Integer> gt2=new GenericTest03<>();
gt2.doSome(100);
MyIterator<String> mi=new MyIterator<>();
String s1=mi.get();
MyIterator<Animal> mi2=new MyIterator<>();
Animal a=mi2.get();
}
}
class MyIterator<T>{
public T get(){
return null;
}
}
17.增强for循环(foreach)
1)foreach语法
package com.jmpower.javase.collection;
public class ForEachTest01 {
public static void main(String[] args) {
int[] arr={1,2,3,4,5,6};
for(int i=0;i<arr.length;i++)
{
System.out.println(arr[i]);
}
System.out.println("==================================");
for(int date:arr)
{
System.out.println(date);
}
}
}
2)集合使用forecach
package com.jmpower.javase.collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ForEachTest02 {
public static void main(String[] args) {
List<String> strList=new ArrayList<>();
strList.add("hello");
strList.add("world");
strList.add("kitty");
Iterator<String> it=strList.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
System.out.println("========================");
for(int i=0;i<strList.size();i++)
{
System.out.println(strList.get(i));
}
System.out.println("=========================");
for(String t:strList)
{
System.out.println(t);
}
System.out.println("=========================");
List<Integer> list=new ArrayList<>();
list.add(100);
list.add(200);
list.add(300);
for(Integer t:list)
{
System.out.println(t);
}
}
}
18.HashSet集合特点
package com.jmpower.javase.collection;
import java.util.HashSet;
import java.util.Set;
public class HashSetTest01 {
public static void main(String[] args) {
Set<String> strs=new HashSet<>();
strs.add("hello3");
strs.add("hello4");
strs.add("hello1");
strs.add("hello2");
strs.add("hello3");
strs.add("hello3");
strs.add("hello3");
strs.add("hello3");
for(String s:strs)
{
System.out.println(s);
}
}
}
19.演示TreeSet集合特点
package com.jmpower.javase.collection;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest01 {
public static void main(String[] args) {
Set<String> strs=new TreeSet<>();
strs.add("A");
strs.add("B");
strs.add("C");
strs.add("Y");
strs.add("Z");
strs.add("K");
strs.add("B");
for(String s:strs)
{
System.out.println(s);
}
}
}
20.Map接口常用方法
package com.jmpower.javase.map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class MapTest01 {
public static void main(String[] args) {
Map<Integer,String> map=new HashMap<>();
map.put(1,"zhangsan");
map.put(2,"lisi");
map.put(3,"wangwu");
map.put(4,"zhaoliu");
String value=map.get(2);
System.out.println(value);
System.out.println(map.containsKey(2));
System.out.println(map.containsValue("lisi"));
System.out.println(map.isEmpty());
System.out.println(map.size());
map.remove(2);
System.out.println(map.size());
Collection<String> values=map.values();
for(String s:values)
{
System.out.println(s);
}
map.clear();
System.out.println(map.size());
}
}
21.遍历Map集合
package com.jmpower.javase.map;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class MapTest02 {
public static void main(String[] args) {
Map<Integer,String> map=new HashMap<>();
map.put(1,"zhangsan");
map.put(2,"lisi");
map.put(3,"wangwu");
map.put(4,"zhaoliu");
Set<Integer> set=map.keySet();
for(Integer t:set)
{
System.out.println(t+"="+map.get(t));
}
System.out.println("================================");
Set<Map.Entry<Integer,String>> set1=map.entrySet();
for(Map.Entry<Integer,String> node:set1)
{
System.out.println(node.getKey()+"="+node.getValue());
}
}
}
22.哈希表(HashMap)数据结构
map.put(k,v)的实现原理 map.get(k)的实现原理 如图所示:
package com.jmpower.javase.map;
import java.util.HashMap;
import java.util.Map;
public class HashMapTest01 {
public static void main(String[] args) {
Map<Integer,String> map=new HashMap<>();
map.put(1111,"zhangsan");
map.put(6666,"lisi");
map.put(7777,"wangwu");
map.put(2222,"zhaoliu");
map.put(2222,"liuxing");
map.put(7777,"wangzong");
System.out.println(map.size());
}
}
23.HashMap同时重写hashCode和equals
package com.jmpower.javase.map;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class HashMapTest02 {
public static void main(String[] args) {
Student s1=new Student("zhangsan");
Student s2=new Student("zhangsan");
System.out.println(s1.equals(s2));
System.out.println("s1的哈希值是"+s1.hashCode());
System.out.println("s2的哈希值是"+s2.hashCode());
Set<Student> students=new HashSet<>();
students.add(s1);
students.add(s2);
System.out.println(students.size());
}
}
class Student {
String name;
public Student(){}
public Student(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
}
24.HashMap和Hashtable的区别
1)HashMap的key和value可以为null,Hashtable不可以。 2)HashMap是非线程安全的,Hashtable是线程安全的。 3)Hashtable 默认的初始大小为 11,之后每次扩充,容量变为原来的 2n+1。HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。
package com.jmpower.javase.map;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
public class HashtableTest01 {
public static void main(String[] args) {
Map map=new Hashtable();
Map map1=new HashMap();
map1.put(null,"123");
map1.put(100,null);
System.out.println(map1.size());
}
}
25.属性类Properties类
package com.jmpower.javase.map;
import java.util.Properties;
public class PropertiesTest01 {
public static void main(String[] args) {
Properties pro = new Properties();
pro.setProperty("address", "shandongyantai");
pro.setProperty("name", "bb");
pro.setProperty("phone", "155~");
pro.setProperty("QQ", "2421503290");
String address = pro.getProperty("address");
String name = pro.getProperty("name");
String phone = pro.getProperty("phone");
String QQ = pro.getProperty("QQ");
System.out.println(address);
System.out.println(name);
System.out.println(phone);
System.out.println(QQ);
}
}
26.TreeSet对String是可排序的
package com.jmpower.javase.map;
import java.util.TreeSet;
public class TreeSetTest01 {
public static void main(String[] args) {
TreeSet<String> ts=new TreeSet<>();
ts.add("zhangsan");
ts.add("lisi");
ts.add("wangwu");
ts.add("zhaoliu");
ts.add("liuxing");
for(String t:ts)
{
System.out.println(t);
}
TreeSet<Integer> ts2=new TreeSet<>();
ts2.add(100);
ts2.add(400);
ts2.add(300);
ts2.add(200);
for(Integer t:ts2)
{
System.out.println(t);
}
}
}
27.TreeSet对自定义类型排序
1)TreeSet无法直接对自定义类型排序
package com.jmpower.javase.map;
import java.util.TreeSet;
public class TreeSetTest02 {
public static void main(String[] args) {
Person p1=new Person(32);
Person p2=new Person(45);
Person p3=new Person(14);
Person p4=new Person(28);
TreeSet<Person> persons=new TreeSet<>();
persons.add(p1);
persons.add(p2);
persons.add(p3);
persons.add(p4);
for(Person t:persons)
{
System.out.println(t);
}
}
}
class Person{
int age;
public Person(int age){
this.age=age;
}
public String toString(){
return "Person[age="+age+"]";
}
}
2)实现CompareTo接口
package com.jmpower.javase.map;
import java.util.TreeSet;
public class TreeSetTest03 {
public static void main(String[] args) {
Customer c1=new Customer(32);
Customer c2=new Customer(45);
Customer c3=new Customer(14);
Customer c4=new Customer(28);
TreeSet<Customer> customers=new TreeSet<>();
customers.add(c1);
customers.add(c2);
customers.add(c3);
customers.add(c4);
for(Customer t:customers)
{
System.out.println(t);
}
}
}
class Customer implements Comparable<Customer>{
int age;
public Customer(int age){
this.age=age;
}
public String toString(){
return "Person[age="+age+"]";
}
@Override
public int compareTo(Customer o) {
return o.age-this.age;
}
}
3)比较规则的写法
package com.jmpower.javase.map;
import java.util.TreeSet;
public class TreeSetTest04 {
public static void main(String[] args) {
TreeSet<VIP> vips =new TreeSet<VIP>();
vips.add(new VIP(20,"b张三"));
vips.add(new VIP(20,"a李四"));
vips.add(new VIP(24,"王五"));
vips.add(new VIP(18,"赵六"));
for (VIP v:vips)
{
System.out.println(v);
}
}
}
class VIP implements Comparable<VIP>{
int age;
String name;
public VIP(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Vip{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(VIP o) {
if(this.age==o.age){
return this.name.compareTo(o.name);
}
return this.age-o.age;
}
}
4)实现比较器Comparator接口
package com.jmpower.javase.map;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetTest05 {
public static void main(String[] args) {
TreeSet<WuGui> wuGuis=new TreeSet<>(new Comparator<WuGui>() {
@Override
public int compare(WuGui o1, WuGui o2) {
return o1.age-o2.age;
}
});
wuGuis.add(new WuGui(10000));
wuGuis.add(new WuGui(5000));
wuGuis.add(new WuGui(8000));
wuGuis.add(new WuGui(1000));
for(WuGui wuGui:wuGuis)
{
System.out.println(wuGui);
}
}
}
class WuGui{
int age;
public WuGui(int age) {
this.age = age;
}
@Override
public String toString() {
return "WuGui{" +
"age=" + age +
'}';
}
}
class WuguiComparator implements Comparator<WuGui>{
@Override
public int compare(WuGui o1, WuGui o2) {
return o1.age-o2.age;
}
}
28.Collections工具类
package com.jmpower.javase.map;
import java.util.*;
public class CollectionsTest {
public static void main(String[] args) {
List<String> list=new ArrayList<>();
Collections.synchronizedList(list);
list.add("abe");
list.add("abc");
list.add("abq");
list.add("abc");
Collections.sort(list);
for(String s: list)
{
System.out.println(s);
}
List<WuGui2> wuGui2s=new ArrayList<>();
wuGui2s.add(new WuGui2(5000));
wuGui2s.add(new WuGui2(10000));
wuGui2s.add(new WuGui2(8000));
wuGui2s.add(new WuGui2(500));
Collections.sort(wuGui2s);
for(WuGui2 wuGui2:wuGui2s)
{
System.out.println(wuGui2);
}
Set<String> set=new HashSet<>();
set.add("king");
set.add("wang");
set.add("liu");
set.add("zhang");
List<String> myList=new ArrayList<>(set);
Collections.sort(myList);
for(String s:myList)
{
System.out.println(s);
}
}
}
class WuGui2 implements Comparable<WuGui2>{
int age;
public WuGui2(int age) {
this.age = age;
}
@Override
public String toString() {
return "WuGui{" +
"age=" + age +
'}';
}
@Override
public int compareTo(WuGui2 o) {
return this.age-o.age;
}
}
|