热门话题白皮书HR资料
#面试java基础总结大全#集合框架(上)
2024.07.03

集合框架


1:String类:字符串(重点)

(1)多个字符组成的一个序列,叫字符串。

  生活中很多数据的描述都采用的是字符串的。而且我们还会对其进行操作。

  所以,java就提供了这样的一个类供我们使用。

(2)创建字符串对象


 A:String():无参构造
			**举例:
			  String s = new String();
			  s = "hello";
			  sop(s);
		B:String(byte[] bys):传一个字节数组作为参数 *****
			**举例
			  byte[] bys = {97,98,99,100,101};
			  String s = new String(bys);
			  sop(s);
		C:String(byte[] bys,int index,int length):把字节数组的一部分转换成一个字符串 *****
			**举例
			  byte[] bys = {97,98,99,100,101};
			  String s = new String(bys,1,2);
			  sop(s);
		D:String(char[] chs):传一个字符数组作为参数 *****
			**举例
			  char[] chs = {'a','b','c','d','e'};
			  String s = new String(chs);
			  sop(s);
		E:String(char[] chs,int index,int length):把字符数组的一部分转换成一个字符串 *****
			**举例
			  char[] chs = {'a','b','c','d','e'};
			  String s = new String(chs,1,2);
			  sop(s);	
		F:String(String str):把一个字符串传递过来作为参数
			  char[] chs = {'a','b','c','d','e'};
			  String ss = new String(s);
			  sop(ss);
		G:直接把字符串常量赋值给字符串引用对象(最常用) *****
			**举例
			  String s = "hello";
			  sop(s);

(3)面试题

 A:请问String s = new String("hello");创建了几个对象。    两个。一个"hello"字符串对象,在方法区的常量池;一个s对象,在栈内存。  B:请写出下面的结果  String s1 = new String("abc");  Strign s2 = new String("abc");  String s3 = "abc";  String s4 = "abc";  sop(s1==s2);  //false  sop(s1==s3);  //false  sop(s3==s4);  //true  C:字符串对象一旦被创建就不能被改变。  指的是字符串常量值不改变。

(4)字符串中各种功能的方法

		A:判断
		****	boolean equals(Object anObject):判断两个字符串的内容是否相同,复写了Object的方法
		****	boolean equalsIgnoreCase(String anotherString):判断两个字符串的内容是否相同,
									不区分大小写
		****	boolean contains(String s):判断一个字符串中是否包含另一个字符串
						注意:判断字符串是否包含特殊字符.直接表示为str.contains(".")
			boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束
			boolean startsWith(String suffix):测试此字符串是否以指定的前缀开始
			boolean isEmpty():测试字符串是否为空
		B:获取
		*****	int length():返回此字符串的长度
		*****	char charAt(int index):返回指定索引处的 char值
		*****	int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。 
			int indexOf(int ch, int fromIndex):返回在此字符串中第一次出现指定字符处的索引,
							   从指定的索引开始搜索。 
			int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引。 
			int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次
								出现处的索引,从指定的索引开始。 
		***	int lastIndexOf(int ch):返回指定字符在此字符串中最后一次出现处的索引。 
			int lastIndexOf(int ch, int fromIndex) 
				返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。 
			int lastIndexOf(String str) 
				返回指定子字符串在此字符串中最右边出现处的索引。 
			int lastIndexOf(String str, int fromIndex) 
				返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。 
		*****	String substring(int beginIndex) (注意:该方法substring的String是小写!!!)
				返回一个新的字符串,它是此字符串的一个子字符串。 
			String substring(int beginIndex, int endIndex) (注意该方法的String是小写!!!)
				返回一个新字符串,它是此字符串的一个子字符串,包含头不包含尾。 
		C:转换
		*****	byte[] getBytes():(很常用!)从字符串到字节数组的方法
			void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 
				将字符从此字符串复制到目标字符数组。 
		*****	char[] toCharArray():(很常用!)从字符串到字符数组的方法
		****	static String copyValueOf(char[] data) 
				返回指定数组中表示该字符序列的 String。 
			static String copyValueOf(char[] data, int offset, int count) 
				返回指定数组中表示该字符序列的 String。 
		*****	static String valueOf(数据类型):把该数据类型的数据转换成字符串。
		***	String toLowerCase():把字符串转换成小写
			String toUpperCase():把字符串转换成大写
		***	字符串的连接
			String concat(String str):将指定字符串连接到此字符串的结尾。
		D:替换
			String replace(char oldChar, char newChar):用新字符替换旧字符(替换所有)
			String replace(String target, String replacement):用新的子串换旧串
		E:分割
			String[] split(String regex):根据指定的字符串把一个字符串分割成一个字符串数组
		F:	
			String trim():去除字符串的前后空格
		G:	
			int compareTo(String anotherString) 
				按字典顺序比较两个字符串。 
			int compareToIgnoreCase(String str) 
				按字典顺序比较两个字符串,不考虑大小写。 

