关于java基础知识的归档整理(十)——集合(Collection、Map)、泛型、System类

第一、 API基本数据类型包装类

场景:通过文本框获取用户输入的数字数据,可是得到的都是字符串。 如果想要对字符串中的数字进行运算,必须要将字符串转成数字。
Java中提供了相应的解决的对象。 基本数据类型对象包装类:java将基本数据类型值封装成了对象。

将基本数据类型封装成对象有什么好处?可以在对象中定义更多的功能方法操作该数据。

java中 提供了相应的解决方案

基本数据类型包装类的特点:
1,用于在基本数据和字符串之间进行转换。
int parseInt(string); byte
parseByte(string); boolean parseBoolean(string); xxx
parseXxx(string);
只有Character没有解析方法。因为它不需要解析
2、JDK1.5以后,有了一个包装类的新特性。目的简化书写,自动装箱,如:
Integer i = 4;//自动装箱。Integer i = Integer.valueOf(4);
i = i + 5;//原理;等号右边:将i对象转成基本数值 i.intValue() + 5;//自动拆箱。加法运算后,再次装箱。
//i = Integer.valueOf(i.intValue()+5);
注意:在jdk1.5自动装箱时,如果数值在byte范围之内,不会新创建对象空间而是使用原来已有的空间。

标题 ### 第二、 集合

当数据多了需要存储,需要容器,当数据的个数不确定,无法使用数组,这时就可以使用java中的另一个容器——集合。

集合和数组的区别:
数组的长度是固定的,存储的是同一类型的对象
集合 的长度不是固定的,存储的都是对象,而且对象的类型可以不一致

什么时候使用集合呢?
当对象多的时候,先进行存储

为什么出现集合类?
面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式

JDK1.0版本中,提供的集合容器很少,到了1.2版,为了更多的需求,出现了集合框架,有了更多的容器,可以完成不同的需求
这些容器怎么区分呢?区分方式:每个容器的数据结构不一样,数据结构就是数据存储的一种方式

细节:
* 1,集合中存储其实都是对象的地址。
* 2,集合中可以存储基本数值吗?不行,但是jdk1.5以后可以这么写,但是存储的还是对象(基本数据类型包装类对象)。
* 3,存储时提升了Object。取出时要使用元素的特有内容,必须向下转型。

不断的向上抽取过程中,出现了体系,形成了集合框架

最顶层:collection接口

list集合
list集合:有序的,带索引的,通过索引就可以精确操作集合中的元素,list集合提供了增、删、改、查的动作

使用List,解决,插入元素的问题。因为add方法追加。
* List接口的特有方法,全都是围绕索引来定义的。
*
* List获取元素的方式有两种:一种是迭代,一种 遍历+get
*
* List接口是支持对元素进行curd增删改查动作的。

增加:add(element);add(index ,element);
删除:remove(element);remove(index);
修改:set (index, element);
查询:get(index);

取元素,无论是什么数据结构,最终共性的取出方式,一个一个取,取之前先判断,有就取一个,没有就结束,这种共性的取出的方式——迭代

迭代器是集合collection中通用的取出方式

//1,创建集合对象。
		Collection coll = new ArrayList();
		coll.add("abc1");
		coll.add("abc2");
		coll.add("abc3");
		coll.add("abc4");
		
		/*//2.获取容器的迭代器对象。通过iterator方法。
		Iterator it = coll.iterator();
		
		//3,使用具体的迭代器对象获取集合中的元素。参阅迭代器的方法
		while(it.hasNext()){
			System.out.println(it.next());
		}*/
		
		for (Iterator it = coll.iterator(); it.hasNext();) {
			System.out.println(it.next());
		}
		

集合框架——ListIterator

获取集合中的元素。
在迭代过程中,使用了集合的方法对元素进行操作。导致迭代器并不知道集合中的变化,容易引发数据的不确定性。
如:如果集合中有元素等于***.那么就插入一个新的元素xxx

	 * 这时 引发了java.util.ConcurrentModificationException
	 *  
	 *  解决:在迭代时,不要使用集合的方法操作元素。
	 *  那么想要在迭代时对元素操作可以使用迭代器的方法操作。
	 *  可是迭代器的方式只有 hasNext() ,next(),remove();
	 *  Iterator有一个子接口ListIterator可以完成该问题的解决。如何获取该子接口对象呢?
	 *  通过List接口中的listIterator()就可以获取,

