Java中“集合类”与“常用类”相关知识

前言:

这一节我们一起来学习一下Java的一些技术,前面我已经详细的讲解了关于类的知识点,这章我不做多讲,现在进入我们的主题------集合与常用类。

一、集合类

我们先来了解一下什么是集合,这个名词我们只在数学上面听过,而在Java上面他又有什么不一样的意思呢?在Java中,如果一个Java对象可以在内部持有若干其他Java对象,并对外提供访问接口,我们把这种Java对象称为集合。

我们前面所学的数组显然是一个集合,来看一段代码:

String[] ss = new String[10]; // 可以持有10个String对象
ss[0] = "Hello"; // 可以放入String对象
String first = ss[0]; // 可以获取String对象

1.1 List

List是最基础的一种集合类,它是有序链表。那么我们看到这个有序两个字,是不是就想到了数组。其实,List与数组是十分类似的。
List内部的元素也是按照先后顺序进行存放的,每个元素都可以通过索引来找到,List的索引与数组一样,都是从0开始。

1、List的特点

如果我们用数组来增加或删除一个元素时,我们还要考虑前后元素的移动。而使用ArrayList就减少了这一繁琐操作,当我们对元素进行增减时,ArrayList会自动移动需要移动元素。
来看一个例子:

size=5
┌───┬───┬───┬───┬───┬───┐
│ ABCDE │   │
└───┴───┴───┴───┴───┴───┘

在ArrayList里面,有五个元素,但是有六个空位,如果我们想要添加一个元素在B的后面,那么他会出现这种情况:

size=6
┌───┬───┬───┬───┬───┬───┐
│ ABFCDE │
└───┴───┴───┴───┴───┴───┘

在元素B的后面,元素C、D、E会向后移动一个位置,为元素F留下一个位置,并且将size加1即可。
如果这时候我们要继续添加元素的话mArrayList会自动创建一个更大的数组,将旧的数组搬到新的数组里,

size=6
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ ABFCDE │   │   │   │   │   │   │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘

因此,我们用ArrayList更为方便一些,当增减元素时候,我们无需考虑元素的移动问题,只需要将size的值进行相应的变动即可。

2、List的几个方法

(1)在末尾添加一个元素:void add(E e)
(2)在指定索引添加一个元素:void add(int index, E e)
(3)删除指定索引的元素:int remove(int index)
(4)删除某个元素:int remove(Object e)
(5)获取指定索引的元素:E get(int index)
(6)获取链表大小(包含元素的个数):int size()

1.2 Map

1、使用Map

我们虽然可以利用List来查找某一个数据,但是操作太过于繁杂,我们将要对比一半的数据来查找,这种效率太过于低下。因而我们引入Map来解决这种问题,Map这种键值(key-value)映射表的数据结构,作用就是能高效通过key快速查找value(元素)。

代码如下:

public class Main {
    public static void main(String[] args) {
        student s=new student ("xming",98);
        Map <String ,student>map=new HashMap<>();
        map.put("xming",s);
        student target=map.get("xming");
        System.out.println(target==s);
        System.out.println(target.score);
        student another=map.get("BOb");
        System.out.println(another);
    }
}
class student{
    public String name;
    public int score;
    public student (String name,int score){
        this.name=name;
        this.score=score;}
}

通过上述代码可知:Map<K, V>是一种键-值映射表,当我们调用put(K key, V value)方法时,就把key和value做了映射并放入Map。当我们调用V get(K key)时,就可以通过key获取到对应的value。如果key不存在,则返回null。和List类似,Map也是一个接口,最常用的实现类是HashMap。

2、遍历Map

(1)在for循环中使用entries实现Map的遍历

/**
* 最常见也是大多数情况下用的最多的,一般在键值对都需要使用
 */
Map <String,String>map = new HashMap<String,String>();
map.put("熊大", "棕色");
map.put("熊二", "黄色");
for(Map.Entry<String, String> entry : map.entrySet()){
    String mapKey = entry.getKey();
    String mapValue = entry.getValue();
    System.out.println(mapKey+":"+mapValue);
}

(2)在for循环中遍历key或者values,一般适用于只需要map中的key或者value时使用,在性能上比使用entrySet较好;

Map <String,String>map = new HashMap<String,String>();
map.put("熊大", "棕色");
map.put("熊二", "黄色");
//key
for(String key : map.keySet()){
    String value = map.get(key);
    System.out.println(key+":"+value);
}
//value
for(String value : map.values()){
    System.out.println(value);
}

