第四周学习总结

目录

一.java中的常用类

1.Object

2.String

3.StringBuffer/StringBuilder

4.Integer

5.Charactor

6.Date

7.SimpleDateFormat

8.Random

9.Arrays

二.泛型

三.集合

补充内容

一.java中的常用类

1.Object

  • Object类简介

Object类是java中所有类的根类,也就是说所有的类都或直接或间接继承了它,它的方法可以被任何一个类调用

  • boolean equals()

用于判断两个对象是否相同
默认比较的是对象的地址值,实际生产中比较地址值没有意义,建议所有子类重写成比较属性是否相同
重写equals方法时,应该同时重写hashCode方法

  • int hashCode()

返回对象的哈希码值,可以看做地址值

为什么在重写equals()时,应该重写hashCode()

哈希码值可以看做对象在堆内存中的地址,也就应该是对象的唯一识别码.

哈希码值相同,应被认为是同一对象;
反之亦然,如果两个对象内容相同,在被看做是同一个对象时,其哈希码值也应该相同.

所以,重写equals方法时,就应该也重写hashCode方法,根据对象的属性重新计算哈希码值,才能使相同对象(属性相同)的哈希码值也相同;
同时,重写hashCode方法也可以在对比对象,寻找相同对象时帮助缩小对比范围.

可以先对比两个对象的哈希码值是否相同,相同对象应该拥有相同的哈希码值,所以哈希码值不相同时,必然是不同对象;哈希码值相同时,因为中文的特殊性,两个对象仍然可能不相同,此时再使用equals方法逐一比较属性,判断是否为相同对象,可以减少工作量

  • String toString()

返回包含对象信息的字符串
默认信息是对象所属类的全限定名称+@+对象的十六进制表示的哈希码值
以上信息对实际生产没有意义,所以建议所有子类重写成返回包含对象各属性的字符串

  • final Class getClass()

返回当前对象的类对象
类似于String name,String是数据类型,name是变量名
任何一个类都可以作为Class这个数据类型的一个实例

 Class cla = 对象名.getCalss();
 System.out.println(cla);
 //输出结果为:
 //Class 该对象所属类的全限定名称
 //可以使用cla.getName()方法单独获取到该类的全限定名称

2.String

  • String类简介

String类型是java中默认使用的字符串类型,其底层本质是一个字符数组.
一般使用常量赋值的方式创建String类的实例,而不用new,避免浪费堆内存
String类是不可变字符串,对其的拼接(concat/"+")/大小写转换返回的都是一个新的字符串(新的地址值)
所以String是用于存储常量的(地址值和存储内容绑定)

  • String(char[] value)

String类的构造方法,将字符数组转换为字符串

  • String(byte[] bytes)

String类的构造方法,将字节数组转换为字符串

  • String(StringBuffer buffer)/String(StringBuilder builder)

String类的构造方法,将StringBuffer/StringBuilder类型的字符串转换为String类型

  • char charAt(int index)

返回指定索引处的值

  • int compareTo(String anotherString)

按字典顺序比较两个字符串
返回的是两个字符串第一个不一样的字符的ASCAII码值之差;如果没有不同字符,返回两个字符串长度之差
"之差"一定是调用方法的字符串减做参数的字符串

  • int compareToIgnoreCase(String str)

同上,忽略大小写

  • String concat(String str)

将指定的字符串连接到该字符串的末尾

  • boolean equals(Object anObject)

将字符串与对象比较,一般是与另一个字符串比较.
String类已经重写了这个方法,比较的是字符串的内容,而非地址值

  • boolean equalsIgnoreCase(Object anObject)

同上,忽略大小写

  • byte[] getBytes()

将字符串按默认字符集转为字节数组,idea已设置为utf-8

  • int hashCode()

返回哈希码值,重写后的方法

  • int indexOf(int ch)/indexOf(int ch,int fromIndex)

返回字符在字符串中第一次出现的索引值,默认从头查起.如果有fromIndex参数,则从指定索引值开始
也可以查询子字符串第一次出现的索引,将int ch换成String str即可.
如果没有查询到,返回-1

  • int lastIndexOf(int ch)/lastIndexOf(int ch,int fromIndex)

查询最后出现的索引,其余同上

  • boolean isEmpty()

判断字符串长度是否为0.
注意区分String str = null(没有地址,指向为空,不能调用方法) 和String str = ""(有地址,长度为0,可以调用方法)

  • int length()

返回字符串长度

  • String[] split(String regex, int limit)