(5)练习


1:模拟登录,给三次机会,并提示还有几次.

默认的用户名和密码为admin。 区分大小写。

自己从键盘输入用户名和密码。


2:给定一个字符串统计,统计大写字母,小写字母,数字出现的个数.

***注意:不包括特殊字符


从键盘输入一个不包含特殊字符的字符串(只有26个字母和0-9组成)。


3:给定一个字符串,把它变成首字母大写,其他字母小写的字符串.

从键盘输入一个字符串,全部26个字母组成的。


4:子串在整串中出现的次数。

也就是说:获取一个字符串中,指定的字串在该字符串中出现的次数.

例如:

"nbasdnbafllgnbahjnbakqqqqlnba"  在这个字符串中,多有个nba.


5:对字符串中字符进行自然顺序排序。

"basckd"-->"abcdks"

先留做思考内容:


6:两个字符串的最大相同子串。

两个字符串的最大相同子串。

比如:

"sadabcdfghjkl"

werabcdtyu"



2:StringBuffer

(1)字符串的缓冲区,是一个容器。


(2)它和String的区别


它是缓冲区可变长度的。


(3)构造方法

StringBuffer() 构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。

StringBuffer(int num) 构造一个不带字符,但具有指定初始容量的字符串缓冲区。

StringBuffer(String str) 构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容。



(4)常用方法

A:增加数据

**append :添加各种类型的数据

**insert : 在容器指定位置插入各种类型的数据。

B:删除数据

**deleteCharAt : 删除指定位置的字符

**delete 还可以用于清空StringBuffer的缓冲区

C:替换

**replace

D:获取 

**charAt 

E:长度和容量

**length() 元素的个数

**capacity 元素的理论值

F:获取元素的位置

**indexOf

**lastIndexOf

G:截取

**substring(int start)

**substring(int start,int end)

H:反转

**reverse



(5)字符串和StringBuffer的转换

String-->StringBuffer通过构造:

如:StringBuffer sb = new StringBuffer(String str)

StringBuffer--String通过toString方法 

如:StringBuffer sb = new StringBuffer();

  sb.toString();



3:StringBuilder

和StringBuffer的功能是一样的,但是有区别:

StringBuffer(JDK1.0)是线程安全的。

StringBuilder(JDK1.5)不保证线程安全。

一般来说,我们写的程序都是单线程的,所以,用StringBuilder,效率高。



JDK版本的升级原则:

A:提高效率

B:提高安全性

C:简化书写



4:基本数据类型的对象包装类

(1)为了更方便的操作每个基本数据类型,java对其提供了很多的属性和方法供我们使用。

(2)用途:

**将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能操作该数据。

**常用的操作之一:用于基本数据类型与字符串之间的转换。

A:方便操作

B:用于和字符串进行相互转换

(3)基本数据类型和对象类型的对应

		byte		Byte
		short		Short 
		int		Integer
		long		Long
		float		Float
		double		Double
		boolean		Boolean
		char		Character

(4)构造方法

字段摘要:

			static int MAX_VALUE 值为 2^31-1 的常量,它表示 int 类型能够表示的最大值         
			static int MIN_VALUE  值为 -2^31 的常量,它表示 int 类型能够表示的最小值
			static Class<Integer> TYPE 表示基本类型int的Class 实例
          
		Integer(int value) 构造一个新分配的Integer对象,它表示指定的int值。
		Inreger(String s) 注意:s必须是纯数字的字符串。否则会有异常NumberFormatException
		                        

(5)几个常用的方法

		Integer.toBinaryString();
			以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。
		Integer.toOctalString();
			以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。
		Integer.toHexString();
			以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
		static int Integer.parseInt(String s) 将字符串参数作为有符号的十进制整数进行解析,
			字符串必须是int型范围内的数字字符串
		static int Integer.parseInt(String s,int basic) 
			使用第二个参数指定的基数,将字符串参数解析为有符号的整数.
			字符串必须是int型范围内的数字字符串
		short shortValue() 以short类型返回该Integer的值。          
		int intValue() 以int类型返回该Integer的值。  
		static Integer valueOf(int num) 返回一个表示指定的 int 值的 Integer 实例。
		static Integer valueOf(String s) 返回保存指定的String的值的Integer对象。           
                static Integer valueOf(String s, int radix) 
			返回一个Integer对象,该对象中保存了用第二个参数提供的基数进行
			解析时从指定的String中提取的值。 