(3)通过Iterator遍历

Iterator<Entry<String, String>> entries = map.entrySet().iterator();
while(entries.hasNext()){
    Entry<String, String> entry = entries.next();
    String key = entry.getKey();
    String value = entry.getValue();
    System.out.println(key+":"+value);
}

1.3 Set

我们知道,Map用于存储key-value的映射,对于充当key的对象,是不能重复的,并且,不但需要正确覆写equals()方法,还要正确覆写hashCode()方法。但是,如果我们只需要存储不重复的key,并不需要存储映射的value,那么这时,就可以使用Set。

Set用于存储不重复的元素集合,它主要提供以下几个方法:

(1)将元素添加进Set:boolean add(E e)
(2)将元素从Set删除:boolean remove(Object e)
(3)判断是否包含元素:boolean contains(Object e)

来看一段代码图:

       ┌───┐
       │Set│
       └───┘
         ▲
    ┌────┴─────┐
    │          │
┌───────┐ ┌─────────┐
│HashSet│ │SortedSet│
└───────┘ └─────────┘
               ▲
               │
          ┌─────────┐
          │ TreeSet │
          └─────────┘

这个图很清楚说明了Set接口特点:
(1)HashSet是无序的,因为它实现了Set接口,并没有实现SortedSet接口;
(2)TreeSet是有序的,因为它实现了SortedSet接口。

二、常用类

2.1 object

我们在前面学了,如果在继承中,没有标明extend,那么它默认为Object类。所以我们可以将Object成为所有类的父类。

class class{                                         
}
 
 class class extends Object{
 }                                                

Object类提供无参构造方法 ,之所以提供这样的无参构造,是因为在子类对象实例化时都会默认调用父类中的无参构造方法,这样在定义类时即使没有明确定义父类为Object,读者也不会感觉代码的强制性要求。

看一个表格:
在这里插入图片描述

2.2 String

字符串类的相关方法有很多。

1、获得字符串长度

确定字符串长度的方法格式如下。
public int length () ;

String s2=new String ("我爱你china") ;

System. out. println (s2.length());

2、截取一个字符

public char charAt (int index)

该方法返回指定索引处的char值。索引范围为从0到length()-1。字符串的第一个char值在索引0处,第二个在索引1处,依此类推。举例如下。

char ch;
ch=“abc”.charAt(1) ;返回’b’

3、字符串相等比较

public boolean equals (String s)

字符串对象调用String 类的equals方法,比较当前字符串对象是否与参数制定的字符串s对象相同。举例如下。

String s1=Hello;

String s2=new String (Hello);

s1.equals(s2); //true

2.3 StringBuffer

下面内容摘自《Java语言设计》,并且经过整理后的知识点,资料最全面,值得收藏起来。

(1)将boolean参数的字符串表示形式追加到序列中。

StringBuffer append(boolean b);

(2)将char参数的字符串表示形式追加到此序列。

StringBuffer append(char c);

(3)将char数组参数的字符串表示形式追加到此序列。

StringBuffer append(char[] str);

(2)将char数组参数的子数组的字符串表示形式追加到此序列。

StringBuffer append(char[] str, int offset, int len);

(4)将指定的内容附加CharSequence到此序列。

StringBuffer append(CharSequence s)

(5)将指定的子CharSequence序列追加到此序列。

StringBuffer append(CharSequence s, int start, int end);

(5)将double 参数的字符串表示形式追加到此序列。

StringBuffer append(double d);

(6)将float 参数的字符串表示形式追加到此序列。

StringBuffer append(float f);

(7)将int 参数的字符串表示形式追加到此序列。

StringBuffer append(int i);

(8)将long 参数的字符串表示形式追加到此序列。

StringBuffer append(long lng)

(9)附加Object参数的字符串表示形式。v

StringBuffer append(Object obj);

(10)将指定的字符串追加到此字符序列。

StringBuffer append(String str);

(11)将指定的内容附加StringBuffer到此序列。

StringBuffer append(StringBuffer sb);

(12)将codePoint参数的字符串表示形式追加到此序列。

StringBuffer appendCodePoint(int codePoint);

(13)返回当前容量。

int capacity();

(14)返回char指定索引处的此序列中的值。

char charAt(int index);

(15)返回指定索引处的字符(Unicode代码点)。

int codePointAt(int index);

(16)返回指定索引之前的字符(Unicode代码点)。

int codePointBefore(int index);

(17)返回此序列的指定文本范围内的Unicode代码点数。

