疯狂java笔记4:集合类(2)

Map

Map用于保存具有映射关系的数据

key和value对应,单向的一对一关系

key在一起组成了一个Set集合(key不可以重复,Map.keySet()返回这个集合)

大部分和Set集合是一样的

Properties类是Hashtable类的子类。其对象用于处理属性文件(windows下是ini文件)

WeakHashMap实现类,只保持key对实际对象的弱引用

IdentityHashMap实现类,与普通实现类不同之处是key相等是要key1=key2;(同一对象),而不是普通HashMap的equals(值相等)

操作集合的工具类Collections

可以对集合对象进行排序、查询、修改,还可以把集合对象设置为不可变、对集合对象实现同步控制等方法(都是static类方法)

泛型

增加泛型支持在很大程度上是为了让集合记住其元素的数据类型

泛型的使用

public class G

{

publicstatic void  main(string[] args){

//创建一个只想保存字符串的List集合

List<String>strList=new ArrayList<String>();

//其实上面的语句可以简化为List<String>strList=new ArrayList<>();棱形语法

strList.add("泛型测试");

strList.add(5); //编译错误

}

}

泛型可以定义的还有类、接口和方法(除了上面的做集合类实例化的参数)

public interface List<E>   //E只是一个类型形参

{

//在该接口里,E可以作为类型来使用

voidadd(E x);

Iterator<E>iterator();

...

}

定义一个接口的时候指定一个类型形参,E

public interface Iterator<E>

{

Enext();

booleanhasNext();

...

}

//定义该接口时指定了两个类型参数,其形参名为K,V

public interface Map<K,V>

{

//在该接口内K,V完全可以作为类型使用

Set<K>keySet();

Vput(K key,V value);

...

}

我们可以为任何类、接口增加泛型声明(并不是只有集合类才可以用)

eg:

public class Apple<T>

{

//使用T类型参数定义实例参数

privateT info;

publicApple(){};

//T类型来做参数的构造器

publicApple(T info){

this.info=info;

}

publicvoid setInfo(T info){

this.info=omfo;

}

publicT getInfo(){

returnthis.info;

}

publicstatic void  main (String[] args){

//使用

Apple<String>a1=new Apple<>("苹果");

System.out.println(a1.getInfo());

//因为传给T参数的类型不对

Apple<String>a2=new Apple<>(31415926);

System.out.println(a2.getInfo());

}

}

泛型类派生子类最好要为泛型参数定型

public class A extends Apple<String>;              //如果不进行的话可能会报警

要注意:在静态方法、静态初始化块或静态变量的声明和初始化中不允许使用类型形参(类型形参是一个代指,不是一种真的类型,非静态的可以)

类型通配符

假如说要定义一个方法,该方法里有一个集合参数,集合形参的元素类型是不确定的

eg:

public void test(List c)

{

for(inti=0;i<c.size;i++)

{System.out.println(c.get(i));}

}

//上面的List是一个有泛型声明的接口,没有传入实际类型接口,会泛型警告

你不能这样

public void test(List<Object> c){...}

如果你使用

List<String> strList=newArrayList<>();

test(strList);    //会报错,List<String>对象不可以被List<Object>对象使用,没协变性

所以要使用类型通配符(解决了)

public void test(List<?> c){...}  //通配符可以设置上限如:...(List<?extends Shape> c)...

下限...(List<? super Type> c)...

带下限的通配符的语法可以方便在创建TreeSet对象时灵活地选择合适的Comparator(方便把所有的Comparator作为参数传入)

//类型参数其实也可以设置上限...(List<Textends Shape & java.io.Serializable> c)...        //&后面的是实现的接口

也可以使用泛型方法(上下限也可以用同通配符)

static <T> voidfromArrayToCollection(T[] a,Collection<T> c)          //其中的这个<T>是一个泛型方法的声明而不是返回值

{...}

与类、接口中使用泛型参数不同的是,方法(泛型方法)中的泛型参数无需显式传入实际的类型参数

泛型方法和类型通配符(如果这个参数只用一次,用类型通配符比较好)

时间: 2024-10-04 12:08:54

疯狂java笔记4:集合类(2)的相关文章

Java笔记十.集合类(一)

集合类(一) 所谓集合类,即为Java中的一种高级数据结构.在Java编程中,常用的集合类和接口有:Vector.Emumeration.ArrayList.Collection.Iterator.Set.List等. 一.Vector类与Emumeration接口 1.概述: (1)Vector类:是Java语言提供的一种高级数据结构,可用于保存一系列对象,Vector适用于多线程使用可同步,安全系数较高.因此,Java不支持动态数组,Vector类提供了一种与"动态数组"相近的功能

