赞
踩
前提:数组有序,每次折半查找
代码:
int[] arr=new int[]{1,3,5,6,9,12,23,25,46,67};
int goal=25;
int head=0;
int end=arr.length-1;
boolean flag=true;
while(head<=end){
int midden=(head+end)/2;
if(goal==arr[midden]){
System.out.println("找到指定元素了");
flag=false;
break;
}else if(goal>arr[midden]){
head=midden+1;
}else{
end=midden-1;
}
}
if(flag){
System.out.println("没有找到");
}
public class BubbleSortTest {
public static void main(String[] args) {
int [] arr=new int [] {43,231,56,8,98,-42};
// 只需元素个数-1轮排序
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-1-i;j++) {
if(arr[j]>arr[j+1]) {
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
}
}
public class QuickSort {
public static void swap(int [] data,int i,int j) {
int temp=data[i];
data[i]=data[j];
data[j]=temp;
}
public static void subSort(int[] data,int start,int end) {
if(start<end) {
int base=data[start];
int low=start;
int high=end+1;
while(true) {
//或者low<end
while(low<=high&&data[++low]<=base)
;
//或者high>start
while(high>=low&&data[--high]>=base)
;
if(low<high) {
swap(data,low,high);
}
else {
break;
}
}
swap(data,start,high);
subSort(data,start,high-1);
subSort(data,high+1,end);
}
}
public static void quickSort(int [] data) {
subSort(data,0,data.length-1);
}
public static void main(String[] args) {
int []data=new int [] {43,231,56,8,98,1,463,26,-78,45,3723,-42};
System.out.println("排序前:"+java.util.Arrays.toString(data));
quickSort(data);
System.out.println("排序后:"+java.util.Arrays.toString(data));
}
}
排序方法 | 时间复杂度(平均) | 时间复杂度(最坏) | (时间复杂度(最好) | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
堆排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(1) | 不稳定 |
冒泡排序 | O(n2) | O(n2) | O(n) | O(1) | 稳定 |
快速排序 | O(nlog2n) | O(n2) | O(nlog2n) | O(nlog2n) | 不稳定 |
归并排序 | O(nlog2n) | O(nlog2n) | O(nlog2n) | O(n) | 稳定 |
Arrays.equals(int[]a,int[]b) :判断两个数组是否相等,返回boolean
Arrays.toString(int []a) : 输出数组信息 返回String
Arrays.fill(int []1,int val) : 将指定值填充到数组之中 无返回
Arrays.sort(int[] a) : 对数组进行排序 无返回
Arrays.binarySearch(int[]a ,int key) : 对有序的数组进行二分法检索指定的值
1、Java类及类的成员:属性、方法、构造器;代码块、内部类;
2、面向对象的三大特征:封装性、继承性、多态性、(抽象性);
3、其他关键字:this、super、static、final、abstract、interface、package、import;
二者都是一种思想,面向对象是相对于面向过程而言的。面向过程,强调的 是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对 象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如 抽象、分类、继承、聚合、多态等。
封装 (Encapsulation)
继承 (Inheritance)
多态 (Polymorphism)
面向对象:Object Oriented Programming
面向过程:Procedure Oriented Programming
语法格式:修饰符 数据类型 属性名 = 初始化值 ;
说明1: 修饰符
常用的权限修饰符有:private、缺省、protected、public
其他修饰符:static、final (暂不考虑)
说明2:数据类型
任何基本数据类型(如int、Boolean) 或 任何引用数据类型。
说明3:属性名
属于标识符,符合命名规则和规范即可。
变量的分类:成员变量与局部变量
在方法体外,类体内声明的变量称为成员变量。
在方法体内部声明的变量称为局部变量。
注意:二者在初始化值方面的异同:
同:都有生命周期
异:局部变量除形参外,均需显式初始化。
成员变量 | 局部变量 | |
---|---|---|
声明的位置 | 直接声明在类中 | 方法形参或内部、代码块内、构造器内等 |
修饰符 | private、public、static、final等 | 不能用权限修饰符修饰,可以用final修饰 |
初始化值 | 有默认初始化值 | 没有默认初始化值,必须显式赋值,方可使用 |
内存加载位置 | 堆空间 或 静态域内 | 栈空间 |
什么是方法(method、函数):
方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。
将功能封装为方法的目的是,可以实现代码重用,简化代码
Java里的方法不能独立存在,所有的方法必须定义在类里。
比如Math类的sqrt()、random();Scanner类的nextXxx();Arrays类的sort()、binarySearch()、toString()、equals()。
方法的声明格式:
修饰符 返回值类型 方法名(参数类型 形参1, 参数类型 形参2, ….){
方法体程序代码
return 返回值;
}
其中:
修饰符:public,缺省,private, protected等
返回值类型:没有返回值:void; 有返回值,声明出返回值的类型。与方法体中“return 返回值”搭配使用。
方法名:属于标识符,命名时遵循标识符命名规则和规范,“见名知意”
形参列表:可以包含零个,一个或多个参数。多个参数时,中间用“,”隔开
返回值:方法在执行完毕后返还给调用它的程序的数据。
方法的重载
重载的概念:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
重载的特点:与权限修饰符、返回值类型、形参变量名、方法体无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
可变个数的形参
JavaSE 5.0 中提供了Varargs(variable number of arguments)机制,允许直接定义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参。
//JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量
public static void test(int a ,String[] books);
//JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量
public static void test(int a ,String…books);
1.声明格式:方法名(参数的类型名 …参数名)
2.可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个
3.可变个数形参的方法与同名的方法之间,彼此构成重载
4.可变参数方法的使用与方法参数部分使用数组是一致的
5.方法的参数部分有可变形参,需要放在形参声明的最后
6.在一个方法的形参位置,最多只能声明一个可变个数形参
方法参数的值传递机制
1、方法,必须由其所在类或对象调用才有意义。若方法含有参数:
形参:方法声明时的参数
实参:方法调用时实际传给形参的参数值
2、Java的实参值如何传入方法呢?
Java里方法的参数传递方式只有一种:值传递。 即将实际参数值的副本(复制品)传入方法内,而参数本身不受影响。
形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参
形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参
递归(recursion)方法
递归方法:一个方法体内调用它自身。
方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无须循环控制。
递归一定要向已知方向递归,否则这种递归就变成了无穷递归,类似于死循环。
我们程序设计追求“高内聚,低耦合”。
高内聚 :类的内部数据操作细节自己完成,不允许外部干涉;
低耦合 :仅对外暴露少量的方法用于使用。
隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,从而提高系统的可扩展性、可维护性。通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来。这就是封装性的设计思想。
信息的封装和隐藏
Java中通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx()和setXxx()实现对该属性的操作,以实现下述目的:
隐藏一个类中不需要对外提供的实现细节;
使用者只能通过事先定制好的方法来访问数据,可以方便地加入控制逻辑,限制对属性的不合理操作;
便于修改,增强代码的可维护性;
封装性的体现
1、如上;
2、不对外暴露的私有方法
3、单例模式 等
四种访问权限修饰符
Java权限修饰符public、protected、(缺省)、private置于类的成员定义前,用来限定对象对该类成员的访问权限。
对于class的权限修饰只可以用public和default(缺省)。
public类可以在任意地方被访问。
default类只可以被同一个包内部的类访问。
可以修饰的内部结构:方法、属性、构造器、内部类
修饰符 | 类内部 | 同一个包 | 不同包的子类 | 同一个工程 |
---|---|---|---|---|
private | Yes | |||
(缺省) | Yes | Yes | ||
protected | Yes | Yes | Yes | |
public | Yes | Yes | Yes | Yes |
构造器的特征
它具有与类相同的名称
它不声明返回值类型。(与声明为void不同)
不能被static、final、synchronized、abstract、native修饰,不能有return语句返回值
构造器的作用:创建对象;给对象进行初始化
如:Order o = new Order(); Person p = new Person(“Peter”,15);
语法格式:
修饰符 类名 (参数列表) {
初始化语句;
}
根据参数不同,构造器可以分为如下两类:
隐式无参构造器(系统默认提供)
显式定义一个或多个构造器(无参、有参)
注 意:
Java语言中,每个类都至少有一个构造器
默认构造器的修饰符与所属类的修饰符一致
一旦显式定义了构造器,则系统不再提供默认构造器
一个类可以创建多个重载的构造器
父类的构造器不可被子类继承
构造器重载
构造器一般用来创建对象的同时初始化对象。
构造器重载使得对象的创建更加灵活,方便创建各种不同的对象。
构造器重载,参数列表必须不同
构造器重载举例:
public class Person{
public Person(String name, int age, Date d) {this(name,age);…}
public Person(String name, int age) {…}
public Person(String name, Date d) {…}
public Person(){…}
}
this是什么?
1、在Java中,this关键字比较难理解,它的作用和其词义很接近。
它在方法内部使用,即这个方法所属对象的引用;
它在构造器内部使用,表示该构造器正在初始化的对象。
2、this 可以调用类的属性、方法和构造器
3、什么时候使用this关键字呢?
当在方法内需要用到调用该方法的对象时,就用this。
具体的:我们可以用this来区分属性和局部变量。
比如:this.name = name;
1、在任意方法或构造器内,如果使用当前类的成员变量或成员方法可以在其前面添加this,增强程序的阅读性。不过,通常我们都习惯省略this。
2、当形参与成员变量同名时,如果在方法内或构造器内需要使用成员变量,必须添加this来表明该变量是类的成员变量。
3、使用this访问属性和方法时,如果在本类中未找到,会从父类中查找。
4、this可以作为一个类中构造器相互调用的特殊格式。
注意:
1、可以在类的构造器中使用"this(形参列表)"的方式,调用本类中重载的其他的构造器!
2、明确:构造器中不能通过"this(形参列表)“的方式调用自身构造器
3、如果一个类中声明了n个构造器,则最多有 n - 1个构造器中使用了"this(形参列表)”
4、"this(形参列表)“必须声明在类的构造器的首行!
5、在类的一个构造器中,最多只能声明一个"this(形参列表)”
为什么要有继承?
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,
那么多个类无需再定义这些属性和行为,只要继承那个类即可。
此处的多个类称为子类(派生类),单独的这个类称为父类(基类 或超类)。可以理解为:“子类 is a 父类”
类继承语法规则:
class Subclass extends SuperClass{ }
作用:
继承的出现减少了代码冗余,提高了代码的复用性。
继承的出现,更有利于功能的扩展。
继承的出现让类与类之间产生了关系,提供了多态的前提。
注意:不要仅为了获取其他类中某个功能而去继承
子类继承了父类,就继承了父类的方法和属性。
在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。
在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”。
关于继承的规则:
子类不能直接访问父类中私有的(private)的成员变量和方法。
Java只支持单继承和多层继承,不允许多重继承
一个子类只能有一个父类
一个父类可以派生出多个子类
class SubDemo extends Demo{ } //ok
class SubDemo extends Demo1,Demo2…//error
子类直接继承的父类称为直接父类,间接继承的父类称为间接父类。子类继承父类后,就获取了直接父类以及所有间接父类中声明的属性和方法。
如果没有显式的声明一个类的父类方法,则此类继承于java.lang.Object类,所有的java类,除java.lang.Object类之外,都直接间接的继承于java.lang.Object类。意味着所有的java类具有java.lang.Object类中的功能。
区别点 | this | super | |
---|---|---|---|
1 | 访问属性 | 访问本类中的属性,如果本类没有此属性则从父类中继续查找 | 直接访问父类中的属性 |
2 | 调用方法 | 访问本类中的方法,如果本类没有此方法则从父类中继续查找 | 直接访问父类中的方法 |
3 | 调用构造器 | 调用本类构造器,必须放在构造器的首行 | 调用父类构造器,必须放在子类构造器的首行 |
方法名称 | 类型 | 描述 | |
---|---|---|---|
1 | public Object() | 构造 | 构造器 |
2 | public boolean equals(Object obj) | 普通 | 对象比较 |
3 | public int hashCode() | 普通 | 取得Hash码 |
4 | public String toString() | 普通 | 对象打印时调用 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。