1、接口的特点
(1)接口不能被实例化
(2)接口在JDK1.8之前,只能包含公共的抽象方法,JDK1.8之后,还可以包含静态方法和默认方法
(3)接口中只能有全局的静态的常量
(4)接口中不能有构造器、代码块等
(5)接口用来被实现的,实现类中必须实现接口的所有的抽象方法,否则该实现类也得是抽象类
(6)一个类可以同时实现多个接口,Java支持多实现
(7)一个类如果既要继承父类又要实现接口,先继承后实现
(8)接口与接口之间可以是继承关系,而且支持接口的多继承
(9)接口与实现类的对象之间构成多态引用
4、抽象类与接口的区别
(1)抽象类声明的关键字是abstract class,接口声明的关键字是interface
(2)抽象类中可以包含构造器、代码块等其他成员,而接口中只能有公共的抽象方法,默认方法和静态方法
(3)抽象类受到单继承的限制,而接口支持多实现,不受单继承的限制
抽象类与接口相同点:都不能实例化
5、JDK1.8接口的新特性
静态方法和默认方法
注解相当于一个标记 经常和反射使用在一起
String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:
String str = "abc";
等效于:
char data[] = {'a', 'b', 'c'};
String str = new String(data);
字符串String类的特点
1、String是个final类
2、String是不可变的字符序列
private意味着外面无法直接获取字符数组、final意味着字符数组的引用不可改变。
但是因为String也没有提供修改value数组某元素值的途径,因此字符串的字符数组内容也不可变了。
String对象的创建
String s1 = new String(); // 本质上 this.value = new char[0];
String s2 = new String(String original); //this.value = original.value;
String s3 = new String(char[] a); //this.value = Arrays.copyOf(value, value.length);
String s4 = new String(char[] a,int startIndex,int count)
String的拼接
1、常用方法系列之一
-
length()返回字符串的长度: return value.length;
-
isEmpty() 判断是否是空字符串:return value.length == 0;
-
toLowerCase()使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
-
toUpperCase()使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
-
trim()返回字符串的副本,忽略前导空白和尾部空白。
-
equalsIgnoreCase(String anotherString)与equals方法,忽略大小写
-
equals(Object obj)比较字符串的内容
2、和字符相关
charAt(int index): 返回某索引处的字符return value[index];
char[] toCharArray():将此字符串转换为一个新的字符数组
3.String类判断是否以指定内容开头或结尾
5、String类替换操作
6、String类字符串截取操作
7、String类字符串拆分操作
8、String类字符串查找操作
日期
进行数组的排序
①在类的定义的时候重写compareTo()方法
@Override
public int compareTo(Object o) {
Goods other = (Goods) o;
if(this.price > other.price){
return 1;
}else if(this.price < other.price){
return -1;
}
return 0;
}
②定义Comparator方法
Arrays.sort(all , new Comparator() {
@Override
public int compare(Object o1, Object o2) {
Goods g1 = (Goods) o1;
Goods g2 = (Goods) o2;
return Collator.getInstance(Locale.CHINA).compare(g1.getName(),g2.getName());
}
});
-
Collection接口:定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式
-
Set:中的数据对象没有顺序且不可以重复
-
List:中的数据对象有顺序且可以重复
-
-
Map接口定义了存储“键(key)-值(value)映射对”的方法
Collection接口
Collection 层次结构 中的根接口。
常用方法:
1、添加
(1)add(Object obj)
(2)addAll(Collection coll)
2、获取有效元素的个数
int size()
3、清空集合
void clear();
4、是否包含某个元素
(1)boolean contains(Object obj):是通过元素的equals方法来判断是否是同一个对象
coll.add("柴林燕");
coll.contains("柴林燕") true
本质上是拿集合中的元素与”柴林燕”比较,如果存在就会出现"柴林燕".equals("柴林燕")所以返回true,因为String类对equals进行了重写,表示比较的字符串的内容
coll.add(new Student("柴林燕"))
coll.contains(new Student("柴林燕")) false
本质上调用new Student("柴林燕").equals(new Student("柴林燕"))
用的是Student类中equals,而这个没有重写equals,用的是父类Object的equals,默认比较的是地址值和“==”等价,所以返回false
(2)boolean containsAll(Collection c)也是调用元素的equals方法来比较的。拿两个集合的元素挨个比较。
5、是否空集合
boolean isEmpty()
6、删除
(1) boolean remove(Object obj) 通过元素的equals方法判断是否是要删除的那个元素
只会删除找到的第一个元素
只是把元素从集合删除,内存中还是存在的。
(2)boolean removeAll(Collection coll)
7、取两个集合的交集
boolean retainAll(Collection c)
把交集的结果存在当前集合中,不影响c
8、转成对象数组
Object[] toArray()
iterator迭代
Iterator iter = coll.iterator();//多态引用
while(iter.hasNext()){
Object obj = iter.next();
System.out.println(obj);
}
Iterator iter = coll.iterator();//回到起点
while(iter.hasNext()){
Object obj = iter.next();
if(obj.equals("李四")){
iter.remove();
}
}
注意:Iterator可以删除集合的元素,但是是遍历过程中通过迭代器对象的remove方法,不是集合对象的remove方法
List接口
-
List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
-
List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。
-
JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。
List接口的方法
List的实现类
-
List除了从Collection集合继承的方法外,List 集合里添加了一些根据索引来操作集合元素的方法
-
void add(int index, Object ele)
-
boolean addAll(int index, Collection eles)
-
Object get(int index)
-
int indexOf(Object obj)
-
int lastIndexOf(Object obj)
-
Object remove(int index)
-
Object set(int index, Object ele)
-
List subList(int fromIndex, int toIndex)
-
-
ArrayList:底层实现是数组,线程不安全,效率高,所以,查询块,修改、插入、删除慢
-
LinkedList:底层实现是链表,线程不安全,效率高。所以,查询慢,修改、插入、删除快
-
Vector:底层实现是数组,线程安全,效率低。但是即使为保证 List 集合线程安全,也不推荐使用Vector。
ArrayList与Vector的区别?
-
底层都是数组,默认初始容量都是10.
-
ArrayList扩容增加原来的50%,Vector扩容增加原来的1倍。
-
ArrayList线程不安全,效率高,Vector线程安全,效率低。
Vector因为版本古老,支持Enumeration 迭代器。但是该迭代器不支持快速失败。
LinkedList的特点
LinkedList:双向链表,除了保存数据,还定义了两个变量:
prev变量记录前一个元素的位置
next变量记录下一个元素的位置
对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。新增方法:
-
void addFirst(Object obj)
-
void addLast(Object obj)
-
Object getFirst()
-
Object getLast()
-
Object removeFirst()
-
Object removeLast()
Set接口
HashSet
-
HashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。
-
HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能。
-
HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等。
-
当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值,通过某种散列函数决定该对象在 HashSet 中的存储位置。(这个散列函数会与底层数组的长度相计算得到在数组中的下标,并且这种散列函数计算还尽可能保证能均匀存储元素,越是散列分布,该散列函数设计的越好)
-
如果两个元素的hashCode()值相等,会再继续调用equals方法,如果equals方法结果为true,添加失败,如果为false,那么会保存该元素,但是该数组的位置已经有元素了,那么会通过链表的方式继续链接。
-
-
HashSet 具有以下特点:
-
不能保证元素的排列顺序
-
HashSet 不是线程安全的
-
集合元素可以有一个是 null
-