集合
概述
变量:用一个变量去存储一个值
数组:用一个变量引用多个值 一旦定义 容量是固定的
用一些数据结构封装为一个单独的类 实现了数据的动态存储,叫做集合 集合是一个类
数组 集合区别:
1 )数组存储基本类型 集合存储Object类型
2 )数组长度固定 集合长度不固定
3 )数组只能存储相同类型 集合能存储任意类型
集合的体系
集合分类:
单列集合:
根接口是:Collection
子接口:Queue List Set
实现类:ArrayList Vector LinkedList
双列集合
Map集合
Collection接口
特点:存储的数据类型是对象类型,是单列集合的根接口,没有实现类,其下有两个子接口List和Set, 所以在Collection中定义的方法在它的子接口中也存在
方法:
- public boolean add ( E e) : 把给定的对象添加到当前集合中 。
- public boolean add ( Colllection c) : 将集合c中的元素添加到当前集合中。
- public void clear ( ) : 清空集合中所有的元素。
- public boolean remove ( E e) : 把给定的对象在当前集合中删除。
- public boolean removeAll ( Colllection c) : 从当前集合中删除c集合中的元素。
- public boolean contains ( E e) : 判断当前集合中是否包含给定的对象。
- public boolean containsAll ( Colllection c) : 判断c是否是当前集合的子集。
- public boolean isEmpty ( ) : 判断当前集合是否为空。
- public int size ( ) : 返回集合中元素的个数。
- public Object[ ] toArray ( ) : 把集合中的元素,存储到数组中。
List子接口
特点:
1. 重复
2. 可以索引
3. 有序
注意:集合中所存放的数据都是Objec
List接口中的特有的方法(和下标有关的)
add(index, 元素)
addAll ( int index, Collection< ? extends E > c)
get ( int index)
remove ( int index)
set ( int index, E element)
案例:
package cn. wzx;
import java. util. ArrayList;
import java. util. List;
public class Demo1 {
public static void main ( String[ ] args) {
List list = new ArrayList ( ) ;
list. add ( "张三" ) ;
list. add ( "李四" ) ;
list. add ( "王五" ) ;
list. add ( "胡哥" ) ;
list. add ( "朱月" ) ;
list. add ( "阿斯达" ) ;
List list2 = new ArrayList ( ) ;
list2. add ( "赵四" ) ;
list2. add ( "刘能" ) ;
list. set ( 5 , "谢大脚" ) ;
Object[ ] array = list. toArray ( ) ;
for ( int i = 0 ; i < array. length; i++ ) {
System. out. println ( array[ i] ) ;
}
}
}
List集合的遍历
1. for 循环遍历
get(index);
2.f oreach遍历 增强for 循环 和for 循环没有任何关系 底层是迭代器实现的
for ( 元素类型的引用 : 集合) {
}
3. 迭代器比较麻烦 一般不用
案例:
package cn. wzx;
import java. util. ArrayList;
import java. util. Iterator;
import java. util. List;
public class Demo1 {
public static void main ( String[ ] args) {
List list = new ArrayList ( ) ;
list. add ( "张三" ) ;
list. add ( "李四" ) ;
list. add ( "王五" ) ;
list. add ( "胡哥" ) ;
list. add ( "朱月" ) ;
list. add ( "阿斯达" ) ;
Iterator iterator = list. iterator ( ) ;
while ( iterator. hasNext ( ) ) {
System. out. println ( iterator. next ( ) ) ;
}
}
}
List集合的实现类
ArrayList: 底层是数组实现 线程不安全 效率高 查询快 增删慢
Vector: 底层数组实现 线程安全 效率低 出现的时间比 Collection 没人用
LinkedList: 底层是用双向链表实现 增删块 查询慢
事实证明:
1. 定义两个集合
2. 先为集合放同样的元素 在某个下标位置插入同等数量的元素
3. 统计时间
案例:
package cn. wzx;
import java. util. ArrayList;
import java. util. LinkedList;
import java. util. List;
public class Demo2 {
public static void main ( String[ ] args) {
List arrList = new ArrayList < > ( ) ;
List linkList = new LinkedList < > ( ) ;
for ( int i = 0 ; i < 100000 ; i++ ) {
arrList. add ( i) ;
linkList. add ( i) ;
}
long start1 = System. nanoTime ( ) ;
System. out. println ( arrList. get ( 50000 ) ) ;
long end1 = System. nanoTime ( ) ;
long time1 = end1- start1;
System. out. println ( "Array查询所有时间" + time1) ;
long start2 = System. nanoTime ( ) ;
System. out. println ( linkList. get ( 50000 ) ) ;
long end2 = System. nanoTime ( ) ;
long time2 = end2- start2;
System. out. println ( "Link查询所有时间" + time2) ;
}
}
实现类的底层实现
ArrayList: 数组实现 查询快 增删慢
LinkedList: 双向链表实现 查询慢 增删快 当查询的时候 会进行一个加速操作 用要查询的元素下标和 集合的尺寸的二分之一进行比较 如果小于 集合. size ( ) / 2 从头查询
泛型
当一个集合中没有限定数据类型的时候,可以添加任何的数据,但是实际开发中需要对集合中的数据类型进行限定使用到了泛型 泛型可以限定集合中的数据类型 类中方法的参数类型 接口中的方法的参数类型
语法:
< 泛型的符号> E T V
集合的泛型:
泛型类:(了解) 好处:可以增强方法的通用性
package cn. wzx;
public class Demo4 {
public static void main ( String[ ] args) {
Test< String> test = new Test < > ( ) ;
}
}
class Test < T> {
public void m ( T t) {
}
public T m2 ( ) {
}
}
泛型接口:好处:实现模版化编程(了解)
interface IA < E> {
void m1 ( E e) ;
E m2 ( ) ;
}
class Test1 implements IA < Student> {
@Override
public void m1 ( Student e) {
}
@Override
public Student m2 ( ) {
return null;
}
}
Collections工具类
数组:Array 工具类 Arrays
集合:Collection 工具类 Collections
案例:
package cn. wzx;
import java. util. ArrayList;
import java. util. Collections;
import java. util. List;
public class Demo5 {
public static void main ( String[ ] args) {
List< Worker> workers = new ArrayList < > ( ) ;
workers. add ( new Worker ( "张三" , 17 ) ) ;
workers. add ( new Worker ( "李四" , 33 ) ) ;
workers. add ( new Worker ( "王五, 12 ) ) ;
workers. add ( new Worker ( "大刀" , 56 ) ) ;
workers. add ( new Worker ( "小刀" , 67 ) ) ;
Collections. shuffle ( workers) ;
for ( Worker worker : workers) {
System. out. println ( worker) ;
}
}
}
class Worker implements Comparable < Worker> {
String name;
int age;
public Worker ( ) {
super ( ) ;
}
public Worker ( String name, int age) {
super ( ) ;
this . name = name;
this . age = age;
}
@Override
public String toString ( ) {
return "Worker [name=" + name + ", age=" + age + "]" ;
}
@Override
public int compareTo ( Worker o) {
return this . age- o. age;
}
}
Set集合
List集合:有序 可以重复 可以索引
Set集合:无序 不可重复 不可索引
Set集合的方法
只有从Collection接口中继承的方法
方法:
- public boolean add ( E e) : 把给定的对象添加到当前集合中 。
- public boolean add ( Colllection c) : 将集合c中的元素添加到当前集合中。
- public void clear ( ) : 清空集合中所有的元素。
- public boolean remove ( E e) : 把给定的对象在当前集合中删除。
- public boolean removeAll ( Colllection c) : 从当前集合中删除c集合中的元素。
- public boolean contains ( E e) : 判断当前集合中是否包含给定的对象。
- public boolean containsAll ( Colllection c) : 判断c是否是当前集合的子集。
- public boolean isEmpty ( ) : 判断当前集合是否为空。
- public int size ( ) : 返回集合中元素的个数。
- public Object[ ] toArray ( ) : 把集合中的元素,存储到数组中。
实现类之HashSet
关于set集合去重
package cn. wzx;
import java. util. HashSet;
import java. util. Set;
public class Demo1 {
public static void main ( String[ ] args) {
Set< String> set = new HashSet < > ( ) ;
set. add ( "abc" ) ;
set. add ( "dfg" ) ;
set. add ( "sd" ) ;
System. out. println ( set. add ( "abcd" ) ) ;
Object[ ] array = set. toArray ( ) ;
for ( int i = 0 ; i < array. length; i++ ) {
System. out. println ( array[ i] ) ;
}
System. out. println ( set. size ( ) ) ;
}
}
Set集合的遍历
1.f oreach遍历
package cn. wzx;
import java. util. HashSet;
import java. util. Set;
public class Demo1 {
public static void main ( String[ ] args) {
Set< String> set = new HashSet < > ( ) ;
set. add ( "abc" ) ;
set. add ( "dfg" ) ;
set. add ( "sd" ) ;
set. add ( "sd" ) ;
set. add ( "dfgag" ) ;
set. add ( "swrtyd" ) ;
for ( String string : set) {
System. out. println ( string) ;
}
}
}
2. 迭代器遍历
注意:在用迭代器和foreach遍历的时候 不能对集合的元素进行修改 否则会报错
foreach中可以使用 break 直接结束遍历 continue 也可以用
package cn. baizhi. day16;
import java. util. HashSet;
import java. util. Iterator;
import java. util. Set;
public class Demo1 {
public static void main ( String[ ] args) {
Set< String> set = new HashSet < > ( ) ;
set. add ( "abc" ) ;
set. add ( "dfg" ) ;
set. add ( "sd" ) ;
set. add ( "sd" ) ;
set. add ( "dfgag" ) ;
for ( String string : set) {
System. out. println ( string) ;
if ( string. equals ( "sd" ) ) {
break ;
}
}
Iterator< String> iterator = set. iterator ( ) ;
}
}
HashSet集合的去重原理
Hashset集合的实现是一个数组链表,底层维护了一个数组,数组的每个元素的类型是一个链表(一个链表可以连接多个元素)
去重原理:
1. 一定让内容相同的对象返回相同的哈希码值,可能内容不同的对象的哈希码值也是相同的,通过hash值的换算将得出同一个下标位置,这时候将调用equals方法去判断这两个对象是否内容相同
2. 为了提高存储的效率优化存储空间 ,一定做到让内容相同的对象返回相同的hash值,尽可能让内容不同的对象返回不同的hash值
LinkedHashSet实现类
作用:LinkedHashSet 是HashSet的子类 也能去重 原理和HashSet一样,还能维护元素添加的顺序
TreeSet实现类
SortedSet的实现类 SortedSet是set的子接口
作用:去重 排序
去重原理:是根据比较规则去重的 当compareTo 方法返回0 时 就认为这两个对象是同一个对象
Map集合
Map双列集合:Map集合中的元素是 key-- value 形式存储
key: 键 不可重复 无序
value: 值 可以重复的
key:value -- -- - 元素
HashMap实现类:
key: 是可以允许为null的
value: 可以为null
线程不安全的 效率高
Hashtable实现类:
key: 不允许为null
value:不允许为null
线程安全 效率低 一般没人用 但是有面试题
如果所有的键所对应的值都相同 这个集合
HashSet的底层实现是HashMap
HashSet的实现是 键的类型是任意类型 但是值都为Object类型对象 new Object ( ) ;
Map集合的遍历
1. 通过keySet ( ) : 可以将所有键获得放入到set集合中 ,遍历set集合 通过get ( key) 拿到值
package cn. wzx;
import java. util. HashMap;
import java. util. Map;
import java. util. Set;
public class Demo3 {
public static void main ( String[ ] args) {
Map< Integer, String> map = new HashMap < > ( ) ;
map. put ( 1 , "李四" ) ;
map. put ( 2 , "吴昂无" ) ;
map. put ( 3 , "阿斯达" ) ;
map. put ( 4 , "张三" ) ;
map. put ( 5 , "刘能 " ) ;
map. put ( 6 , "胡乱帅" ) ;
Set< Integer> keySet = map. keySet ( ) ;
for ( Integer key : keySet) {
System. out. println ( key+ "----" + map. get ( key) ) ;
}
}
}
2. 将Map集合中的所有的值拿到放到一个集合中 遍历这个集合
package cn. wzx;
import java. util. Collection;
import java. util. HashMap;
import java. util. Map;
import java. util. Set;
public class Demo3 {
public static void main ( String[ ] args) {
Map< Integer, String> map = new HashMap < > ( ) ;
map. put ( 1 , "李四" ) ;
map. put ( 2 , "吴昂无" ) ;
map. put ( 3 , "阿斯达" ) ;
map. put ( 4 , "张三" ) ;
map. put ( 5 , "刘能 " ) ;
map. put ( 6 , "胡乱帅" ) ;
Collection< String> values = map. values ( ) ;
for ( String string : values) {
System. out. println ( string) ;
}
}
}
案例:通过输入值 找到集合中所对应的键
package cn. wzx;
import java. util. Collection;
import java. util. HashMap;
import java. util. Map;
import java. util. Scanner;
import java. util. Set;
public class Demo3 {
public static void main ( String[ ] args) {
Map< Integer, String> map = new HashMap < > ( ) ;
map. put ( 1 , "李四" ) ;
map. put ( 2 , "吴昂无" ) ;
map. put ( 3 , "阿斯达" ) ;
map. put ( 4 , "张三" ) ;
map. put ( 5 , "刘能 " ) ;
map. put ( 6 , "胡乱帅" ) ;
Scanner scanner = new Scanner ( System. in) ;
System. out. println ( "请输入值:" ) ;
String nameString = scanner. next ( ) ;
Set< Integer> keySet = map. keySet ( ) ;
for ( Integer integer : keySet) {
if ( map. get ( integer) . equals ( nameString) ) {
System. out. println ( integer) ;
}
}
}
}
3. 通过遍历键值对(了解)
案例:
package cn. wzx;
import java. util. Collection;
import java. util. HashMap;
import java. util. Map;
import java. util. Map. Entry;
import java. util. Scanner;
import java. util. Set;
public class Demo3 {
public static void main ( String[ ] args) {
Map< Integer, String> map = new HashMap < > ( ) ;
map. put ( 1 , "李四" ) ;
map. put ( 2 , "吴昂无" ) ;
map. put ( 3 , "阿斯达" ) ;
map. put ( 4 , "张三" ) ;
map. put ( 5 , "刘能 " ) ;
map. put ( 6 , "胡乱帅" ) ;
Scanner scanner = new Scanner ( System. in) ;
Set< Entry< Integer, String> > entrySet = map. entrySet ( ) ;
for ( Entry< Integer, String> entry : entrySet) {
System. out. println ( entry. getKey ( ) + " " + entry. getValue ( ) ) ;
}
}
}
Map集合的其他实现类
LinkedHashMap< > ( ) :能维护键值对添加的顺序 是HashMap的子类
TreeMap是SortedMap的实现类 SortedMap是Map的子接口,能够对键进行排序
注意:当键的类型是自定义对象的时候,如果要用treeMap进行排序必须重写comparable接口 定义比较规则
Properties:集合中的键和值都是String类型(jdbc struts2的配置文件)
案例:
package cn. wzx;
import java. util. Map;
import java. util. Properties;
import java. util. Set;
import java. util. TreeMap;
public class Demo3 {
public static void main ( String[ ] args) {
Properties properties = new Properties ( ) ;
properties. setProperty ( "1" , "战三1" ) ;
properties. setProperty ( "2" , "战三2" ) ;
properties. setProperty ( "3" , "战三3" ) ;
properties. setProperty ( "4" , "战三4" ) ;
properties. setProperty ( "8" , "战三5" ) ;
Set< Object> keySet = properties. keySet ( ) ;
for ( Object object : keySet) {
String string = ( String) object;
System. out. println ( string+ "---" + properties. getProperty ( string) ) ;
}
}
}