2023/11/13 本周总结

目录

一 类包

String类:

StringBuffer类:

StringBuilder类:

math类:

包装类:

BigDecimal类:

Date日期类: 

二 集合

        List集合:

                ArrayList: 

        linkedList : 

        Vector:

Set集合:

        HashSet:


一 类包
String类:

        不可变字符串.

        不适合频繁修改的字符串,因为它会不断创建新的对象,占用内存。但是因为它底层是数组,所以查询方便。

StringBuffer类:

        线程安全。

        可变字符串。

        它是默认构造一个容量为16个字符的缓冲区,所以它在同一个StringBuffer中进行字符串的修改并不会创建一个新的对象,而是同一个对象指向缓冲区,只对缓冲区的内容进行修改,所以它是可变的。因此适合那些需要频繁修改的字符串。

StringBuilder类:

        线程不安全(方法没有线程锁修饰)。

        剩下和StringBuffer一样。

math类:

        包含基本算数运算方法

        final修饰,不能被继承。

        static修饰的静态方法,可以直接类名调用

        Math.round(x)  //对x进行四舍五入运算

包装类:

        *类型转换:

        int value ;

        1.int-->Integer: Integer val = new Integer(value) ; 

        2.Integer-->String: String str = val.toString();

        2.int-->String: String str = value.toString();

BigDecimal类:

        解决小数点误差问题. 

Date日期类: 

二 集合
        List集合:

        变量:保存单个数据。

        数组:保存多个数据(基本类型+对象类型)

                优点:   便于查询。

                缺点:由于数组的长度不可变,无法往数组去动态添加或者删除数据。

        集合:   保存多个对象数据。

                List集合:有序集合,允许有重复元素。

                ArrayList: 

                 动态数组(即长度可变的数组)。它的底层是一个数组,但数组长度不是不可变的吗?

                它一开始创建一个数组,当初始数组满了之后,它会创建一个新的长度更长的数组(一般是初始数组长度的倍数),后把初始数组的值全部复制过去,再让对象指向新的数组,这样就有空间新增元素了。删除也是同理,后面数据往前移,当数据个数是初始数据的倍数时,会重新创建一个新的小数组。

                优点:  查找简单

                缺点:新增和删除效率低

        构造方法:

                无参构造:创建一个初始长度默认为10的数组;

                有参构造:创建一个指定初始长度的数组;

        方法:

                
public class Main{
    public static void main(String[] args){
        List<String> list = new ArrayList<>();  //new一个List类型的集合变量list;
        //1:往集合里添加元素:
        list.add("java");
        list.add("java");
        list.add("黄嘉乐");
        list.add("符雅珊");
        System.out.println(list+"\n"+"=================================");
        
        //2:在某个索引位置插入某元素:
        list.add(2,"王浩");//在索引为2的位置,添加一个元素“王浩”
        System.out.println(list+"\n"+"=================================");
        
        //3:根据索引删除元素:
        list.remove(2);   //将索引为2的元素删除;
        //list.remove("王浩");---->当然,这样子写也是可以的,结果都一样
        System.out.println(list+"\n"+"=================================");
        
        //4:根据索引获取元素:
        String s = list.get(3);
        System.out.println(s+"\n"+"=================================");
        
        //5:修改索引位置处的元素:
        list.set(1,"python");
        System.out.println(list+"\n"+"=================================");

        //6:清除元素

        list.clear();

        //7.判断集合是否包含指定元素

        list.contains("王浩") ; 

        //8.返回某个元素第一次/最后一次 出现的位置

        list.indexOf("王浩") ;

        list.lastIndexOf("王浩");
        
        //输出结果:
/**
[java, java, 黄嘉乐, 符雅珊]
=================================
[java, java, 王浩, 黄嘉乐, 符雅珊]
=================================
[java, java, 黄嘉乐, 符雅珊]
=================================
符雅珊
=================================
[java, python, 黄嘉乐, 符雅珊]
=================================
*/

      //=====================================================
      
      //另外遍历方式也都可以用上一次讲的collection集合的通用遍历方式来遍历,只不过List可以用索引来遍历
    }
}

        linkedList : 

                底层结构时双链表结构。

                优缺点: 添加和删除效率高,查询效率低.

        Vector:

                相当于线程安全的ArrayList集合.

