文章目录
前言:
这一节我们一起来学习一下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
┌───┬───┬───┬───┬───┬───┐
│ A │ B │ C │ D │ E │ │
└───┴───┴───┴───┴───┴───┘
在ArrayList里面,有五个元素,但是有六个空位,如果我们想要添加一个元素在B的后面,那么他会出现这种情况:
size=6
┌───┬───┬───┬───┬───┬───┐
│ A │ B │ F │ C │ D │ E │
└───┴───┴───┴───┴───┴───┘
在元素B的后面,元素C、D、E会向后移动一个位置,为元素F留下一个位置,并且将size加1即可。
如果这时候我们要继续添加元素的话mArrayList会自动创建一个更大的数组,将旧的数组搬到新的数组里,
size=6
┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
│ A │ B │ F │ C │ D │ E │ │ │ │ │ │ │
└───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┘
因此,我们用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对象的毫秒值。