该篇博客目录
1、List接口及其实现类(ArrayList)
2、泛型(概述、构造方法中使用泛型、设置多个泛型、通配符、泛型接口、泛型方法、泛型数组)
3、Set接口及其两个常用实现类(HashSet、TreeSet)
一、List接口及其实现类(ArrayList)
1、List接口概述
- List是元素有序且可以重复元素的集合,被称为序列
- List可以精确的控制每个元素的插入位置,或删除某个位置的元素
2、List的常用实现类————ArrayList
- ArrayList称为数组序列,是List的一个重要实现类,使用频率最高(List还有其他实现类,可参考api)
- ArrayList底层是由数组实现的(查询快,增删慢)
- 线程不安全,效率高
3、ArrayList常用方法(具体可参考api)
package Collection_eg;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Coll {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建对象
ArrayList obj=new ArrayList();
obj.add("xlj");
obj.add("hahaha");
Iterator it=obj.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
for(int i=0;i<obj.size();i++)
{
System.out.println(obj.get(i));
}
}
}
4、List——ArrayList进行选课功能(添加、删除、修改、遍历)Demo
Course类
package project3;
public class Course {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
test测试类
package project3;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class test {
public List ToChoiceCourse;
//添加课程
public void AddCourse()
{
Course a=new Course();
a.setId("1");
a.setName("java课程");
ToChoiceCourse.add(a);
Course temp=(Course)ToChoiceCourse.get(0);
System.out.println("成功插入课程:"+temp.getId()+":"+temp.getName());
Course b=new Course();
b.setId("2");
b.setName("C课程");
ToChoiceCourse.add(b);
Course temp2=(Course)ToChoiceCourse.get(1);
System.out.println("成功插入课程:"+temp2.getId()+":"+temp2.getName());
System.out.println("此时的课程:");
IteratorCourse();
}
//删除课程
public void RemoveCourse()
{
ToChoiceCourse.remove(0);
System.out.println("成功删除课程1");
System.out.println("此时的课程:");
IteratorCourse();
}
//修改课程
public void ChangeCourse()
{
Course Mod=new Course();
Mod.setId("1222");
Mod.setName("高数");
ToChoiceCourse.set(0, Mod);
System.out.println("成功修该课程2");
System.out.println("此时的课程:");
IteratorCourse();
}
//遍历课程
public void IteratorCourse()
{
Iterator it=ToChoiceCourse.iterator();
while(it.hasNext())
{
Course cos=(Course)it.next();
System.out.println(cos.getId()+":"+cos.getName());
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
test op=new test();
op.ToChoiceCourse=new ArrayList();
op.AddCourse();
op.RemoveCourse();
op.ChangeCourse();
}
}
二、泛型(概述、构造方法中使用泛型、设置多个泛型、通配符、泛型接口、泛型方法、泛型数组)
1、泛型概述
- 泛型是JDK1.5之后增加的新功能
- 泛型可以解决数据类型的安全性问题(泛型可以避免类型转换问题)
- 泛型主要原理:是在类声明的时候通过一个标识(常用T,K标识)表示类中某个属性的类型或者某个方法的返回值及参数类型
2、格式(泛型类)
访问权限 class 类名<泛型标识,泛型标识....>
{
属性
方法
}
3、对象的创建
//这里具体类型指包装类名
类名<具体类型> 对象名=new 类名<具体类型>();
4、泛型用法Demo
test_ppop为泛型的类
package p4;
public class test_ppop<T> {
private T x;
private T y;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
test测试类
package p4;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//指定泛型为int类型
test_ppop<Integer> obj=new test_ppop<Integer>();
obj.setX(1);
obj.setY(2);
System.out.println(obj.getX()+"-"+obj.getY());
//指定泛型为String类型
test_ppop<String> obj2=new test_ppop<String>();
obj2.setX("12");
obj2.setY("99");
System.out.println(obj2.getX()+"-"+obj2.getY());
}
}
5、构造方法中使用泛型
与普通构造方法一样使用
class Demo<T>{
private T Value;
public Demo(T Value)
{
this.Value=Value;
}
}
6、设置多个泛型
- 直接在<>中添加多个泛型标识,每个泛型用逗号隔开
- 如以下的Demo
test_ppop为泛型的类
package p4;
public class test_ppop<K,T> {
private T a;
private K b;
public T getA() {
return a;
}
public void setA(T a) {
this.a = a;
}
public K getB() {
return b;
}
public void setB(K b) {
this.b = b;
}
}
test测试类
package p4;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
test_ppop<String,Integer> obj=new test_ppop<String,Integer>();
obj.setA(9999);
obj.setB("hello");
System.out.println(obj.getA()+"-"+obj.getB());
}
}
7、泛型中的通配符
a、概述:通配符为了解决类型被限制死了,不能动态根据实例来确定的缺点
b、通配符三大类
- 无边界的通配符(Unbounded Wildcards), 就是
c、先看下面一个例子
test_ppop为泛型的类
package p4;
public class test_ppop<T> {
private T a;
public T getA() {
return a;
}
public void setA(T a) {
this.a = a;
}
}
test测试类
package p4;
public class test {
public static void ff(test_ppop<Object> i)
{
System.out.println(i);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
test_ppop<String> i=new test_ppop<String>();
i.setA("hello");
ff(i);
}
}
如上定义了一个ff方法,因为无法知道泛型是什么类型,所以就用了Object类型。
但是可以发现,编译报错,ff的参数类的泛型是Object类型,而实例中是String类型,两者不匹配
解决方法1(不推荐):方法中的参数不使用泛型(会有警告,不符合规范)
解决方法2(推荐):使用通配符< ?>
8、泛型接口
a、概述:在JDK1.5之后,不仅仅可以声明泛型类,还可以声明泛型接口,声明泛型接口与泛型类差不多,即在接口名后加上
b、格式
interface 接口名<泛型标识>{}
c、Demo
泛型接口pppppp
package p4;
public interface pppppp<T> {
public void play();
}
接口实现类ioio
package p4;
public class ioio<T> implements pppppp<T> {
private T str;
public ioio(T str)
{
this.str=str;
}
public T getStr() {
return str;
}
public void setStr(T str) {
this.str = str;
}
public void play() {
}
}
测试类
package p4;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
ioio<String> obj=new ioio<String>("hello");
System.out.println(obj.getStr());
}
}
9、泛型方法
a、概述:泛型方法中可以定义泛型参数,此时,参数的类型就是传入数据类型
b、格式(第二个泛型标识地方,如果返回是void可直接写void)
权限访问 <泛型标识>泛型标识 方法名(泛型标识 参数名){}
c、Demo
含泛型方法的类Gener
package p4;
public class Gener {
public <T>T play(T t)
{
return t;
}
}
test测试类
package p4;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Gener obj=new Gener();
//可以传递任意类型
//String类型
String str=obj.play("hehehe");
System.out.println(str);
//int类型
int a=obj.play(2);
System.out.println(a);
}
}
10、泛型数组
a、概述:在使用泛型方法的时候,也可以传递或返回一个泛型数组
b、Demo
package p4;
public class test {
public static <T>void play(T arr[])
{
for(int i=0;i<arr.length;i++)
{
System.out.println(arr[i]);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//指定数组是String类型
String arr[]= {"ss","vv","mm"};
play(arr);
//指定数组是int类型(需要设定Integer)
Integer arr2[]= {1,2,3,4,5};
play(arr2);
}
}
三、Set接口及其两个常用实现类(HashSet、TreeSet)
1、概述
Set接口中不能加入重复元素,但可以排序。而List能重复且可排序
api里可以看出Set是定义为泛型的(当然其他集合也是),所以之后多用泛型
2、Set接口常用实现类(HashSet、TreeSet)
- 散列存放:HashSet
- 有序存放:TreeSet
3、HashSet(无序)(原理是内部用了一张哈希表,所以偶然有序也有可能)
package p4;
import java.util.HashSet;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String> s=null;//指定泛型
s=new HashSet<String>();//实例话HashSet
s.add("B");
s.add("A");
s.add("P");
s.add("O");
System.out.println(s);
}
}
4、TreeSet(有序)(自动排列大小)
package p4;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class SetDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Set<String> s=null;//指定泛型
s=new TreeSet<String>();//实例话TreeSet
s.add("B");
s.add("A");
s.add("P");
s.add("O");
System.out.println(s);
}
}
本文深入讲解了Java集合框架中的List接口及其ArrayList实现类的特点与应用,包括泛型的使用、构造方法中的泛型、多个泛型设置等概念,并介绍了Set接口的两个实现类HashSet和TreeSet的使用方法。

被折叠的 条评论
为什么被折叠?



