Java包装类库

包装类

一、BigDecimal类和BigInteger类

1.BigDecimal

提供比float和double更高精度的运算,减小运算过程中的误差

2.BigInteger

若希望表示比long类型范围还大的数据,则需要使用java.math.BigInteger类型来描述。

3.运算

两个类中都包含有各自定义好的加减乘除以及求余的方法。

二、String类

1.概念

  • String类由final关键字修饰,不可被继承。
  • 从java9开始类的底层不使用char[](数组)来存储数据,而是改成byte[]加上编码标记。节约了空间。*
  • 字符串内容不可更改。

2.常量池的概念

由于字符串内容不可更改,因此java虚拟机会将首次出现的字符串放入常量池,在后续代码中如果出现了相同字符串,则直接使用已有字符串对象,而无需再申请内存和创建对象,提高了性能。

集合类库

1.集合的由来

  • 变量用于记录单个类型的数据内容
  • 一维数组用于记录多个类型相同的数据内容
  • 对象可以包含多个不同类型的数据内容
  • 对象数组包括了多个类型相同的对象类型
  • 集合则用来表示记录多个不同类型的对象数据

2.集合的框架结构

  • 集合框架的顶层是 java.util.Collection集合和util包的Map集合
  • Collection存储的元素特点是单个,而Map集合是以键值对形式存储单个元素

3.Collection接口

(一)实现子类或接口

Collection接口是List接口、Set接口以及Queue接口的父接口。

(1)常用方法

Collection c=new ArrayList();//不指定具体类型,存储元素类型默认为Object
Collection utilCo=new ArrayList();
//迭代器
Iterator it=c.iterator();
//使用方式
while(it.hasNext){
     
	//下一元素
	System.out.println(it.next());
}
//添加
c.add(123);
c.add("kaka");
c.add('S');
utilCo.add("kaka");
utilCo.add("test");
utilCo.add(222);
//删除
c.remove(123);//删除单个元素
c.removeAll(c); //删除参数中的集合的所有元素
//是否包含指定元素或集合
c.contains("kaka"); //单个元素
c.containsAll(utilCo);
//求和参数集合的交集
c.retainAll(utilCo);
//清空集合
c.clear();
//其他
c.size();//求集合包含元素个数
c.isEmpty();//判空
c.equals(utilCo);
c.hashCode();
//集合转换为数组 return Object[]
c.toArray();

Iterator接口

Collection接口实现了Iterator接口,Iterator可以遍历Collection集合中的元素。
常用方法

  • hasNext()
  • next()
  • remove()

4.List集合

(一)特点

  • 允许元素重复,元素按照先后顺序存放
  • List集合的实现类:ArrayList(动态数组、自动扩容)、LinkedList(双向链表)、Stack、Vector。
  • ArrayList支持下标访问,增删元素不方便
  • LinkedList访问便捷,增删方便,与ArrayList性能不同
  • Stack——栈的实现类
  • Vector 同样采用动态数组管理,是比ArrayList线程安全的类,效率低于ArrayList

(二)常用方法

List l1=new ArrayList();
List l2=new ArrayList();
//向指定索引处添加元素
l1.add(0,"kaka");
l1.add(1,20);
l2.add(0,"test");
l2.add(1,11);
//将参数指定集合中的所有元素添加至指定索引
l1.addAll(2,l2);
//获取元素
l1.get(2);
//查找指定元素的索引
l1.indexOf("kaka");//正向
l1.indexOf("kaka");//反向
//修改指定位置元素
l1.set(0,"卡卡");
//删除指定位置元素
l1.remove(1);
//返回子集合
l1.subList(0,3); //与字符串类中的subString类似

5.Queue集合(队列)

(一)常用方法

Queue q=new LinkedList();
for(int i=1;i<10;i++){
     
	q.offer(i*8+20);//添加元素
}
System.out.println("queue="+q);
//删除元素
q.poll();
System.out.println("删除队首元素后:"+q);
//返回队首元素
System.out.println(q.peek());

6.Set集合