int codePointCount(int beginIndex, int endIndex);

(18)删除此序列的子字符串中的字符。

StringBuffer delete(int start, int end);

(19)char按此顺序删除指定位置。

StringBuffer deleteCharAt(int index);

(20)确保容量至少等于指定的最小值。

void ensureCapacity(int minimumCapacity)

(21)字符从此序列复制到目标字符数组中dst。

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin);

(22)返回指定子字符串第一次出现的字符串中的索引。

int indexOf(String str)

(23)从指定的索引处开始,返回指定子字符串第一次出现的字符串中的索引。

int indexOf(String str, int fromIndex);

(24)将boolea参数的字符串表示形式插入此序列中。

StringBuffer insert(int offset, boolean b);

(25)将char参数的字符串表示形式插入此序列中。

StringBuffer insert(int offset, char c);

(26)将char数组参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, char[] str);

(27)将str数组参数的子数组的字符串表示形式插入到此序列中。
StringBuffer insert(int index, char[] str, int offset, int len)

(28)将指定的内容CharSequence插入此序列中。
StringBuffer insert(int dstOffset, CharSequence s);

(29)将指定的子CharSequence序列插入此序列中。
StringBuffer insert(int dstOffset, CharSequence s, int start, int end)

(30)将double参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, double d)

(31)将float参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, float f)

(32)将第二个int 参数的字符串表示形式插入到此序列中。
StringBuffer insert(int offset, int i)

(33)将long参数的字符串表示形式插入此序列中。
StringBuffer insert(int offset, long l)

(34)将Object 参数的字符串表示形式插入此字符序列。
StringBuffer insert(int offset, Object obj)

(35)将字符串插入此字符序列。
StringBuffer insert(int offset, String str)

(36)返回指定子字符串最后一次出现在字符串中的索引。
int lastIndexOf(String str)

(37)返回指定子字符串最后一次出现在字符串中的索引。
int lastIndexOf(String str, int fromIndex)

(38)返回该字符串的长度(字符数)。
int length()

(39)返回此序列中与代码点给定index的偏移量的索引codePointOffset。
int offsetByCodePoints(int index, int codePointOffset)

(40)用指定的字符替换此序列的子字符串中的字符String。
StringBuffer replace(int start, int end, String str)

(41)返回此字符序列的反向替换。
StringBuffer reverse()

(42)指定索引处的字符设置为ch。
void setCharAt(int index, char ch)

(43)设置字符序列的长度。
void setLength(int newLength)

(44)返回一个新的字符序列,它是该序列的子序列。
CharSequence subSequence(int start, int end)

(45)返回一个新的String,包含此字符序列中当前包含的字符的子序列。
String substring(int start)

(46)返回一个新的String,包含此序列中当前包含的字符的子序列。
String substring(int start, int end)

(47)返回表示此序列中数据的字符串。
String toString()

(48)尝试减少用于字符序列的存储空间。
void trimToSize()

2.4 StringBuilder

说明如下:

StringBuilder()//以默认容量创建空的StringBuilder对象
StringBuilder(int capacity)//以指定容量创建空的StringBuilder对象
StringBuilder(String str)//以指定的字符串创建StringBuilder对象
//获取功能
int capacity()//容量
int length()//添加功能
append(int value)//追加。可以追加多种类型
insert(int offset,String s)//在指定的位置插入指定数据
//删除功能
deleteCharAt(int index)//删除指定索引处的元素
delete(int start,int end)//删除[start,start-1]范围内的元素
替换功能
replace(int start,int end,String s)//将[start,end-1]范围内的元素替换成指定字符串
反转功能
reverse()//元素反转
截取功能
String subString(int start)//截取指定位置一直到末尾
String subString(int start,int end)//截取[start,end-1]范围

2.5 System

System没有构造方法
成员方法:

gc( )//运行垃圾回收处理机制(系统会在某个不确定的时间调用该方法)
会调用finalize( ),进行垃圾回收。
exit(int status)//退出JVM,0表示非异常退出。
currentTimeMills()//获取当前时间毫秒值。
arrayCopy(Object[] srcArr,int srcPos,Object[] desArr,int destPos,int len)//数组复制。

2.6 Data

日期类:

//构造方法
Date( ); //以当前时间毫秒值创建Date对象。
Date(long time)//以指定的毫秒值创建Date对象。
//成员方法
long getTime( )//获取Date对象的毫秒值。
setTime(long time)//设置Data对象的毫秒值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

silence_sz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值