排序算法是最常用的一种算法,在面试中也会经常被问到,今天以升序为例总结一下集中常用的排序算法,以及复杂度和稳定性。
关于稳定性:稳定性指的是一组数据中如果存在相等的数据,Ai=Aj,排序前Ai在Aj的前面,那么排序后Ai仍然在Aj的前面,那么这种排序算法就是稳定的,反正则是不稳定的。
常见的排序算法有:
- 冒泡排序
- 选择排序
- 插入排序
- 快速排序
- 堆排序
希尔排序
to be a learner
排序算法是最常用的一种算法,在面试中也会经常被问到,今天以升序为例总结一下集中常用的排序算法,以及复杂度和稳定性。
关于稳定性:稳定性指的是一组数据中如果存在相等的数据,Ai=Aj,排序前Ai在Aj的前面,那么排序后Ai仍然在Aj的前面,那么这种排序算法就是稳定的,反正则是不稳定的。
常见的排序算法有:
希尔排序
在线考试 本次考试成绩:55 答题剩余时间0小时43分9秒
考生须知
1.本次周考结束后,剩余补考次数:2次
2.周考时间为60分钟,超时系统自动交卷
3.本次考试满分100分(5*20道),60分通过考试
1.
(单选题)三个进程共享四个同类资源,这些资源的分配与释放只能一次一个。已知每一个进程最多需要两个该类资源,则该系统( )。
A.有些进程可能永远得不到该类资源
B.必然有死锁
C.进程请求该类资源立刻能得到
D.无
在正常的类的使用中,一般是先确定类,然后使用new关键字产生实例化对象然后使用。如果想通过对象取得类的信息,那么可以使用Object类中的getClass()方法。
反射机制的初步操作如下:
1 | package Test1; |
运行结果:1
class java.util.Date
Class类对象实例化的三种方式
实例化Class对象后,就可以利用Class类来进行类的反射控制,Class类的常用方法如下:
通过newStance()方法,可以实例化Class类包装的类型,不使用关键字new也可以进行对象的实例化操作。
注:使用newStance()方法进行实例化,类中一定要有无参构造方法,否则会出错
利用反射实例化对象1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20package Test1;
class Book{
public Book() {
System.out.println("这是无参构造");
}
@Override
public String toString() {
return "hello";
}
}
public class testDemo19 {
public static void main(String args[]) throws Exception{
Class<?> cls=Class.forName("Test1.Book");
@SuppressWarnings("deprecation")
Object obj=cls.newInstance();
Book book=(Book) obj;
System.out.println(book);
}
}
本程序通过实例化Class类,然后利用newStance()方法进行类包装的对象的实例化,实例化的对象是Object类,需要向下转型强制变为子类。
使用newStance()方法实例化对象,必须要求类里面存在无参构造方法,如果类中没有无参构造方法的话,就必须通过java.lang.reflect.Constructor类来实现对象的反射实例化操作。
java.lang.Class取得构造方法的操作如下:
Java.lang.reflect.Constructor类常用的操作方法如下:
明确调用勒种有参构造1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24package Test2;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
class Book{
private String title;
private int price;
public Book(String title,int price) {
this.title=title;
this.price=price;
}
@Override
public String toString() {
return "名字:"+this.title+",价格:"+this.price;
}
}
public class testDemo1 {
public static void main(String args[]) throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
Class<?> cls=Class.forName("Test2.Book");
Constructor<?> con=cls.getConstructor(String.class,int.class);
Object obj=con.newInstance("中国上下五千年",199);
System.out.println(obj);
}
}
常用“对象.方法()”调用方法,利用反射机制也可以实现类方法的操作
Class类取得方法的操作:
Method常用方法如下:
使用反射类操作java类属性1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26package Test2;
import java.lang.reflect.Method;
class Book2{
private String title;
public void setTitle(String title) {
this.title=title;
}
public String getTitle() {
return title;
}
}
public class testDemo2 {
@SuppressWarnings("deprecation")
public static void main(String args[]) throws Exception{
String fieldName="title";
Class<?> cls=Class.forName("Test2.Book2");
Object obj=cls.newInstance();
Method setMet=cls.getMethod("set"+initcap(fieldName), String.class);
Method getMet=cls.getMethod("get"+initcap(fieldName));
setMet.invoke(obj, "Java开发");
System.out.println(getMet.invoke(obj));
}
public static String initcap(String str) {
return str.substring(0,1).toUpperCase()+str.substring(1);
}
}
除了构造方法,普通方法,反射类也可以进行成员的操作,Class类中成员的取得方法如下:
Field类常用描述成员信息的方法如下:
利用反射类操作私有成员:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17package Test2;
import java.lang.reflect.Field;
class Book3{
private String title;
}
public class testDem03 {
public static void main(String args[]) throws Exception{
Class<?> cls=Class.forName("Test2.Book3");
@SuppressWarnings("deprecation")
Object obj=cls.newInstance();
Field titField=cls.getDeclaredField("title");
titField.setAccessible(true);
titField.set(obj, "Java开发");
System.out.println(titField.get(obj));
}
}
定义1
public interface Collection<E> extends Iterator<E>
核心方法
进程:程序的一次动态执行的过程,从代码加载到执行完毕的一整个过程。
线程:线程是比进程更小的一个单位,线程是在进程的基础上进一步进行划分,一个进程可以分为多个线程,这些线程同时存在同时运行。
多进程:多进程的操作系统可以同时运行多个程序,由于CPU具备分时机制,每个进程都可以循环获得自己的CPU时间,使进程看起来像同时进行一样。
所有的IO操作都在java.io包中进行定义,一共包含5个类和一个接口:
所有的正则表达式的类都定义在java.util.regex包里面。此包中主要定义了两个主要的类: