1.一些常用类的列举
1.1常用类之String
一些基本概念:String 类代表字符串;字符串是常量;它们的值在创建之后不能更改(常量的地址值)
String类是一个特殊的引用类型 :
String类型如果作为参数传递,形式参的改变不会影响实际参数(跟基本类型作为参数的效果一样)
1.1.1 关于String类的一些面试题
1.数组中有没有length()方法,String类型有没有length()方法,集合中有没有length()?
数组中:length属性
String类型中有length方法():获取字符串长度
集合中:没有length()方法, 有size()方法;
2.以下s1和s2实际含义
String s1 = "hello" ; //常量赋值
String s2 = new String("hello") ;//堆内存中申请空间
前者:创建的是一个对象
将常量赋值的形式:直接在方法区中的常量池中 先查看是否存在常量"hello",如果存 "hello",
将地址值赋值给它,如果不存在,在常量池中开辟空间!
后者:创建两个对象
new XXX ():堆内存
"hello":常量池中
s1和s2 :都是表示"hello"字符串
1.1.2 String类的构造方法
public String() //无参构造方法:创建一个字符串对象
public String(byte[] bytes) //使用平台的默认编码集 :将字节数组---->构造出String类型
public String(byte[] bytes, int offset, int length)://将字节数组的一部分转换成字符串
/*
参数1:传递的实际字节数组对象
参数2:从哪个位置开始
参数3:指定长度
*/
public String(char[] value)//:将字符数组---构造成一个字符串对象
public String(char[] value,int offset,int count) //:将字符数组一部分转换成字符串
/*
参数1:传递的实际字符数组对象
参数2:从哪个位置开始
参数3:指定长度
*/
public String(String original)//:将一个字符串值存储进来,创建一个字符串对象
1.1.3 String类型的判断功能
public boolean equals(Object anObject) //:比较两个字符串内容是否相同
public boolean equalsIgnoreCase(String anotherString) //:不区分大小写比较
public boolean startsWith(String prefix) //:判断是否以指定的子串开头
public boolean endsWith(String suffix) //:判断是否以指定的子串结尾
public boolean isEmpty() //:判断字符串是否为空
1.1.4 String类的获取功能以及分割功能
//String类的获取功能
int length() //:获取字符串长度
public char charAt(int index) //:获取指定索引处的字符
public String concat(String str) //:字符串拼接功能:使用当前字符串和指定str字符串进行拼接
public int indexOf(int ch) //:获取指定字符在此字符串中第一次出现索引值
public int indexOf(String str) //:获取指定字符串在此字符串中第一次出现索引值
// String类的分割功能
public String[] split(String regex) //:通过指定的字符串进行分割,返回值字符串数组
1.1.5 String类转换功能
public char[] toCharArray() //:将字符串转换成字符数组
public byte[] getBytes() // :将字符串----变成字节数组 (过程:编码)
public static String valueOf(XXX xx) //:可以将任何类型的数据转换成String
/*
举例:
int i = 100 ;---->int --- String
String.valueOf(i) ;---->"100"
*/
public String toUpperCase() //:将此字符串转换成大写
public String toLowerCase() //:将此字符串转换成小写
1.1.6 String类的截取功能以及替换功能
//String类的截取功能
public String substring(int beginIndex) //:从指定位置开始截取,默认截取到末尾
public String substring(int beginIndex,int endIndex)
//从指定位置开始截取,到指定位置结束,但是包含beginIndex,不包含endIndex索引(包前不包后)
//String类的替换功能
public String replace(char oldChar,char newChar) //:将以前的字符用心的字符替换掉
public String replace(String oldStr,char newStr) //:将以前的字符用心的字符替换掉
//去除两端空格
public String trim()
1.2常用类 StringBuffer
线程安全的可变字符序列 ,提供字符串缓冲区
//StringBuffer类的获取功能
int length() //:获取长度(缓冲区中字符数)
public int capacity() //:获取缓冲区的容量大小
//StringBuffer的构造方法:
public StringBuffer()
//空参构造,初始容量为 16 个字符。(默认的容量足够,不需要指定容量大小)
public StringBuffer(String str)
//构造一个缓冲区,指定字符串内容到缓冲区中,容量大小等于16个+当前字符串的实际长度
public StringBuffer(int capacity)
//指定容量大小,构造一个缓冲区
//StringBuffer的添加功能:
public StringBuffer append(任何类型数据...)
//将任何类型的数据追加到缓冲区中(追加末尾)
public StringBuffer insert(int offset,String str/任何类型数据)
//将某个元素插入到指定位置
public StringBuffer delete(int start,int end)
//删除从指定位置到指定位置结束(包前不包后,end-1位置)
//StringBuffer类反转功能
//键盘录入一个数据,将字符串进行反转---(内容还是字符串内容)
public StringBuffer reverse() //:将缓冲区中的字符进行反转!
//StringBuffer的截取功能
public String substring(int start) //:从指定位置开始截取,默认截取到末尾
public String substring(int start, int end) //:从指定位置开始截取,截取到指定位置结束!
// StringBuffer的替换功能
public StringBuffer replace(int start,int end, String str)
//从指定位置开始到指定位置结束(end-1处)使用str子串进行替换
1.2.1 关于StringBuffer的面试题
面试题:
1.StringBuffer和数组的区别?
共同点:他们两者都属于引用类型,而且都是"容器"
区别: StringBuffer: 可变的字符序列 (长度可变的)
里面可以存储任何数据类型----->都是以"字符"进行拼接 通过append追加
有length()方法
数组: 长度固定,只能存储同一种类型的元素!
有length属性
int[] arr = {100,200,300,"hello"} ; //错误的!
2.StringBuffer和StringBuilder的区别?
共同点:两者之间互相兼容的,功能是相同(添加,构造方法,替换,删除,截取..)
区别: StringBuffer:可变的字符序列
线程角度:线程安全的--->同步的---->执行效率低!
StringBuilder:可变的字符序列
线程角度:线程不安全的---->不同步的---->执行效率高
在单线程程序中,StringBuilder去替换StringBuffer,因为效率高!
3.StringBuffer和String类型作为形式参数有什么区别:
共同点:两个都是引用类型
区别:
String类作为形式参数,它的效果基本数据类型一样(String是最特殊的引用类型)
String是一个常量,一旦被赋值,其值不能被改变
StringBuffer/StringBuilder,他们作为形式参数,形式参数的改变会直接影响实际参数(和其他引用类型效果一样)
1.3 常用类 Date类
java.util.Date类
1.3.1 Date类中的方法
//构造方法:
public Date() // 无参构造
//成员方法:
public long getTime() // 返回1970 年 1 月 1 日所表示的时间毫秒
1.3.2 如何将 String 的文本格式和 Date的日期格式相互转化
String文本格式 和Date日期格式相互转换
Date---------------->String 日期文本格式 "格式化"操作
java.text.DateFormat:可以将日期和文本相互转换
DateFormat继承自Format类:都是抽象类,不能直接实例化!,提供更具体的子类
java.text.SimpleDateFormat extends DateFormat
它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)
SimpleDateFormat的构造方法
public SimpleDateFormat(String pattern):
创建一个SimpleDateFormat对象
参数:指定一个模式 要遵循一定的规则(jdk对它规定了)
y年 ------2020 "yyyy"
M年中月份----10/03 "MM"
d月中的天数----05/21 'dd'
h:表示上午/下午的小时数 hh
H:一天中的小时数 HH
m:分钟数 mm
s:秒数 ss
模式
"yyyy-MM-dd HH:mm:ss"
"yyyy年MM月dd日 HH时mm分ss秒"
Date---->String
格式化的步骤:
1)存在Date对象
2)创建SimpleDateFormat(String pattern)
3)public final String format(Date date):格式化方法
解析
String----->Date
解析步骤:
1)存在String "日期文本" "2020-10-21"
2)创建SimpleDateFormat(String pattern)
3)public Date parse(String source) throws ParseException
解析中注意的事项:
SimpleDateFormat中的参数模式:必须和String 日期文本格式一致,否则出现解析异常(ParseException)
1.4 常用类 Calendar类:日历类
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法
注:Calendar不能直接实例化!
如果某一个类如果不能直接实例化:
首先里面会存在一些静态功能,静态功能的返回值就是该类本身!
public static Calendar getInstance()
获取的日历字段的值
public int get(int field)
参数:传递日历字段
Calendar的成员方法:
给日历字段添加或者减去时间偏移量
public abstract void add(int field,int amount)
日历对象.add(Calendar.DATE,-5):当前日历时间的5天前
获取当前时间的方法:
int year = c.get(Calendar.YEAR) ;
int month = c.get(Calendar.MONTH) ;
int date = c.get(Calendar.DATE) ;
System.out.println(year+"-"+(month+1)+"-"+date);
注:获取月份的值是1~11,故在获取月份值的时候要+1才能获取正确的月份值;
设置当前年月日,日历时间
public final void set(int year,int month, int date)
1.5 System 类
System 类包含一些有用的类字段和方法。它不能被实例化。
字段:
public static final InputStream in :标准的"输入流"
public static final PrintStream out :标准的"输出流"
键盘录入:
Scanner(InputStream in) ---->Scanner(System.in)
输出语句:
System.out.println("xxx")----->System.out--->PrintStream ps (字节打印流)
ps.println("x") : 字节打印流调用方法名println(String str)
成员方法:
public static void gc() 运行垃圾回收器(手动开启)
实际开发中,开发者不需要开启
运行垃圾回收器,它会调用Obejct类finalize(),回收没有更多引用的对象
public static void exit(int status):参数状态为0:
System.exit(0); //表示正常终止jvm
public static long currentTimeMillis():获取当前系统时间的毫秒值
从原数组中的指定位置开始进行复制指定length长度复制到目标数组中的某个位置
public static void arraycopy(Object src, int srcPos, Object dest,
int destPos, int length)
参数1:指定源数组
参数2:源数组中的某个位置
参数3:目标数组对象
参数4:目标数组对象中的某个位置
参数5:指定几个元素复制(长度)
1.6 其他一些常用类 Random ,BigDecimal
java.util.Random:随机数生成器
构造方法
public Random() :(推荐),产生的随机数是变化的
public Random(long seed):每次产生的随机数 是固定的!
成员方法:
public int nextInt():获取的是int范围内的随机数
public int nextInt(int n):获取0到n之间的随机数[0,n)
获取随机数两种方式:
Math类的random()方法: 返回值double类型
Random类空参构造+nextInt(int n):获取随机数
java.math.BigDecimal
描述:对浮点类型的数据进行精确计算的!
构造方法:
public BigDecimal(String val) :字符串"数字字符串"
"1.0"
"0.01.."
成员方法:
public BigDecimal add(BigDecimal augend) :求和
public BigDecimal subtract(BigDecimal subtrahend) :减法
public BigDecimal multiply(BigDecimal multiplicand) :乘法
public BigDecimal divide(BigDecimal divisor) :除法
2. 集合
2.1集合概念的面试题
集合和数组的区别?
共同点:集合和数组都是"容器",存储元素!
区别:
1)长度的区别
数组的长度:固定的!
集合的长度:可变的!
2)存储数据类型的区别
数组:可以存储基本数据类型,也可以存储引用数据类型
int[] String[] Student[]
集合:只能存储引用数据类型 --->jdk5以后新特性: 泛型<>
3)存储元素的区别
数组:只能存储同一种类型的元素
举例: 水杯中"纯净水"
集合:可以存储任意类型的元素(类型:引用类型)
举例:
白酒兑雪碧
2.2 集合的介绍以及方法
Collection:某些集合可以存储从重复元素,某些集合不能重复元素!
有些集合有序,有些集合无序(有序/无序:存储元素和取出元素是否一致!)
JDK 不提供此接口的任何直接 实现:
它提供更具体的子接口(如 Set 和 List)实现
java.util
Collection接口(单例集合的根接口)
List接口 Set接口
实现类 实现类
ArrayList LinkedList Vector HashSet TreeSet
单例集合中:
学习Collection集合
基本功能:
添加功能:
boolean add(Object e) :将任何数据类型添加到集合中
删除功能:
void clear():暴力删除
boolean remove(Object o):移出指定的元素
判断功能
boolean contains(Object o):判断是否包含指定的元素
boolean isEmpty():判断集合是否为空,如果为空,则返回 true;
Collection高级功能
boolean addAll(Collection c):添加所有
boolean containsAll(Collection c):包含所有(包含一个算包含还是包含所有?)
//包含所有元素才算包含,返回true
boolean removeAll(Collection c):删除所有 (删除一个还是删除所有算是删除?)
//只要集合中有一个元素被包含,将这个元素从c1删除掉,则返回true!
boolean retainAll(Collection c):一个集合对另一个集合取交集
//A集合对B集合取交集,将交集的元素保存到A集合,boolean表达的是A集合是否发生变化,如果A集合没有变化的,返回结果false;如果A集合有变化,则返回true!
转换功能:
Object[] toArray():将集合转换成对象数组
Iterator iterator():Collection集合的迭代器(集合的遍历方式)
Collection集合的高级功能:
Object[] toArray()
Iterator iterator():Collection集合的专有遍历方式
iterator()的返回值是接口:需要返回的是该接口的子实现类对象!
Iterator:存在一个方法
Object next() //获取下一个元素
boolean hasNext() // 判断当前迭代器中是否有下一个可以遍历元素,如果存在,则返回true;
2.3 泛型的介绍
什么是泛型
格式
<数据类型:引用数据类型>
//定义一个字符串数组
//回想数组的定义格式
String[] strArray = {"hello","world","javaee","go",100} ;
上面格式直接报错,数组在定义时候就已经将类型限定了
集合为了迎合数组的特点,在创建数组的时候,将类型定义了,来保证集合中的元素类型一致的!
泛型的特点:
将集合的类型在创建的时候创建的时候就明确,保证集合操作的安全性!
好处:
1)避免了强制类型转换
2)将运行时期异常提前到了编译时期
3)解决了黄色警告线问题
4)提高了程序的安全性!
泛型定义位置
泛型在集合中使用居多,可以定义类上,可以放在方法上,也可以放在接口上!
没有加入泛型之前,程序存在安全隐患,出现类型不匹配:ClassCastException:属于运行时期异常!
泛型的高级通配符
<?> 当前Object类型/任意Java类型(自定义/jdk提供...)
<? extends E>:向下限定:E类型以及它的子类
<? super E>:向上限定:E类型以及它的父类
注:向上限定和向下限定最起码为这个类的本身;
比如 :Collection<? extends Animal> c5 = new ArrayList<Object>();程序会报错,因为动物类向下限定应该是具体的动物,而Object类是所有类的父类,比动物类范围还大,所以会报错.向上限定也是这个道理;
2.4 List集合
List集合 extends Collection
List为有序的集合,可以允许元素重复!
有序性:存储和取出一致
两种方式:
1)Object[] toArray()
2)Collection集合的Iterator
List集合的特有功能:
添加功能
void add(int index,Object element):在指定位置处添加一个新的元素
删除功能
Object remove(int index):删除角标对应的元素
获取功能
Object get(int index) :获取指定位置处的元素
int size():获取集合的元素数
Object set(int index,Object element):在指定位置处使用当前元素element元素替换
ListIterator<E> listIterator():List集合的专有遍历方式 :列表迭代器
ListIterator<E> listIterator():List集合的专有遍历方式 :列表迭代器
ListIterator:列表迭代器
ListIterator<E> listIterator()这个方法底层实现:是通过ArrayList里面的成员内部类
ListItr extends Itr :实现的
正向遍历
boolean hasNext():判断是否有下一个元素
Object next() :获取下一个元素
逆向遍历
boolean hasPrevious():判断是否有上一个元素
Object previous():获取前一个元素
List集合的遍历方式:
1)Collection集合的方法 Object[] toArray;
2)Collection集合的迭代器Iterator iterator() ;
3)size()+Object get(int index):普通for循环;
4)列表迭代器:ListIteraotr listiterator();
5)增强for循环遍历;
2.5 增强for循环
增强for的格式:
for(数据类型 变量名 : 数组对象/集合对象(使用最多)){
输出变量名即可
}
作用:是替代迭代器使用,简化遍历集合的书写格式!
注意事项:
1)增强for主要用在集合中,数组一般使用的时候普通for
2)前提条件:
要使用增强for循环的话,必须保证该集合不能为null,否则就会出现空指针
NullPointerException
解决方案:
针对该对象非空判断即可!
2.6 Vector集合
Vector集合:
底层数组结构:查询快,增删慢
线程安全的---->同步的---->执行效率低!
public boolean add(Object e):传统添加元素的方法
特有功能:
public void add(int index, E element):插入元素
public Enumeration<Object> elements()
--- 相当于:Iterator iterator()该接口有两个方法
boolean hasMoreElements():
判断是否有下一个元素-----> 相当于:boolean hasNext()
Object nextElement():
获取一个元素 -----> 相当于:next()
public Object elementAt(int index)
通过角标获取指定的元素---->相当于:Object get(int index)
elementAt()+size() :vector的普通for遍历方式
Enumeration和Iterator功能是重复的
2.7 LinkedList集合
LinkedList集合的特点:
底层数据结构是链接列表,查询慢,增删快
线程不安全的---不同的---->执行效率高!
应用场景:
网站中 记录用户浏览过商品足迹 (Web技术:Cookie/Session)
特有功能
添加
public void addFirst(Object e):将该元素添加到列表的开头!
public void addLast(Object e):将该元素添加到列表的末尾!
删除
public Object removeFirst():删除列表第一个
public Object removeLast():删除列表最后一个
获取
public Object getFirst():获取第一个
public Object getLast() :获取第二个
public Object pop():此列表所表示的堆栈处弹出一个元素
public void push(Object e):将元素推入此列表所表示的堆栈的第一个位置