Collection 集合
集合中常用的方法
Collection:某些集合可以存储从重复元素,某些集合不能重复元素!
有些集合有序,有些集合无序(有序/无序:存储元素和取出元素是否一致!)
JDk不提供直接实现集合的接口
但是提供了更为具体的子接口实现集合
Collection接口(单例集合的根接口)
List接口 Set接口 实现类:ArrayList LinkedList Vector 实现类HashSet TreeSet
集合的功能
基本功能:
添加功能:
boolean add(Object e) :将任何数据类型添加到集合中
删除功能:
void clear():暴力删除
boolean remove(Object o):移出指定的元素
判断功能
boolean contains(Object o):判断是否包含指定的元素
boolean isEmpty():判断集合是否为空,如果为空,则返回 true;
转换功能:
Object[] toArray():将集合转换成对象数组
Iterator iterator():Collection集合的迭代器(集合的遍历方式)
Collection高级功能
boolean addAll(Collection c):添加一个集合中的所有元素
boolean removeAll(Collection c):
问题:是删除一个算删除还是删除所有算删除?
只要集合中有一个元素被包含,将这个元素从c1删除掉,则返回true!
boolean containsAll(Collection c):
问题:包含一个算包含还是包含所有算包含?
包含所有元素才算包含,返回true
public boolean retainAll(Collection c) 取交集
boolean的真实含义是什么: c1.retainlAll(c2):c1集合的元素是否发生变化!
A集合对B集合取交集,将交集的元素保存到A集合,boolean表达的是A集合是否发生变化
如果A集合没有变化的,返回结果false;如果A集合有变化,则返回true!
Collection遍历方式
1)Collection集合的方法 Object[] toArray
2)Collection集合的迭代器Iterator iterator()
3)size()+Object get(int index):普通for循环
4)列表迭代器:ListIteraotr listiterator()
5)增强for
迭代器
Iteritor iterator(): Collection集合的专有遍历方式
返回值为 Iteritor(接口),需要返回该接口的子实现类接口
Object next():获取下一个元素
boolean hasNext() 判断当前迭代器中是否有下一个元素
如果存在,则返回true,不存在内返回false
泛型
格式 : <数据类型:引用>
数组的定义格式
String[] strArray = {"hello","123"};
定义的时候就已经将类型限定了
集合为了迎合数组的特点,在创建数组的时候,将类型定义了,来保证集合中的元素类型是一致的
泛型的特点:
将集合的类型在创建的时候就明确了
好处:
1)避免了强制类型转换
2)将运行时期异常提前到了编译时期
3)解决的黄色警告线问题
4)提高了程序的安全性
泛型的使用
Collection< Student> c = new ArrayList < Student> ( ) ;
public class ObjectTool < T> {
private T obj ;
public void set ( T obj) {
this . obj = obj ;
}
public T get ( ) {
return obj ;
}
}
public class ObjectTool {
public < T> void show ( T t) {
System. out. println ( t) ;
}
}
public class InterImpl implements Inter < String> {
@Override
public void inter ( String t) {
System. out. println ( "hello," + t) ;
}
}
public class InterImpl < T> implements Inter < T> {
@Override
public void inter ( T t) {
System. out. println ( "hello," + t) ;
}
}
泛型的高级通配符
<?> 当前Object类型/任意Java类型(自定义/jdk提供...)
<? extends E>:向下限定:E类型以及它的子类
<? super E>:向上限定:E类型以及它的父类
List
List集合的特有功能
List集合的特有功能
void add(int index,Object element):在指定位置出添加一个新的元素
Object remove(int index):删除角标对应的元素
获取功能
Object get(int index):获取指定位置处的元素
int size():获取集合的范围
Object set(int index,Object element):在指定位置使用当前元素element替换
ListIteritor<E> listIterator():List集合的专有遍历方式:列表迭代器
ListIterator listIterator():List集合的专有遍历方式 :列表迭代器
ListIterator:列表迭代器
ListIterator<E> listIterator()这个方法底层实现:是通过ArrayList里面的成员内部类
ListItr extends Itr :实现的
正向遍历
boolean hasNext():判断是否有下一个元素
Object next() :获取下一个元素
逆向遍历
boolean hasPrevious():判断是否有上一个元素
Object previous():获取前一个元素
List集合案例实践 — 代码实践
import java. util. ArrayList;
import java. util. Collection;
import java. util. Iterator;
import java. util. List;
import java. util. ListIterator;
public class ListTest2 {
public static void main ( String[ ] args) {
List< String> c = new ArrayList < String> ( ) ;
c. add ( "hello" ) ;
c. add ( "java" ) ;
c. add ( "world" ) ;
for ( int x = 0 ; x < c. size ( ) ; x++ ) {
String s = c. get ( x) ;
if ( "world" . equals ( s) ) {
c. add ( "javaee" ) ;
}
}
System. out. println ( c) ;
}
}
集合去重 – 案例
import java. util. ArrayList;
import java. util. Iterator;
import java. util. List;
import java. util. ListIterator;
public class Student {
private String name;
private int age;
public Student ( ) {
super ( ) ;
}
public Student ( String name, int age) {
super ( ) ;
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 + "]" ;
}
@Override
public int hashCode ( ) {
final int prime = 31 ;
int result = 1 ;
result = prime * result + age;
result = prime * result + ( ( name == null) ? 0 : name. hashCode ( ) ) ;
return result;
}
@Override
public boolean equals ( Object obj) {
if ( this == obj)
return true ;
if ( obj == null)
return false ;
if ( getClass ( ) != obj. getClass ( ) )
return false ;
Student other = ( Student) obj;
if ( age != other. age)
return false ;
if ( name == null) {
if ( other. name != null)
return false ;
} else if ( ! name. equals ( other. name) )
return false ;
return true ;
}
}
public class Test {
public static void main ( String[ ] args) {
Student s1 = new Student ( "knight" , 21 ) ;
Student s2 = new Student ( "369" , 20 ) ;
Student s3 = new Student ( "knight" , 21 ) ;
Student s4 = new Student ( "369" , 20 ) ;
Student s5 = new Student ( "kasra" , 22 ) ;
List< Student> list = new ArrayList < Student> ( ) ;
list. add ( s1) ;
list. add ( s2) ;
list. add ( s3) ;
list. add ( s4) ;
list. add ( s5) ;
List< Student> list2 = new ArrayList < Student> ( ) ;
Iterator< Student> it = list. iterator ( ) ;
while ( it. hasNext ( ) ) {
Student stu1 = it. next ( ) ;
if ( ! list2. contains ( stu1) ) {
list2. add ( stu1) ;
}
}
ListIterator< Student> lit = list2. listIterator ( ) ;
while ( lit. hasNext ( ) ) {
Student stu2 = lit. next ( ) ;
System. out. println ( stu2. getName ( ) + "----" + stu2. getAge ( ) ) ;
}
}
}
选择排序思想去重–
可以利用选择排序思想的特点
使用0角标对应的元素依次和后面角标对应的元素对比,如果后面元素重复了,则将
该角标对应的元素从集合中删除,角标--
for(int x = 0 ; x < list.size()-1 ; x ++) {
for(int y = x +1 ; y < list.size() ; y ++) {
//如果后面的和前面的元素相等,删除后面的元素
if(list.get(y).equals(list.get(x))) {
list.remove(y) ;
y -- ;
}
}
}
增强for遍历
public class Test {
public static void main ( String[ ] args) {
Student s1 = new Student ( "yuyanjia" , 21 ) ;
Student s2 = new Student ( "jackylove" , 20 ) ;
Student s3 = new Student ( "knight" , 21 ) ;
Student s4 = new Student ( "369" , 20 ) ;
Student s5 = new Student ( "kasra" , 22 ) ;
Student s6 = new Student ( "bsyy" , 28 ) ;
List< Student> list1 = new ArrayList < Student> ( ) ;
list1. add ( s1) ;
list1. add ( s2) ;
list1. add ( s3) ;
System. out. println ( "使用for增强循环遍历list1" ) ;
for ( Student stu1 : list1) {
System. out. println ( stu1. getName ( ) + "---" + stu1. getAge ( ) ) ;
}
List< Student> list2 = new ArrayList < Student> ( ) ;
list2. add ( s4) ;
list2. add ( s5) ;
list2. add ( s6) ;
System. out. println ( "----------------" ) ;
System. out. println ( "使用for增强循环遍历list2" ) ;
for ( Student stu2 : list2) {
System. out. println ( stu2. getName ( ) + "---" + stu2. getAge ( ) ) ;
}
ArrayList< ArrayList< Student> > list3 = new ArrayList < ArrayList< Student> > ( ) ;
list3. add ( ( ArrayList< Student> ) list1) ;
list3. add ( ( ArrayList< Student> ) list2) ;
System. out. println ( "----------------" ) ;
System. out. println ( "使用for增强循环遍历list3" ) ;
for ( ArrayList< Student> as : list3) {
for ( Student stu3 : as) {
System. out. println ( stu3. getName ( ) + "-" + stu3. getAge ( ) ) ;
}
}
}
}
list集合遍历的5种方式
import java. util. ArrayList;
import java. util. Iterator;
import java. util. List;
import java. util. ListIterator;
public class ForeachTest {
public static void main ( String[ ] args) {
List< Student> list = new ArrayList < Student> ( ) ;
Student s1 = new Student ( "文章" , 35 ) ;
Student s2 = new Student ( "马伊琍" , 44 ) ;
Student s3 = new Student ( "姚笛" , 28 ) ;
Student s4 = new Student ( "黄晓明" , 35 ) ;
Student s5 = new Student ( "邓超" , 37 ) ;
list. add ( s1) ;
list. add ( s2) ;
list. add ( s3) ;
list. add ( s4) ;
list. add ( s5) ;
Object[ ] objs = list. toArray ( ) ;
for ( int x = 0 ; x < objs. length ; x ++ ) {
Student s = ( Student) objs[ x] ;
System. out. println ( s. getName ( ) + "---" + s. getAge ( ) ) ;
}
System. out. println ( "---------------------------------" ) ;
Iterator< Student> it = list. iterator ( ) ;
while ( it. hasNext ( ) ) {
Student s = it. next ( ) ;
System. out. println ( s. getName ( ) + "---" + s. getAge ( ) ) ;
}
System. out. println ( "--------------------------------" ) ;
for ( int x = 0 ; x < list. size ( ) ; x ++ ) {
Student s = list. get ( x) ;
System. out. println ( s. getName ( ) + "---" + s. getAge ( ) ) ;
}
System. out. println ( "-------------------------------" ) ;
ListIterator< Student> lit = list. listIterator ( ) ;
while ( lit. hasNext ( ) ) {
Student s = lit. next ( ) ;
System. out. println ( s. getName ( ) + "---" + s. getAge ( ) ) ;
}
System. out. println ( "-------------------------------" ) ;
for ( Student s : list) {
System. out. println ( s. getName ( ) + "---" + s. getAge ( ) ) ;
}
}
}
List三个子实现类的特点:
List三个子实现类的特点:
ArrayList
底层数据结构是可变数组结构: 查询快,增删慢
ArrayList底层可变数组:
ArrayList(int initialCapacity) :通过初始化容量构造ArrayList集合
默认容量大小:capacity:10个
ArrayList()---->通过初试容量大小判断是否构造一个新Object[] 数组对象
结论:它的扩容机制 ---1.5倍扩容
线程角度:
线程不安全的类----不同步的----执行效率高!
单线程程序中,通常没有告诉使用什么集合的时候,优先采用的是ArrayList集合!
Vector :底层数据数组结构(对象数组)
查询快,增删慢
线程角度:
线程安全的类 ---->同步的----->执行效率低
多线程程序中要考虑安全问题,使用Vector
LinkedList:
底层数据结构:链接列表实现(链表)
线程角度:
线程不安全-----不同步---->执行效率高
特有功能:
可以模拟栈结构的:先进后出!
List集合的子实现类ArrayList应用----代码实践
import java. util. ArrayList;
public class Test {
public static void main ( String[ ] args) {
ArrayList< ArrayList< Student> > bigList =
new ArrayList < ArrayList< Student> > ( ) ;
ArrayList< Student> list1 = new ArrayList < Student> ( ) ;
list1. add ( new Student ( "刘备" , 39 ) ) ;
list1. add ( new Student ( "关羽" , 35 ) ) ;
list1. add ( new Student ( "张飞" , 30 ) ) ;
ArrayList< Student> list2 = new ArrayList < Student> ( ) ;
list2. add ( new Student ( "曹操" , 44 ) ) ;
list2. add ( new Student ( "蒋干" , 36 ) ) ;
list2. add ( new Student ( "黄忠" , 45 ) ) ;
ArrayList< Student> list3 = new ArrayList < Student> ( ) ;
list3. add ( new Student ( "宋江" , 50 ) ) ;
list3. add ( new Student ( "林冲" , 30 ) ) ;
list3. add ( new Student ( "鲁智深" , 45 ) ) ;
bigList. add ( list1) ;
bigList. add ( list2) ;
bigList. add ( list3) ;
for ( ArrayList< Student> list: bigList) {
for ( Student s : list) {
System. out. println ( s. getName ( ) + "\t" + s. getAge ( ) ) ;
}
}
}
}
List集合的子实现类Vector应用 — 代码实践
import java. util. Enumeration;
import java. util. Vector;
public class VectorDemo {
public static void main ( String[ ] args) {
Vector< String> v = new Vector < String> ( ) ;
v. add ( "hello" ) ;
v. add ( "world" ) ;
v. add ( "Javaee" ) ;
v. add ( 2 , "JavaSE" ) ;
Enumeration< String> em = v. elements ( ) ;
while ( em. hasMoreElements ( ) ) {
String s = em. nextElement ( ) ;
System. out. println ( s) ;
}
System. out. println ( "-----------------------------" ) ;
for ( int x = 0 ; x < v. size ( ) ; x ++ ) {
String s = v. elementAt ( x) ;
System. out. println ( s) ;
}
System. out. println ( "-----------------------------" ) ;
for ( String s: v) {
System. out. println ( s) ;
}
}
}
List集合的子实现类LinkedList的应用 – 代码实践
import java. util. LinkedList;
public class Test {
public static void main ( String[ ] args) {
LinkedList< String> list = new LinkedList < String> ( ) ;
list. addFirst ( ");" ) ;
list. addFirst ( "world" ) ;
list. addFirst ( "hello" ) ;
list. addFirst ( "System.out.println(" ) ;
while ( ! list. isEmpty ( ) ) {
String s = list. removeFirst ( ) ;
System. out. print ( s) ;
}
}
}
自定义栈集合,模拟压栈弹栈 — LinkedList的特有功能
import java. util. LinkedList;
public class MyStack {
private LinkedList< String> link = null;
public MyStack ( ) {
link = new LinkedList < String> ( ) ;
}
public void add ( String s) {
link. addFirst ( s) ;
}
public String get ( ) {
return link. removeFirst ( ) ;
}
public boolean isEmpty ( ) {
return link. isEmpty ( ) ;
}
}
public class Test {
public static void main ( String[ ] args) {
MyStack my = new MyStack ( ) ;
my. add ( "好" ) ;
my. add ( "你" ) ;
my. add ( "hello" ) ;
while ( ! my. isEmpty ( ) ) {
String s = my. get ( ) ;
System. out. print ( s) ;
}
}
}