集合框架
一、概述 1.Java中集合类的关系图:
2.集合框架出现的原因:面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式。
※ 数组虽然也可以存储对象,但长度是固定的;集合长度是可变的。 ※数组中可以存储基本数据类型,集合只能存储对象。3.集合框架的特点:只用于存储对象;长度可变;可以存储不同类型的对象。
二、Collection 1. Collection的共性方法:增、删、改、查、取交集 例:
public static void base_method()※ 集合中存储的都是对象的引用(地址)2. 迭代器:
{
//创建集合容器,使用Collection接口的子类。ArrayList
ArrayList al = new ArrayList();
//1.添加元素
al.add("java01");//add(Object obj)
al.add("java02");
al.add("java03");
al.add("java04");
//打印集合
sop(al);
//2.获取个数,集合长度
sop("size:"+al.size());
//3.删除元素
al.remove("java02"); //al.clear(); 清空集合
sop(al);
//4.判断元素
sop("java03是否存在? "+al.contains("java03"));
sop("集合是否为空? "+al.isEmpty());
}
<pre name="code" class="java">public static void method_2()
{
ArrayList al1 = new ArrayList();
al1.add("java01");
al1.add("java02");
al1.add("java03");
al1.add("java04");
ArrayList al2 = new ArrayList();
al2.add("java01");
al2.add("java02");
al2.add("java05");
al2.add("java06");
al1.retainAll(al2); //取交集,al1中只会存储和al2相同的元素
al1.removeAll(al2); //去交集,al1中只会存储和al2不相同的元素
sop("al1:"+al1+" al2:"+al2);
}
public static void sop(Object obj)
{
System.out.println(obj);
}
(1)迭代器是取出集合中元素的方式
对于集合的元素取出这个动作:当不足以用一个函数来描述,需要用多个功能来体现,所以就将取出这个动作封装成一个对象来描述,把取出方式定义在集合的内部,这样取出方式就可以直接访问集合内部的元素。那么取出方式就被定义成了内部类。
而每一个容器的数据结构不同,所以取出的动作细节也不一样,但都具有共性内容:判断和取出,那么就可以将这些共性抽取。这些内部类都符合一个规则(或者说都抽取出来一个规则),就是Iterator,并通过一个对外提供的方法:iterator(); 来获取集合的取出对象。
(2) 迭代的常见操作※ 因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。
hasNext();//有下一个元素,返回真,作为迭代器的条件
next();//取出下一个元素
remove();//移除
※ 在迭代时循环中next调用一次,就要hasNext判断一次。
两种表现形式:
a.
for(Iterator iter = a.iterator();iter.hasNext(); )b.
{
<span style="white-space:pre"></span>System.out.println(iter.next());
}
Iteratoriter = a.iterator();
while(iter.hasNext())
{
<span style="white-space:pre"></span>System.out.println(iter.next());
}
三、List集合
1. 概述:元素是有序的,可以重复,因为该集合体系有索引
List
|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
|--LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。
|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。
2. 特有方法:
※ 凡是可以操作角标的方法都是该体系特有的方法。
(1)增
booleanadd(index,element); 指定位置添加元素
BooleanaddAll(index,Collection); 在指定位置增加给定集合中的所有元素
若省略位置参数,则在当前集合的后面依次添加元素
(2)删
Booleanremove(index); 删除指定位置的元素
(3)改
set(index,element); 修改指定位置的元素。
(4)查
get(index); 通过角标获取元素
subList(from,to); 获取部分对象元素
(5)其他
listIterator(); List特有的迭代器(Iterator迭代时不可以通过集合对象的方法操作集合中的元素)
可以在迭代时对集合元素进行增、删、改、查
indexOf(obj); 获取元素第一次出现的位置,如果没有则返回-1
※ List集合判断元素是否相同,移除等操作,依据的是元素的equals方法。
3. LinkedList特有方法:
(1)增
addFirst();
addLast();
(2)获取:获取元素,但不删除元素。如果集合中没有元素,会出现NoSuchElementException
getFirst();
getLast();
(3)删:获取元素,并删除元素。如果集合中没有元素,会出现NoSuchElementException
removeFirst();
removeLast();
※ 在JDK1.6以后,出现了替代方法。
(1)增
offFirst();
offLast();
(2)获取:获取元素,但是不删除。如果集合中没有元素,会返回null。
peekFirst();
peekLast();
(3)删:获取元素,并删除元素。如果集合中没有元素,会返回null。
pollFirst();
pollLast();
例:
<span style="white-space:pre"></span>public class LinkedListDemo4. ArrayList
<span style="white-space:pre"></span>{
<span style="white-space:pre"></span>public static void main(String[] args)
<span style="white-space:pre"></span>{
LinkedList link = new LinkedList();
link.addFirst("java01");//addFirst:04.03.02.01,addLast:01.02.03.04
link.addFirst("java02");
link.addFirst("java03");
link.addFirst("java04");
sop(link);
sop(link.getFirst());
sop(link.getLast());
sop(link.removeFirst());//先进后出;removeLast先进先出
sop("size="+link.size());
while(!link.isEmpty())
{
sop(link.removeFirst()); //正向取。 removeLast反向取
}
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>public static void sop(Object obj)
<span style="white-space:pre"></span>{
<span style="white-space:pre"></span>System.out.println(obj);
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>}
练习:
/*class Person{private String name;private int age;public boolean equals(Object obj)//重写equals方法{if(!(obj instanceof Person))return false;Person p = (Person)obj;System.out.println(this.name+"..."+p.name);return this.name.equals(p.name)&&this.age==p.age;}Person(String name,int age){this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}}public class ArrayListTest2{public static void main(String[] args) {ArrayList al = new ArrayList();al.add(new Person("lisi01",30));al.add(new Person("lisi02",32));al.add(new Person("lisi02",32));al.add(new Person("lisi03",33));al.add(new Person("lisi04",35));al.add(new Person("lisi04",35));al = singleElement(al);Iterator it = al.iterator();while(it.hasNext()){Person p = (Person) it.next();sop(p.getName()+": :"+p.getAge());}}public static ArrayList singleElement(ArrayList al){ArrayList newAl = new ArrayList();Iterator it = al.iterator();while(it.hasNext()){Object obj = it.next();if(!newAl.contains(obj)) //contains调用的是Person的equals方法newAl.add(obj);}return newAl;}public static void sop(Object obj){System.out.println(obj);}}
* 将自定义对象作为元素,存储到ArrayList集合中,并去除重复元素
* 比如:人对象:同姓名同年龄视为同一个人,为重复元素
*
* 思路:1.对人描述,将数据封装进人对象
* 2.定义容器,将人存入
* 3.取出
*
* List集合判断元素是否相同,依据是元素的equals方法。
*/
<pre name="code" class="java" style="line-height: 26px;">import java.util.*;
※ 增删操作频繁,使用LinkedList;增删操作不频繁,两者都可用;增删和查询操作同时涉及,使用ArrayList
※ ArrayList更常用
四、Set
1. 概述:元素是无序(存入和取出的顺序不一定一致)的,且不可以重复。
Set
|--HashSet
|--TreeSet
※ Set集合的功能和Collection是一致的。
2. HashSet:底层数据结构是哈希表,线程不同步。
例:保证元素唯一性的原理:判断元素的hashCode值是否相同。如果相同,还会继续判断元素的equals方法,是否为 true(ArrayList判断只依赖equals)
/*class HashSetTest{public static void sop(Object obj){System.out.println(obj);}public static void main(String[] args) {HashSet hs = new HashSet();hs.add(new Person("a1",11));hs.add(new Person("a2",12));hs.add(new Person("a3",13));hs.add(new Person("a2",12));hs.add(new Person("a4",14));sop("a1:"+hs.contains(new Person("a1",11)));sop("a3:"+hs.remove(new Person("a3",13)));Iterator it = hs.iterator();while(it.hasNext()){Person p = (Person)it.next();sop(p.getName()+"::"+p.getAge());}}public static class Person{private String name;private int age;Person(String name,int age){this.name = name;this.age = age;}public int hashCode() //复写Object类的hashCode()方法{System.out.println(this.name+".....hashCode");return name.hashCode()+age*39; //为了尽量保证哈希值唯一*39}public boolean equals(Object obj)//复写equals()方法{if(!(obj instanceof Person))return false;Person p = (Person)obj;System.out.println(this.name+"...equals..."+p.name);return this.name.equals(p.name)&&this.age==p.age;//先判断姓名,再判断年龄}public String getName() {return name;}public int getAge() {return age;}}}
* 往HashSet集合中存入自定义对象
* 姓名和年龄相同为同一个人,重复元素
*/
<pre name="code" class="java" style="line-height: 26px;">import java.util.*;
3. TreeSet:
※ 底层数据结构是二叉树,可以对Set集合中的元素进行排序,默认按照字母的自然排序。
※ 保证元素唯一性的依据:compareTo方法,return 0
※ 排序方式:
(1)第一种方式:让元素自身具备比较性,元素需要实现comparable接口,覆盖compareTo方法也称为元素的自然排序,或叫做默认顺序。
例:
/*
* 给TreeSet集合中存储自定义对象学生,按年龄排序
*/
import java.util.*;
public class TreeSetDemo
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet();
ts.add(new Student("lisi",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi08",19));
ts.add(new Student("lisi08",19));
Iterator it = ts.iterator();
while(it.hasNext())
{
Student stu = (Student)it.next();
System.out.println(stu.name+"..."+stu.age);
}
}
public static class Student implements Comparable //该接口强制让学生具备比较性
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public int compareTo(Object obj)
{
//return 0;
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
System.out.println(this.name+"...comapreto..."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
return this.name.compareTo(s.name);
return -1;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
}(2)第二种方式:比较器,当元素自身不具备比较性时,或者具备的比较性不是所需要的,这时就需要让集合自身具备比较性,在集合初始化时,就有了比较方式,定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
※ 比较器构造方式:定义一个类,实现Comparator接口,覆盖compare方法。
※ 排序时,当主要条件相同时,一定要判断次要条件
※ 当两种排序都存在时,以比较器为主
例:
import java.util.*;
class TreeSetDemo2
{
public static void main(String[] args)
{
TreeSet ts = new TreeSet(new MyCompare());
ts.add(new Student("lisi01",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi08",18));
ts.add(new Student("lisi007",29));
Iterator it = ts.iterator();
while(it.hasNext())
{
Student stu = (Student)it.next();
System.out.println(stu.getName()+"..."+stu.getAge());
}
}
}
class Student implements Comparable //该接口强制让学生具备比较性
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public int compareTo(Object obj)
{
//return 0;
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象");
Student s = (Student)obj;
System.out.println(this.name+"...comapreto..."+s.name);
if(this.age>s.age)
return 1;
if(this.age==s.age)
return this.name.compareTo(s.name);
return -1;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
五、泛型
1. 概念:JDK1.5版本后出现的新特性,用于解决安全问题,是一个安全机制
2. 好处:
(1)将运行时期出现的问题ClassCastException,转移到了编译时期,方便于程序员解决问题,让运行时期问题减少,安全
(2)避免了强制转换
3. 泛型格式:通过<>来定义要操作的引用数据类型
※ 在使用java提供的对象时,什么时候写泛型:通常在集合框架中很常见,只要见到<>就要定义泛型
※ 其实<>就是用来接收类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可
例:
public class GenericDemo4. 泛型
{
public static void main(String[] args)
{
ArrayList<String> al = new ArrayList<String>();//泛型
al.add("abc01");
al.add("abc0991");
al.add("abc014");
Iterator<String> it = al.iterator();
while(it.hasNext())
{
String s = it.next();
System.out.println(s+":"+s.length());
}
}
}(1)泛型类:当类中要操作的引用数据类型不确定时,定义泛型类。
例:
class Utils<QQ>
{
private QQ q;
public void setObject(QQ q)
{
this.q = q;
}
public QQ getObject()
{
return q;
}
}(2)泛型方法:泛型类定义的泛型,在整个类中有效,如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了,为了让不同方法可以操作不同类型,而且类型还不确定,可以将泛型定义在方法上
※ 静态方法不可以访问类上定义的泛型,如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上
※ 定义泛型放在返回值前面
例:
class Demo(3)泛型限定:(用于进行泛型扩展)
{
public <T> void show(T t)
{
System.out.println("show:"+t);
}
public <Q> void print(Q q)
{
System.out.println("print:"+q);
}
}
? extends E:可以接收E类型或者E的子类型。(上限)
? super E:可以接收E类型或者E的父类型。(下限)
※ "?"通配符,也可以理解为占位符
六、Map集合
1. 概述:Map<K,V>集合是一个接口,和List集合及Set集合不同的是,它是双列集合,并且可以给对象加上名字,
即键(Key)
※ 该集合存储键值对,一对一对往里存
2. Map※ 要保证键的唯一性。
|--Hashtable:底层是哈希表数据结构,不可以存入null键null值(该集合是线程同步的)
|--Hashmap:底层是哈希表数据结构,允许使用null键null值(该集合是不同步的)
|--Treemap :底层是二叉树数据结构,线程不同步,可以用于给Map集合中的键排序
※ 和Set很像,其实Set底层就是使用的Map集合。
3. 常用方法
(1)添加: put(K key,V value);
putAll(Map<? extends K , ? extends V>m);
(2)删除:clear();
remove(Object key);
(3)判断:containsValue(Object value);
containsKey(Object key);
isEmpty();
(4)获取:get (Object key);
size();
values();
※ keySet(); 将map中的所有键存入到Set集合,因为Set有迭代器,通过迭代器取出所有的键
再通过get方法获取每个键的对应值
entrySet(); 将map中的映射关系取出,存入到set集合
例:
/*
* 每一个学生都有对应的归属地。
* 学生Student,地址String
* 学生属性:姓名,年龄。姓名和年龄相同的视为同一个学生,保证学生唯一性
*
* 1.描述学生
* 2.定义map容器,将学生作为键,地址作为值,存入
* 3.获取map集合中的元素
*/
import java.util.*;
class Student implements Comparable<Student>
{
private String name;//描述学生属性
private int age;
public Student(String name, int age)
{
super();
this.name = name;
this.age = age;
}
public int compareTo(Student s)//复写compareTo方法
{
int num = new Integer(this.age).compareTo(new Integer(s.age));
if(num==0)
return this.name.compareTo(s.name);
return num;
}
//复写hashCode方法
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
//复写equals方法
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
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 String getName() {
return name;
}
public int getAge() {
return age;
}
public String toString()
{
return name+":"+age;
}
}
public class MapTest
{
public static void main(String[] args)
{
HashMap<Student,String> hm = new HashMap<Student,String>();
hm.put(new Student("lisi1",21), "beijing");//添加元素
hm.put(new Student("lisi1",21), "tianjin");//会覆盖前一个
hm.put(new Student("lisi2",22), "shanghai");
hm.put(new Student("lisi3",23), "nanjing");
hm.put(new Student("lisi4",24), "wuhan");
//第一种取出方式 keySet
Set<Student> keySet = hm.keySet();//获取map集合所有键的Set集合
Iterator<Student> it = keySet.iterator();//获取其迭代器
while(it.hasNext())
{
Student stu = it.next();
String addr = hm.get(stu);//有了键,通过map集合的get方法获取其对应的值
//System.out.println(stu+".."+addr);
}
//第二种取出方式 entrySet
Set<Map.Entry<Student, String>> entrySet = hm.entrySet();//取出映射关系
Iterator<Map.Entry<Student, String>> iter = entrySet.iterator();
while(iter.hasNext())
{
Map.Entry<Student, String> me = iter.next();
Student stu = me.getKey();
String addr = me.getValue();
System.out.println(stu+".."+addr);
}
}
}※ 关于Map.Entry:
Map是一个接口,其实,Entry也是一个接口,它是Map的子接口中的一个内部接口,就相当于是类中有内部类一样。
※ 为何要定义在其内部的原因:
a.Map集合中村的是映射关系这样的两个数据,是先有Map这个集合,才可有映射关系的存在,而且此类关系是集合的内部事务。
b.并且这个映射关系可以直接访问Map集合中的内部成员,所以定义在内部。
4. TreeMap:用于给Map集合中的键排序
例:
/*5.Map集合扩展:
需求:对学生对象的年龄进行升序排序
因为数据是以键值对形式存在的,所以使用可以排序的Map集合,TreeMap
*/
import java.util.*;
class MapTest2
{
public static void main(String[] args)
{
TreeMap<Students,String> t = new TreeMap<Students,String>(new StuNameComparator());
t.put(new Student("lisi1",21), "beijing");
t.put(new Student("lisi2",22), "shanghai");
t.put(new Student("lisi3",23), "nanjing");
t.put(new Student("lisi4",24), "wuhan");
Set<Map.Entry<Students,String>> entrySet = t.entrySet();
Iterator<Map.Entry<Students,String>> it = entrySet.iterator();
while(it.hasNext())
{
Map.Entry<Students,String> me = it.next();
Student stu = me.getKey();
String addr = me.getValue();
System.out.println(stu+":::"+addr);
}
}
}
//学生类同上
//自定义比较器,比较姓名
class StuNameComparator implements Comparator<Student>
{
public int compare(Student s1,Student s2)
{
int num = s1.getName().compareTo(s2.getName());
if(num==0)
return new Integer(s1.getAge()).compareTonew Integer(s2.getAge()));
return num;
}
}在很多项目中,应用比较多的是一对多的映射关系,这就可以通过嵌套的形式将多个映射定义到一个大的集合中,并将大的集合分级处理,形成一个体系。
例:
/*
map扩展知识。
map集合被使用是因为具备映射关系。
以下是班级对应学生,而学生中学号对应着姓名的映射关系:
"yureban" Student("01" "zhangsan");
"yureban" Student("02" "lisi");
"jiuyeban" "01" "wangwu";
"jiuyeban" "02" "zhaoliu";
就如同一个学校有多个教室。每一个教室都有名称。
*/
import java.util.*;
class MapExpandKnow
{
public static void main(String[] args)
{
//预热班集合
HashMap<String,String> yureban=new HashMap<String,String>();
//就业班集合
HashMap<String,String> jiuyeban=new HashMap<String,String>();
//学校集合
<span style="white-space:pre"></span>HashMap<String,HashMap<String,String>> czbk=new HashMap<String,HashMap<String,String>>();
//学校中班级集合和名称的映射
czbk.put("yureban",yureban);
czbk.put("jiuyueban",jiuyeban);
<span style="white-space:pre"></span>//预热班级中学号与姓名的映射
yureban.put("01","zhangsan");
yureban.put("02","lisi");
//就业班级中学号与姓名的映射
jiuyeban.put("01","wangwu");
jiuyeban.put("02","zhouqi");
<span style="white-space:pre"></span>//直接显示全部学生信息
getAllStudentInfo(czbk);
}
//定义一个方法获取全部学生信息,包括在哪个班级,叫什么名字,学号多少
public static void getAllStudentInfo(HashMap<String ,HashMap<String,String>> hm)
{
for (Iterator<String> it=hm.keySet().iterator();it.hasNext() ; )//用keySet取出方式
{
String s= it.next();//班级名称
System.out.println(s+":");
HashMap<String,String> stu=hm.get(s);//班级集合
getStudentInfo(stu);
}
}
//获取班级中学生的信息,包括姓名和学号
public static void getStudentInfo(HashMap<String,String> hm)
{
for (Iterator<String> it=hm.keySet().iterator();it.hasNext() ; )
{
String key=it.next();//学号
String value=hm.get(key);//姓名
System.out.println(key+"..."+value);
}
}
}
七、集合框架工具类
1. Collections
(1)概述:Collections是对集合框架的一个工具类。它里边的方法都是静态的,不需要创建对象,并未封装特有数据。
在Collections工具类中大部分方法是用于对List集合进行操作的,如比较,二分查找,随机排序等。
(2)常见操作:
a.查找
Tmax(Collection<? extends T> coll);
(根据集合的自然顺序,获取coll集合中的最大元素)
Tmax(Collection<? extends T> coll,Comparator<? super T> comp);
(根据指定比较器comp的顺序,获取coll集合中的最大元素)
intbinarySearch(Lsit<? extends Comparable<? super T>> list,Tkey);
(二分法搜索list集合中的指定对象)
b.替换
voidfill(List<? super T> list, T obj);
(将list集合中的全部元素替换成指定对象obj)
booleanreplaceAll(List<T> lsit,T oldVal,T newVal);
(用newVal替换集合中的oldVal值)
void swap(Listlist,int i,int j);
(在指定列表的指定位置处交换元素)
c.排序
void shuffle(List<?> list);
(使用默认随机源对list集合中的元素进行随机排序)
void sort(Lsit<T> list);
(根据自然顺序对list集合中的元素进行排序)
voidsort(List<T> lsit,Comparator<? super T> c);
(根据指定比较器c的排序方式对list集合进行排序)
d.反转
reverse(List<?> list);
(反转list集合中元素的顺序)
Comparator reverseOrder();
(返回一个比较器,强行逆转了实现Comparable接口的对象的自然顺序)
ComparatorreverseOrder(Comparator<T> cmp);
(返回一个比较器,强行逆转了指定比较器的顺序)
e.同步的集合
List<T>synchronizedList(List<T> list);
(返回支持的同步(线程安全的)List集合)
Map<K,V>synchronizedList(Map<K,V> m);
(返回支持的同步(线程安全的)Map集合)
(3)与Collection的区别:
Colletion是java.util包中的接口,是集合类的基本接口,主要的子接口有list和set,都可以使用迭代器对集合进行遍历
Collections是java.util包中的类,是针对集合的一个实用工具类,包含对各种集合的搜索、查询、修改、排序、线程安全等一系列的静态方法。
2. Arrays
(1)概述:Arrays是用于操作数组的工具类,里边的方法也全是静态的,不需要创建对象。
把数组变成List集合的好处:可以使用集合的思想和方法来操作数组中的元素。
如:contains,get,indexOf,subList等方法。
(2)常见方法
a. Lsit<T> asList(T... a); (将数组转换为集合)
※ 将数组转换成集合,不可使用集合的增删方法,因为数组的长度是固定的。如果进行增删操作,则会产生UnsupportedOperationException的编译异常。
※ 如果数组中的元素都是对象,则变成集合时,数组中的元素就直接转为集合中的元素。
※ 如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
b. binarySearch(); (二分查找方法,fill():替换方法,sort():排序方法等)
※ 可对数组元素进行相应操作,可以接受除boolean之外的其他各种基本数据类型及有序的引用类型数组的参数,且还可以对指定元素的范围,并可根据指定比较器进行相应的操作。
如:sort(T[]a,Comparator<? super T> c)
fill(int[]a,int from,int to)等
c. String toString(); (可以接收各种数组类型参数,并返回指定数组内容的字符串表现形式)
(3)集合变数组
Collection接口中的toArray方法。
<T> T[] toArray (T[] a);(将集合变为指定类型的数组)
a. 指定类型的数组到底要定义多长呢?
当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。
当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。
所以创建一个刚刚好的数组最优。
b. 将集合变数组:为了限定对元素的操作,不再需要进行增删。
八、扩展知识——1.5版本新特性
1. 高级for
(1)格式:for(数据类型变量名 :被遍历的集合(collection)或者数组) {执行语句}
※ 对集合进行遍历,只能获取集合元素,不能对集合进行操作,可以看作是迭代器的简写形式。
※ 迭代器除了遍历,还可以进行remove集合中元素的动作;如果使用ListIterator,还可以在遍历过程中对集合进行增删改查的操作。
(2)传统for和高级for的区别:
高级for有一个局限性,必须有被遍历的目标(集合或数组)。
传统for遍历数组时有索引。
建议在遍历数组的时候,使用传统for,因为传统for可以定义角标。
例:
for(int i : arr)
{
System.out.println("i:"+i);
}
2. 方法的可变参数
如果一个方法在参数列表中传入多个参数,个数不确定,那么每次都要复写该方法。这时可以用数组作为形式参数。但是在传入时,每次都需要定义一个数组对象,作为实际参数。在JDK1.5版本后,就提供了一个新特性:可变参数。
可变参数其实就是数组参数的简写形式。不用每一次都手动的建立数组对象。只要将要操作的元素作为参数传递即可。隐式将这些参数封装成了数组。
例:
class ParamMethodDemo
{
public static void main(String[] args)
{
show("hehe",2,3,4,5,6);
}
public static void show(String str,int... arr)//...就表示可变参数
{
System.out.println(arr.length);
}
}
※ 可变参数一定要定义在参数列表的最后面。
3. 静态导入
(1)格式:
import static java.util.Arrays.*;(导入的是Arrays这个类中的所以静态成员)
import static java.lang.System.*;(导入了Ssytem类中所以静态成员)
※ 没加static导入的是类,加上static导入的全是某一个类中所以的静态成员。
※ 这样写在调用该类的静态方法时可以不用再写类名。如:Arrays.sort(数组);就可以直接写sort(数组);
※ 当导入的两个类中有同名成员时,需要在成员前加上相应的类名。
※ 当类名重名时,需要指定具体的包名。当方法重名时,指定具体所属的对象或者类。