Javabase-Week28

Week28

API

字符串(String)

  1. 字符串在底层是一个不可更改的——我们调用了字符串的任何方法对字符串所做的更改结果都是产生了一个新的字符串。
  2. 字符串实在内存中存储在方法区的常量池中。
  3. 字符串是一个最终类,任何字符串都是String的对象。
    S1是直接
    S1是直接引用常量区,S2是在堆内存创建对象,然后指向常量池中。

字符串常量池

在Java的内存分配中,总共3种常量池,分别是Class常量池运行时常量池字符串常量池
字符串的分配和其他对象分配一样,是需要消耗高昂的时间和空间的,而且字符串使用的非常多。JVM为了提高性能和减少内存的开销,在实例化字符串的时候进行了一些优化:使用字符串常量池。——每当创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串的不可变性,常量池中一定不存在两个相同的字符串。

可变字符串(StringBuffer和StringBulider)

StringBuffe(StringBulider)代表的是可变字符串,指的是对字符串所做的任何修改都是在原来字符串的基础上做的修改。StringBuffe和StringBulider的方法用法完全一致,唯一差别在于StringBulider是线程不安全的,而StringBuffe是线程安全的。
原理: StringBuffe在内存中创建了一个缓冲区,将字符串放到了缓冲区中,在缓冲区中对字符串做修改。
Demo

public static void main(String[] args) {
    String s1 = "AB";
    String s2 = new String("AB");
    String s3 = "A";
    String s4 = "B";
    String s5 = "A" + "B";
    String s6 = s3 + s4;
    System.out.println(s1 == s2);
    System.out.println(s1 == s5);
    System.out.println(s1 == s6);
    System.out.println(s1 == s6.intern());
    System.out.println(s2 == s2.intern());
}
//输出结果
false
true
false
true
false

解析:
1)直接使用双引号声明出来的String对象会直接存储在常量池中;
2)String对象的intern方法会得到字符串对象在常量池中对应的引用,如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用;
3) 字符串的+操作其本质是创建了StringBuilder对象进行append操作,然后将拼接后的StringBuilder对象用toString方法处理成String对象,这一点可以用javap -c命令获得class文件对应的JVM字节码指令就可以看出来。
在这里插入图片描述

集合

  1. 集合类存放于java.util包中。
  2. 集合类型主要有3种:set(集)、list(列表)和map(映射)。
  3. 集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。

简单来讲:集合就是一个放数据的容器,准确的说是放数据对象引用的容器。

Connection接口

— List 有序,可重复

  • ArrayList
    优点: 底层数据结构是数组,查询快,增删慢。
    缺点: 线程不安全,效率高
  • Vector
    优点: 底层数据结构是数组,查询快,增删慢。
    缺点: 线程安全,效率低
  • LinkedList
    优点: 底层数据结构是链表,查询慢,增删快。
    缺点: 线程不安全,效率高

—Set 无序,唯一

  • HashSet
    底层数据结构是哈希表。(无序,唯一)
    如何来保证元素唯一性?
    1.依赖两个方法:hashCode()和equals()
  • LinkedHashSet
    底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
    1.由链表保证元素有序
    2.由哈希表保证元素唯一
  • TreeSet
    底层数据结构是红黑树。(唯一,有序)
    如何保证元素排序的呢?
    自然排序
    比较器排序
    如何保证元素唯一性的呢?
    根据比较的返回值是否是0来决定

在这里插入图片描述

Map

存储数据时是以键值对的方式来存储的,map的底层不是线性结构。

  • 将键映射到值的对象
  • 一个映射不能包含重复的键
  • 每个键最多只能映射到一个值
  • Map集合的数据结构针对键有效,跟值无关;Collection集合的数据结构是针对元素有效
获取Map中的键值
  • 通过keySet获取Kye值。
        Set<String> keys = map.keySet();
        for (String key : keys) {
           System.out.println(key);
        }
//
  • 通过map.entrySet()方法
for(Entry<String, String> vo : map.entrySet()){
   vo.getKey();
   System.out.println(vo.getKey()+"  "+vo.getValue());
  }

获取Value的方法一致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值