(一)基本概念

  • 无先后顺序,且不允许元素重复
  • 主要实现类:HashSet、TreeSet、LinkedHashSet
  • HashSet基于哈希表,TreeSet基于红黑树、LinkedHashSet相较于HashSet多了一个用于记录元素迭代顺序的双向链表

7.Map集合

(一)基本概念

  • 以键值对形式存储,key值不可重复
  • 主要实现类 HashMap、TreeMap、LinkedHashMap、Hashtable、Properties类
  • Hashtable是比HashMap线程安全的类,但不允许Key和Values为null
  • Properties是Hashtable的子类,该对象用于处理属性文件,Key-Value 都是String类型
  • Map是面向查询优化的数据结构,在大数据量的情况下有着优良的查询性能
  • 适用于用key检索Value的业务场景

(二)常用方法

Map<String,Integer> map=new HashMap<>();
//添加元素
map.put("张三",18);
map.put("李四",20);
map.put("王卡卡",22);
//获取元素
System.out.println(map.get(18));
//是否包含指定的key
boolean flag=map.containsKey("王卡卡");
flag=map.containsValue(22);
//根据key值删除元素
map.remove("李四");
//返回键的Set视图
Set<String> set=map.keySet();
//返回值的Collection视图
Collection<Integer> c=map.values();
//返回 键值对形式的Set视图
Set<Map.Entry<String,Integer>> entries=map.entrySet();
//使用foreach遍历
for(Map.Entry<String,Integer> m:entries){
     
	System.out.println(m);
}

(三)相关常量

  • DEFAULT_INITIAL_CAPACITY : HashMap的默认容量是16。
  • DEFAULT_LOAD_FACTOR:HashMap的默认加载因子是0.75。
  • threshold:扩容的临界值,该数值为:容量*填充因子,也就是12。
  • TREEIFY_THRESHOLD:若Bucket中链表长度大于该默认值则转化为红黑树存储,该数值是8。
  • MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量,该数值是64。

三、Collections类(工具类)

1.常用方法

// 1.准备一个集合并初始化
        List<Integer> lt1 = Arrays.asList(10, 30, 20, 50, 45);
        // 2.实现集合中元素的各种操作
        System.out.println("集合中的最大值是:" + Collections.max(lt1)); // 50
        System.out.println("集合中的最小值是:" + Collections.min(lt1)); // 10

        // 实现集合中元素的反转
        Collections.reverse(lt1);
        System.out.println("lt1 = " + lt1); // [45, 50, 20, 30, 10]
        // 实现两个元素的交换
        Collections.swap(lt1, 0, 4);
        System.out.println("交换后:lt1 = " + lt1); // [10, 50, 20, 30, 45]
        // 实现元素的排序
        Collections.sort(lt1);
        System.out.println("排序后:lt1 = " + lt1); // [10, 20, 30, 45, 50]
        // 随机置换
        Collections.shuffle(lt1);
        System.out.println("随机置换后:lt1 = " + lt1); // [30, 10, 45, 20, 50] 随机
        // 实现集合间元素的拷贝
        //List lt2 = new ArrayList<>(20);
        List<Integer> lt2 = Arrays.asList(new Integer[10]);
        System.out.println("lt1的大小是:" + lt1.size());
        System.out.println("lt2的大小是:" + lt2.size());
        // 表示将lt1中的元素拷贝到lt2中
        Collections.copy(lt2, lt1);
        System.out.println("lt2 = " + lt2);

四、泛型

只在编译器有效,运行时不区分具体类型。

通配符的使用

有时候我们希望传入的类型在一个指定的范围内,此时就可以使用泛型通配符了。
如:之前传入的类型要求为Integer类型,但是后来业务需要Integer的父类Number类也可以传
入。
泛型中有三种通配符形式:

  • 无限制通配符:表示我们可以传入任意类型的参数。
  • 表示类型的上界是E,只能是E或者是E的子类。
  • 表示类型的下界是E,只能是E或者是E的父类。

你可能感兴趣的:(Java知识点梳理)