将字符串按照regex分割成字符数组.
limit是最大限制,如果limit>0,最多将字符串分割为limit-1个;如果limit=0,进行最大分割,舍弃末尾空字符串;如果limit<0,进行最大分割,保留末尾空字符串.
也可以不带limit,默认为0

  • String substring(int beginIndex, int endIndex)

截取字符串,从beginIndex开始,到endIndex结束(不包含);
如果没有endIndex,默认截取到原字符串末尾

  • String toLower/UpperCase()

将字符串转为全部小写/大写

  • char[] toCharArray()

将字符串转为字符数组

  • String trim()

去除前导和尾随空格

  • static StringvalueOf(任意数据类型)

将任意数据类型转为字符串,包括引用类型(默认调用toString)

3.StringBuffer/StringBuilder

  • StringBuffer/StringBuilder简介

StringBuffer:字符串缓冲区,用于存储字符串,但是是可变的,某些方法返回的是原字符串的地址
StringBuffer是线程安全的,所以执行效率较低
StringBuilder完全同StringBuffer,但是不是线程同步的,不安全,但是执行效率高

  • StringBuffer(String str)

StringBuffer的构造方法,将字符串转为StringBuffer实例

  • StringBuffer append(任意数据类型)

将任意数据类型的数据作为字符串拼接到原字符串末尾;如果是引用类型,默认调用toString方法
返回自身(原地址值)

  • StringBuffer reverse()

反转(逆序)字符串,返回原地址

  • String toString()

重写方法,转为普通字符串类型

  • int charAt()
  • int indexOf(String str, int fromIndex)
  • int lastIndexOf(String str, int fromIndex)
  • int length()
  • String substring(int start, int end)

以上方法同String

4.Integer

  • Integer简介

int 类型的包装类型.
类似于String,可以直接使用常量赋值来创建实例,也可以通过new来创建,一般建议使用常量赋值
可以自动拆装箱,实现int类型和Integer类型自动转换.
常量赋值和自动装箱调用的是valueOf方法,当数值在-128~127之间时,会直接返回缓存区中预先创建好的Integer对象,而不是返回新对象,因此,这个范围内同一个整数的地址是相同的,超出这个范围或者通过new创建的实例,即使数值相同,地址也不同.

  • boolean equals(Object obj)

重写后的方法,会比较两个Integer对象的数值而不是地址

  • int intValue()

Integer转为int

  • static int parseInt(String s)

将字符串解析为整数,可能出现NumberFormatException数字格式化异常

  • static String toString(int i)

将整数转为String类型

5.Charactor

  • Charactor简介

Charactor是char的包装类型

  • static boolean isUpperCase(char ch)/isLowerCase/isDigit

判断字符是否大写/小写/数字字符

  • 其他基本类型的包装类型与Integer和Charactor基本相同

6.Date

  • Date()

Date类的无参构造方法,用于创建一个代表当前时间的实例

  • Date(long date)

Date类的构造方法,用于创建一个代表距1970年1月1日00:00:00date毫秒时间的实例

  • long getTime()

返回当前实例代表的时间距离1970年1月1日00:00:00的毫秒值

  • String toString()

以"星期 月份 月日期 二十四小时制:分钟:秒 CST 年"的格式返回当前实例代表的时间

7.SimpleDateFormat

  • SimpleDateFormat(String pattern)

SimpleDateRormat的构造方法,用于规定解析字符串/输出时间时的格式

  • String format(Date date)

用于将date代表的时间按照构造时规定的格式转为字符串

  • Date parse(String source)

用于解析按照构造时规定的格式书写的字符串所代表的时间,将其创建为Date类的实例

8.Random

  • Random(long seed)

Random类的构造方法,如果不带参数,则该实例产生的随机数完全随机;如果带参数,则该实例产生的随机数是用种子计算产生的,相同的种子产生的随机数相同

  • int nextInt(int bound)

用于产生[0,bound)之间均匀分布的随机整数.如果不带参数bound,则取值范围为整个int类型

9.Arrays

  • static void sort(任意数据类型数组)

排序

  • static String toString(任意数据类型数组)

将数组内容以标准化格式输出

[元素1, 元素2, 元素3, ...]

二.泛型

  • 泛型是在需要存储的数据类型还不清楚时,先对集合做出规定,规定其可以存储哪些类型的数据
  • 在具体使用集合时,可以进一步将其具体化,规定该集合只能存储该类型的数据
  • 用"<>"表示,括号内写上希望存储的数据类型