Java笔记十一.集合类(二)

集合类(二) 一.数组类与容器类 数组和其它容器的区别主要有三方面:效率,类型和保存基本类型的能力. 1.数组:是一种效率很高的存储和随机访问对象引用序列的方式.数组是一 个简单的线性序列,因此访问速度很快,但也损失了其它一些特性.创建一个数组对象后,大小就固定了,如果空间不够,通常是再创建一个数组,然后把旧数组中的所有引用移到新数组中.数组可可以保存基本类型,容器不行. 2.容器类:不以具体的类型来处理对象,而是将所有的对象都以Object类型来处理,所以我们可以只创建一个容器,任意的Java

疯狂java笔记(五) - 系统交互、System、Runtime、Date类

一.程序与用户交互(Java的入口方法-main方法): 运行Java程序时,都必须提供一个main方法入口:public static void main(String[] args){} public:因为main方法里边可能包含同一包内或其他类的方法,为了保证能够正常执行该方法所以只能用该方法; static:调用主方法的时候不会先创建该主类的对象,而是直接通过该类来调用主方法的,所以使用static修饰; String[]:谁调用方法谁就为这个形参赋值,默认长度为0的数组 运行时:jav

疯狂java笔记-枚举类

1 //手动实现枚举类 2 //步骤 3 1.通过private将构造器隐藏起来 4 2.把这个类的所有可能的实例都使用public static final修饰的类变量来保存 5 3.如果有必要,可以提供一些静态方法,允许其他程序根据特定的参数来获取与之匹配的实例 6 public class Season{ 7 //把Season类定义成不可变的,将其Field也定义成final 8 private final String name; 9 private final String desc

疯狂java学习笔记之面向对象(八) - static和final

一.static: 1.static是一个标识符: - 有static修饰的成员表明该成员是属于类的; - 没有static修饰的成员表明该成员是属于实例/对象的. 2.static修饰的成员(Field.方法.初始化块),与类共存亡:static修饰的成员建议总是通过类名来访问,虽然它也可以通过实例来访问(实质也是通过类来访问的),所以平时若在其他程序中见到通过实例/对象来访问static成员时,可以直接将实例/对象 替换成类名: 3.程序都是先有类再有对象的,有可能出现有类但没有实例/对象的

学在前面——《疯狂JAVA讲义》学习笔记

一直放弃JAVA,觉得身为前端掌握html.css.js就可以胜任工作了,但是最近组里后台太忙了,有时候感觉只要在后台改一点东西就能满足前台所需要的数据了,但是自己却不会改,后台还木有空,于是觉得,嗯,身为一个IT的新新人才,当然也要回基本的JAVA了,不要求会写,但是基本的会改还是必要的~~ 于是看了各种JAVA从入门到精通的帖子,选中了<疯狂JAVA讲义>这本书,尽管书有点老了,但是感觉很全面,讲的很好,希望能够有所收获~俗话说,带着问题去学习,发现尽管很久以前了解过JAVA,但是前言里面

4.5-全栈Java笔记:垃圾回收机制

垃圾回收机制(Garbage  Collection) Java引入了垃圾回收机制,令C++程序员最头疼的内存管理问题迎刃而解.JAVA程序员可以将更多的精力放到业务逻辑上而不是内存管理工作上,大大的提高了开发效率. 垃圾回收原理和算法 1)内存管理 Java的内存管理很大程度指的就是对象的管理,其中包括对象空间的分配和释放. 对象空间的分配:使用new关键字创建对象即可 对象空间的释放:将对象赋值null即可.垃圾回收器将负责回收所有"不可达"对象的内存空间. 2)垃圾回收过程 任何

java笔记整理

Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, Ejb, java和模式 Linux/Unix笔记 inode :存储编号(地址) ls -k:查看磁盘分区 ls -li:显示当前文件的inode号. 目录的大小跟文件的大小有关,跟目录里的文件(目录)数量无关. 一行多个命令的话,中间用分号分开.如:pwd;cal;date last | grep

9.6-全栈Java笔记:二叉树和红黑二叉树

二叉树的定义 二叉树是树形结构的一个重要类型. 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要. 二叉树(BinaryTree)由一个结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成.下图中展现了五种不同基本形态的二叉树. (a) 为空树 (b) 为仅有一个结点的二叉树 (c) 是仅有左子树而右子树为空的二叉树 (d) 是仅有右子树而左子树为空的二叉树 (e) 是左.右子树均非