(6)类型转换

		int -- Integer
			int num = 20;
			A:Integer i = new Integer(num);
			B:Integer i = Integer.valueOf(num);
		Integer -- int
			Integer i = new Integer(20);
			A:int num = i.intValue();
		
		int -- String
			int num = 20;
			A:String s = String.valueOf(num);
			B:String s = ""+num;
			C:String s = Integer.toString(num);
		String -- int
			String s = "20";
			A:int num = Integer.parseInt(s);
			B:Integer i = new Integer(s);或者Integer i = Integer.valueOf(s);
			  int num = i.intValue();	



6、集合框架:



(1)为什么出现集合类?

面向对象对事物的体现都是以对象的形式,为了方便对多个对象的操作,就对对象进行存储。

集合就是存储对象最常用的一种方式.



(2)数组和集合都是容器,两者有何不同?

**数组长度固定,而集合长度是可变的

**数组值可以存储对象,还可以存储基本数据类型;而集合只能存储对象

**数组存储数据类型是固定的,而集合存储的数据类型不固定



(3)集合类的特点:

集合只能存储对象

集合的长度是可变的

集合可以存储不同类型的对象



(4)集合类框架(重要!!!要分清几种容器间的区别):

**Collection:顶层接口

    |--->List:列表,元素是有序的(元素带角标索引),可以有重复元素,可以有null元素。

           |--->ArrayList(JDK1.2):底层的数据结构是数组数据结构,特点是查询速度快(因为带角标),

  但是增删速度稍慢,因为当元素多时,增删一个元素则所有元素的角标都得改变

  线程不同步。默认长度是10,当超过长度时,按50%延长集合长度。   

   |--->LinkedList(JDK1.2):底层数据结构式链表数据结构(即后面一个元素记录前一个),

   特点:查询速度慢,因为每个元素只知道前面一个元素,但增删速度快

   因为元素再多,增删一个,只要让其前后的元素重新相连即可

   线程是不同步的。

   |--->Vector(JDK1.0):底层数据结构是数组数据结构.特点是查询和增删速度都很慢。

默认长度是10,当超过长度时,按100%延长集合长度。

线程同步。

(Vector功能跟ArrayList功能一模一样,已被ArrayList替代)



  **List使用注意!

|--->ArrayList:

(1)当往ArrayList里面存入元素没什么要求时,即只要求有序就行时;

  

(2)当往ArrayList里面存入元素要求不重复时,比如存入学生对象,当同名同姓时

  视为同一个人,则不往里面存储。则定义学生对象时,需复写equals方法

			   public boolean equals(Object obj)
			   {
				if(!(obj instanceof Student))
					return false;
				Student stu = (Student)obj;
				return this.name.equals(stu.name)&&this.age==stu.age;
			   }

  则往ArrayList集合通过add存入学生对象时,集合底层自己会调用学生类的equals方法,



  判断重复学生则不存入。

注:对于List集合,无论是add、contains、还是remove方法,判断元素是否相同,

    都是通过复写equals方法来判断!



|--->LinkedList



(1)LinkLedist的特有方法:

boolean offerFirst(E e)  在此列表的开头插入指定的元素。

boolean offerLast(E e) 在此列表末尾插入指定的元素。

E peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。

E peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。

E pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。

E pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。

(2)通过LinkLedist的特有方法,可以实现某些数据特殊方式的存取,比如堆栈和队列。



一般情况下,使用哪种List接口下的实现类呢?



如果要求增删快,考虑使用LinkedList

如果要求查询快,考虑使用ArrayList

如果要求线程安全,考虑使用Vector。

    |--->Set:集合,元素是无序的(因为没有索引),元素不可以重复。可以有null元素。

   |--->HashSet(JDK1.2):底层数据结构是哈希表、存取速度快、元素唯一、线程不同步。





本文由牛客网大神猴子派来的逗比创作,为了帮助到更多的人。投稿请联系牛妹,有机会得到kindle大奖!这里,只跟你谈技术


提醒一下报名了网易的童鞋,技术类的笔试22号进行!牛客网为官方唯一指定练习平台,快快来练习吧~牛妹不告诉你有没有原题!点击下方阅读原文练习,电脑端更佳哦!



福利大放送!还在为面试中不知道为自己所犯的错而迷茫么,还在为没有进行过实战而畏惧么,给你准备体验最好的模拟面试,你只需要一台电脑,专业的面试官给你面试,给你反馈,助力你面试成功!


名额有限,时间有限,马上截止啦,而且在面试中都是走到技术总监面才能感受到的整个面试程序,快快报名吧!


参加方法在后台回复“模拟面试”即可


牛客网—程序员必备求职神器


刷真题,练算法,看面经,得内推
www.nowcoder.com
长按二维码,把IT笔试面试题库装进口袋


点击下方阅读原文查看模拟面试活动页!真正来一次上战场的机会!