Set集合:

        无序而且不可重复

        Set集合汇总:

        

/**
 * Set系列集合特点:
 * 无序:存取顺序不一致
 * 不重复:可以去除重复
 * 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素
 * ====================================================
 * Set集合实现类特点:
 * HashSet:无序,不重复,无索引
 * LinkedHashSet:有序,不重复,无索引
 * TreeSet:排序,不重复,无索引
 * ====================================================
 * Set集合是Collection集合的另一个分支
 */

import java.util.List;  
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Set;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class Main{
    public static void main(String[] args){
     
     //Set集合的特点:HashSet,LinkedHashSet,TreeSet;
     Set<String> sets = new HashSet<>(); //用多态的思想实现HashSet(因为他们都同属于Set的一个分支)
     
     //添加元素
     sets.add("java");
     sets.add("java");
     sets.add("MySQL");
     sets.add("MySQL");
     sets.add("spring");
     sets.add("spring");
     System.out.println(sets);  //集合都是打印内容,数组才是打印地址
     /**
      * 打印内容如下:
      * [spring, java, MySQL]
      * 由此可见,HashSet是无序,不重复,无索引的(不过它的无序只是第一次打印是无序的,以后打印的顺序都是和上面一样的)
      * 
      * ==========================================================
      * 
      * 因为使用了多态的思想,所以我想要测其它的集合类,只需要将上面的HashSet进行替换即可,所以这里就不重新写了,直接输出打印结果
      * 
      * ==========================================================
      * LinkedHashSet类:[java, MySQL, spring]
      * 由上可知,LinkedHashSet类是有序,不重复,无索引
      * 
      * ======================================================
      * TreeSet类:[MySQL, java, spring]
      * 由上可知,TreeSet是有序(这里是按照单词首字母的顺序进行排序的),不重复,无索引
      */ 
      
      
      //========================HashSet的底层原理是哈希表=========================================
      
      
    }
}

        HashSet:

                底层哈希表

                jdk1.8之前:数组+链表

                jdk1.8之后:数组+链表+红黑二叉树

import java.util.List;  
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Set;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.TreeSet;
public class Main{
    public static void main(String[] args){
     
      //========================HashSet的底层原理是哈希表=========================================
      
      
      /**
       * 哈希值是根据对象的地址返回一个int型的值
       * 哈希值可以用Object类中的hashCode获取;
       */
       
       //获取对象的哈希值
       String name = "黄嘉乐";
       System.out.println(name.hashCode());
       name = "hjl";
       System.out.println(name.hashCode()); //同一个对象,内容改变,哈希值也会改变
      
      //===================HashSet无序底层原理(结合哈希表)=================
      
     /**
      * 首先,底层会给你一个长度为16的数组,然后使用哈希算法求出每个元素应该放进哪个位置;
      * 
      * 具体算法就是:它会用你存入的元素的哈希值来除以16然后取余,这样就一定会的到一个1~15的数,得到哪个数就把你这个元素
      *     存入对应的数组索引的位置上(这就是为什么HashSet集合无序的原因,因为这个余数是随机的),
      *     那么有一种情况就是,当两个元素获得的索引相同时,它首先会判断你存入的元素是否相同,
      *     如果相同就不存入,(这就是为什么HashSet集合无重复的原因),如果不相同的话就把原先存在这个位置的元素
      *     往下移(相当于给它新盖了一个房子),然后把新的这个元素存入这个位置,并且通过链表,新的元素将旧的元素
      *     给它连接起来(这就是哈希表为什么用于增删改查性能很好的原因)
      * 
      * 这里我们就会想一个问题,如果很多个元素同连接在同一个位置上,那么哈希表是不是很像二叉树结构,那么它也就照样
      *     存在一个分支过长的缺点,所以JDK1.8后,就增加了红黑树,如果分支达到8就用红黑树进行平衡(这里的红黑树
      *     是根据每个元素的哈希值大小来进行左右排序的),将分支改成红黑树后,查询性能再次提高。
      * 
      */
      
    }
}

              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值