该列表迭代器只有List接口有。而且这个迭代器可以完成在迭代过程中的增删改查动作。

LinkedList
特有:围绕头和尾来展开定义的
addFirst();
addLast();
getFirst();:获取头部元素
getLast();
removeFirst();获取头部元素,并删除头部元素。
removeLast();

简便记法:
添加和获取:不相同为队列,相同为堆栈
如:添加方法为 addFirst();获取方法为:removeFirst();
例如:
需求: 用LinkedList模拟一个堆栈或者队列数据结构。
创建一个堆栈或者队列数据结构对象,该对象中使用LinkedList来完成的。
```
public class LinkedListTest {

/**
 * @param args
 */
public static void main(String[] args) {
	
	//创建一个队列对象。
	Queue queue = new Queue();
	//往队列中添加元素。
	queue.myAdd("cast1");
	queue.myAdd("cast2");
	queue.myAdd("cast3");
	queue.myAdd("cast4");
	
	while(!queue.isNull()){
		System.out.println(queue.myGet());
	}
}

}
/**

  • 定义一个队列数据结构。Queue
    /
    class Queue{
    //封装了一个链表数据结构。
    private LinkedList link;
    /

    • 队列初始化时,对链表对象初始化。
      */
      Queue(){
      link = new LinkedList();
      }

    /**

    • 队列的添加元素功能。
      */
      public void myAdd(Object obj){
      //内部使用的就是链表的方法。
      link.addFirst(obj);
      }

    /**

    • 队列的获取方法。
      */
      public Object myGet(){
      return link.removeLast();
      }

    /**

    • 判断队列中元素是否空,没有元素就为true。
      */
      public boolean isNull(){
      return link.isEmpty();
      }
      }

第三、 set集合

set集合:
不包含重复元素的集合,不保证顺序,而且方法和collection一致
set集合取出元素的方式只有一种:迭代器

Treeset
可以对set集合中的元素进行排序,使用的是二叉树结构
如何保证元素的唯一性呢?
使用对象比较的方法,看比较结果是否为零,如果是零,视为相同元素,不予存储
TreeSet的add方法内部最终实现:
* 需要将元素转成Comparable类型,为什么?因为这个类型具备排序的能力。
* 这个类型中有一个专门为排序提供了一个compareTo方法。
* 如果要让学生具备比较排序的功能,需要让学生扩展功能,实现Comparable接口。

元素排序比较有两种方式:
1、元素自身具备自然排序,其实就是实现了comparable接口,重写了compareTo方法,如果元素自身不具备自然排序或者自然排序不是所需要的,这时只能用第二种方式
2、比较器排序。其实就是在创建Treeset结合时,在构造函数中指定具体的比较方式,需要定义一个类实现comparator接口,重写compare方法

Hashset:哈希表结构
特点:查询速度快,比数组还要快,元素唯一
如何保证元素的唯一性呢?如:如果出现了哈希冲突怎么办?“ab”“ba”
元素的哈希值hashcode()一致了,需要再次用equals方法再次判断元素的内容是否相同,
如果equals返回true,意味着两个元素相同,不予存储
如果equals返回false,意味着两个元素不相同,存储,继续通过算法算出位置,

小结:再往集合中存储对象时,通常该对象都需要覆盖hashcode,equals,同时实现comparable接口,简历对象的自然排序,通常还有一个方法会重写tostring

第四、 泛型

为了让集合使用更安全,
* 问题:什么类型的元素都可以存储。导致取出时,如果出现强转就会引发运行时 ClassCastException。
* 能不能在创建集合时,就明确容器中的元素的类型,如同数组一样。
* 目的是为了更安全。
* JDK1.5以后,出现了解决方案,使用容器时,必须明确容器中元素的类型。
* 这种机制:称之为 :泛型。
* 体现 <数据类型>,不是很难理解,<>也是括号,往括号里面写东西其实就是在传递参数。
* 泛型:
* 1,安全机制。
* 2,将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
* 3,泛型技术,是给编译器使用的技术。
* 4,避免了强转的麻烦。

/创建集合时,直接在集合上明确要存储的元素的类型。
		List<String> list = new ArrayList<String>();
		
		list.add("abc");
		list.add("zzzz");
//		list.add(6);//只要不是指定的类型对象,编译器检查会 报错。这样将运行时的问题转移到编译时期。

类中操作的对象确定不?不确定,用Object,需要转型,运行容易出异常。
定义时,就将不确定的对象的类型,定义成参数。由使用该类的调用者来传递对象类型。

class Tool<Q>{}//将泛型定义在类上,泛型类。

当方法要操作的类型不确定是否和类上的泛型一致时,这时可以将泛型定义在方法上
该方法称之为泛型方法

注意:如果方法是静态的,还需要使用泛型,那么泛型必须定义在方法上

通配符
当使用泛型类或者接口是,传递的具体的类型不确定,可以通过通配符<?>表示
如果想要对被打印的集合中的元素类型进行限制,只在指定的一些类型进行打印,使用泛型限定

总结:
? super E;接收E类型或其父类型。下限
? super E;接收E类型或者其子类型。上限

collections工具类

collections:集合框架中用于操作集合对象的工具类,都是静态的工具方法
1、获取collection最值
2、对排序逆序
3、可以将非同步的集合转成同步集合
4、对List集合排序,也可以二分查找

Arrays:用于操作数组的工具类
1,对数组排序。
2,二分查找。
3,数组复制。
4,对两个数组进行元素的比较,判断两个数组是否相同。
5,将数组转成字符串。

将arr转成list集合。?如果数组中存储的是基本数据类型,那么转成集合,数组对象会作为集合中的元素存在。
数组中元素时引用数据类型时,转成集合,数组元素会作为集合元素存在。
将数组转成list集合。asList
数组转成集合:就为了使用集合的方法操作数组中的元素。
但是不要使用增删等改变长度的方法。add remove 发生UnsupportedOperationException

  • 为什么集合转成数组呢?
  • 为了限制对元素的增删操作。
  • 如果传递的数组的长度小于集合的长度,会创建一个同类型的数组长度为集合的长度。
  • 如果传递的数组的长度大于了集合的长度,就会使用这个数组,没有存储元素的位置为null。
  • 长度最好直接定义为和集合长度一致。

第五、 集合框架MAP

引子:
解决中英对应的问题,可以通过两个List完成

一个list中通过中文获取对应的角标,再用角标到另一个英文List中获取对应的英文
前提:必须保证中英文对应的角标一致
但是这种方式太麻烦,希望能将两个有对应关系的元素,一次都存储进去,这样便于操作

map集合

Map与Collection在集合框架中属并列存在
Map存储的是键值对
Map存储元素使用put方法,Collection使用add方法
Map集合没有直接取出元素的方法,而是先转成Set集合,在通过迭代获取元素
Map集合中键要保证唯一性

Hashtable:线程安全,速度慢,不允许存放null键,null值,已被HashMap替代。
HashMap:线程不安全,速度快,允许存放null键,null值。
TreeMap:对键进行排序,排序原理与TreeSet相同。

set entryset();将map集合中映射关系存储到set集合中
映射关系:键与值得对应关系。比喻:夫妻间的结婚证
映射关系是什么类型?
Map.Entry

什么时候使用Map集合呢?
分析问题是出现对应关系,就应该毫不犹豫的想到Map集合,如果对应关系中出现了有序的数字,想到数组,注意:如果对应关系的个数不确定,还是以Map为主

总结:map集合中没有迭代器,取出元素的方式:将map集合转成单列集合,再使用单列集合的迭代器就可以了,map集合也不能直接被foreach循环遍历!

第六、 System类

System:
* 1,不需要实例化,都是静态的属性和方法。
* 2,out对应标准输出流(显示器),int属性对应的是键盘。
* 演示一些System类中的方法。
* currentTimeMilles:获取当前时间。可以用于计算程序运行时间只要将开始时间和结束时间相减即可。

//获取系统中的行分隔符。这样该程序在移植时,很方便。不同的系统,获取该系统上行分隔符
		System.out.println("hello"+LINE_SEPARATOR+"itcast");

—————————————————————————————
本篇主要记录了用到的API文档,
集合查阅的小技巧:
子类对象的后缀名是所属体系,前缀名是数据结构名称

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值