三.集合

  • 数组在创建之后,其长度固定,使用不方便;集合作为数组的代替,支持长度可变,操作灵活
  • 数组中既可以存储基本数据类型,也可以存储引用类型;集合只能存储引用类型
  • 一个数组中只能存储一种确定的类型数据;集合中可以同时存储不同类型的数据

集合分为单例集合和双例集合

  • 单例集合的根接口为Collection,它有两个子接口:List(列表)和Set(集)

List接口下的集合可以存储重复数据,并且是有序的,遍历顺序和存储顺序一致.
List常用的实现类有ArrayList,LinkedList,Vector

  • ArrayList类

其底层结构为数组,所以又称为数组列表
继承了数组的优缺点,查询快,增删慢
不同步,数据不安全
五种遍历方法:
1)toArray()转为数组,再遍历
2)调用iterator()方法获取迭代器,使用迭代器中的hasNext()方法和next()方法结合while循环遍历
3)size()方法和get()方法结合for循环遍历
4)调用listIterator()方法获取列表迭代器,其余同方法2
5)增强for循环

常用方法:

//继承并重写自Cellection
boolean add(E e)//将指定元素添加到集合末尾
clear()//清空集合中所有元素
boolean contains(Object o)//判断集合中是否包含该元素
boolean isEmpty()//判断集合中是否有元素
Iterator<E> iterator()//返回该集合的迭代器
int size()//返回该集合中元素的个数
Object[] toArray()//将集合转为数组

//继承并重写自List
E get(int index)//返回索引值处的元素
int indexOf(Object o)//返回该元素第一次出现的索引值,若不包含该元素,返回-1
ListIterator<E> listIterator()//返回该集合的列表迭代器
E remove(int index)//返回并删除索引值处的元素,之后的元素前移
  • LinkedList类

其底层结构为链表
继承了链表的优缺点,增删快,查询慢
不同步,数据不安全
遍历同ArrayList

常用方法:

void addFirst(E e)//添加到链表的开头
void addLast(E e)//添加到链表的末尾
E getFirst()//获取链表的第一个元素
E getLast()//获取链表的末尾的元素
E removeFirst()//删除链表第一个元素
E removeLast()//删除链表的最后一个元素
void push(E e)//推送到链表开头(压栈)---等价于public void addFirst(E e):添加到链表的开头
E pop()//弹出最后一个元素(弹栈) 等于removeFirst() :将第一个元素删除并返回

//其余方法同ArrayList
  • Vector类(向量)

Vector的底层结构也是数组,所以也是查询快,增删慢
但是它是线程安全的,所以执行效率低
遍历方法除了ArrayList的五种外,多了两种
6)调用elements()方法,获取枚举组件,类似于iterator,同样结合hasMoreElements(),nextElements()方法和while循环使用
7)调用elementAt(int index)方法获取指定索引处的元素,类似于get()方法,同样结合size()方法和for循环

常用方法:

addElement(E e)//向向量末尾添加元素,类似于add()
Enumeration<E> elements()//返回枚举组件,用于枚举,遍历集合
E elementAt(int index)//通过角标获取元素,类似于get()方法

Set接口下的集合不能存储重复元素,并且是无序的,存储顺序和遍历顺序不相同
Set接口常用的实现类有HashSet和TreeSet

  • HashSet类

HashSet底层依靠HashMap<K,V>实现
它可以保证存储的数据唯一不重复,依靠Object类的equals和hashCode()来实现,所以对于自定义类,必须重写这两个方法,HashSet才可以识别出重复元素

补充内容

  • 选择排序

核心思想:每一趟遍历选出剩余未比较元素中的最小值,利用元素交换,将其置于未比较元素的最左侧
遍历趟数为数组长度减一

核心代码:

    //第一种实现方式
    int min = arr[0]; //假设第一个是最小值
    //获取最小值的索引值
    int index = 0;
    //选择排序
    for (int i = 0; i < arr.length - 1; i++){  //遍历趟数
        //寻找最小值
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < min){
                min = arr[j];
                index = j;
            }
        }
        if (min != arr[i]) {  //如果相等.说明当前值为最小值,不用交换
            //交换最小值和当前标记
            int temp = arr[i];
            arr[i] = min;
            arr[index] = temp;
        }
        //初始化最小值为下一个索引
        min = arr[i + 1];
    }
    
//第二种实现方式
//选择排序
for (int i = 0; i < arr.length - 1; i++){  //遍历趟数
    //寻找最小值,保证其永远在未排序元素最左侧
    for (int j = i + 1; j < arr.length; j++) {
        if (arr[j] < arr[i]){
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值