1、简单数据类型,采用值传递
2、引用数据类型(数组,对象),采用引用传递
数组:获取数组中某个值所在的index,Java中封装了对应的方法: int index = Arrays.binarySearch(arrays, key);
当数组作为一个参数传递的时候,采用的是引用传递,修改传递后的整个对象是无效的,但是修改对象中的某个具体的值的生效的,因为修改整个对象相当于把该引用指向别的地方,不会影响原来的数组,但是修改具体值的时候相当于进入指针内部,修改原对象的值。
https://c.runoob.com/quiz/5571
binarySearch采用二分法封装
1,参数个数不同
2,个数相同,类型不同
3,个数,类型相同,但在参数列表中出现的顺序不一样。
1,函数名称与类名相同。
2,不含返回类型。
定义了构造函数之后,在实例化对象时,就必须传入相应的参数列表。否则报错。类名 对象名=new 类名(传给构造函数的参数列表)
3,在对象的生命周期,构造函数只会调用一次。
4,可以被重载(意思就是可以有多个)
5,系统会默认提供构造函数,系统默认提供的构造函数可以通过类 对象名=new 类名()来实例化。
静态变量:
让各个对象共有的内容只用一个空间保存 static,在类被载入时创建,只要类存在,静态变量就存在,不管对象是否实例化。可以通过(对象名.变量名)或者(类名.变量名)来访问。 应用:保存跨对象信息;存储对象个数
静态函数:不能直接访问类中的非静态成员变量和成员函数,也不能使用this.关键字。
静态代码块:对所有对象的共同信息进行初始化,并对所有对象,只执行一次。static{执行语句}
继承:Java不支持多重继承 ,一个子类只能有一个父类。 (extends)
子类继承父类之后,在实例化子类对象的时候,系统会首先实例化父类对象。若父类构造函数有参数,则实例化父类时,必须传入参数。(1,给父类增加一个不带参数的空构造函数;2,在子类构造函数中,第一句用super给父类构造函数传参数,注意传入的参数必须和父类构造函数中参数列表类型匹配)
成员覆盖(重写override): 子类中成员函数的定义和父类相同,指名称相同,参数列表,返回类型都相同(若不同则报错)。(最后调用的是子类中) 注意:子类的访问权限不能比父类的更加严格。 若一定要在子类中调用父类的成员函数,用super.函数名
(静态多态:函数重载,,动态多态:理论基础是父类引用可以指向子类对象)
1,函数传入的形参可以是父类类型,实际传入的可以是子类对象
2,函数的返回类型是父类类型,实际返回的可以是子类对象。
抽象类:抽象类不能被实例化;抽象类必须被重写,除非子类也是抽象类;抽象类也可以含有普通成员函数。
在使用抽象类时需要注意几点:
1、抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
2、抽象方法必须由子类来进行重写。
3、只要包含一个抽象方法的抽象类,该方法必须要定义成抽象类,不管是否还包含有其他方法。
4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。
5、子类中的抽象方法不能与父类的抽象方法同名。
6、abstract不能与final并列修饰同一个类。
7、abstract 不能与private、static、final或native并列修饰同一个方法。、
接口(interface):抽象类中所有的函数都是抽象的,就可以定义为接口;继承接口(实现接口)implement
接口中只能包含常量(public static void)和函数(public)
接口可以通过extends继承另一个接口,类通过implements关键字来实现一个接口
一个类可以在继承一个父类的同时实现多个接口:class 子类 extends 父类 implement 接口1,接口2,接口3.....{}
1,修饰一个类:表示该类不能被继承
2,修饰一个函数:表示该函数不能被重写
3,修饰一个变量:表示该变量不允许被重新赋值。 、
一个对象只有第一次使用的时候实例化,适合一个类(单例类)只有一个实例的情况,提高系统性能, 模式要点:
1,某个类只能有一个实例
2,必须自行创建这个实例
3,必须自行向整个系统提供这个实例
4,用静态变量来实现。
利用继承和多态扩充程序功能
异常处理:Java规定,一个try后面必须至少接一个catch,可以不接finally,但是最多只能有一个finally
为字符串常量:string中封装的是不可变的字符串(
如执行str.replace('h','A');后h没有变成A
)如果要将其进行一些处理,就必须得到返回值
String str1=str.replace('h','A');
StringBuffer和StringBuilder:字符串变量 (其中的字符串值可以改变).
执行速度:StringBuilder > StringBuffer > String
StringBuilder是线程不安全的,而StringBuffer是线程安全的
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
1,集合中的元素个数是可变的
2,集合中可以存储不同类型的数据
一维集合:Conllection是一个接口(子系列:List,Queue,set) 而Conllections是一个类
二维集合:map
ArrayList:随机访问,不必在除尾部的任何位置插入或除去元素;
LinkedList:频繁的从集合的中间位置添加和除去元素;
Vector:线程安全;
二维集合:HashMap(put,get方法) 非线程同步
1,保证遍历时按照添加进去的顺序(将HashMap改为LinkedHashMap)
2,将HashMap里面的元素按照key值排序(将HashMap改为TreeMap,默认升序,降序TreeMap(comparator c))
Hashtable线程同步。
Java中Queue的一些常用方法:
add 增加一个元素 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 删除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 查询返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素
java.util.Date
java.util.Calendar()
年:Calendar.YEAR 获取方式:obj.get(Calendar.YEAR)
月:Calendar.MONTH
日:Calendar.DAY_OF_MONTH;
周:Calendar.DAY_OF_WEEK;
小时:Calendar.HOUR
分钟:Calendar.MINNUTE
秒钟:Calendar.SECOND
java.util.TimeZone
格式化日期:SimpleDateFormat(String pattern如“yyyy年MM月dd日 hh:mm:ss”);
格式化数值:使用NumberFoemat的子类DecimalFormat(String pattern)
1,进程与线程的区别:进程包含线程;线程可以并发,线程不可以;进程拥有自己的变量,而线程共享一个进程内的这些数据。进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列
线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,
实现多线程的方式:
继承Thread实现多线程;1,编写一个类,继承java.util.Thread类;2,重写该类的run()方法,将线程需要执行的代码放进run函数;3,实例化线程对象,调用其start()函数来启动该线程。
实现Runnable接口开发多线程;1,编写一个类,继承java.util.Runnable接口,继承接口用的关键字是implements;
2,重写该类的run()方法,将线程需要执行的代码放进run函数;3,实例化2中编写的Runnable实现类,将后者传入Thread对象的构造函数,调用其start()函数来启动该线程。
如何控制线程的运行:利用Thread.sleep()结合run方法中有一个while循环,将该循环的执行标志由true改为false即可
线程协作:避免抢占CPU导致结果不正确:调用线程ct的join方法,可以让系统等该线程(ct)运行完毕再运行接下来的代码。
例:ct.start();ct.join();st.start();
线程同步:解决方式:synchronized关键字解决synchronized(同步锁对象:必须是可以被各个线程共享的,如this,全局标量,不能是一个局部变量){//访问共享资源,需要同步的代码段}
原理:当某一线程运行同步代码段时,在同步锁对象上置一标记,运行完这段代码,标记消除,若其他cpu想要抢占,必须先检查该标记是否已经消除。
死锁:两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象
产生条件:
互斥条件,请求与保持,不剥夺条件,循环等待
解决死锁的办法:
可以撤销陷于死锁的全部进程;可以逐个撤销陷于死锁的进程,直到死锁不存在;从陷于死锁的线程中逐个强迫放弃所占用的资源,直至死锁消失。
定时器:
定时器所做的具体工作类:java.util.TimerTask
定时器活动控制类:java.util.Timer
File类:在路径中,windows系统规定的分隔符是“\”如果写成常量,应该用“\\”表示。在unix系统中,分隔符是"/"
字节流的输入输出:
写文件:(字节)FileOutputStream fos=new FileOutputStream("C:\\test.txt");//创建文档所在目录及文件名
字符:PrintStream()
String msg="123e3cda";//文件中需要写入的内容
写入:write(msg.getBytes());
关闭:close()
读文件:FileInputStream
File file=new File("C:/new.txt");
FileInputStream fis=new FileInputStream(file)
byte[] data=new byte[(int)file.length()]
读:fis.read(data);
关闭:fis.close();
String msg=new String(new String(data));
System.out.println(msg);
Java中将字符串改为字符数组:char chs[]=msg.toCharArray();
读写对象:ObjestOutputStream和ObjectInputStream
如果一个对象需要被输入输出,该对象对应的类必须实现java.io.Serializable接口。
字符流的输入输出:读写文件:
写文件:FileWriter(string路径,不存在则创建,存在,删除后再创建,|boolean(true,表示在原文件末尾添加新内容)|)
读文件:FileReader调用该类中的函数进行文件操作。
逐行读文件中的数据:BufferedReader.readLine();
键盘行输入:BufferReader
用RandomAccessFile类进行文件读写。(适合文本数据很大)
RandomAccessFile raf=new RandomAccessFile("目录","rw/r");//rw代表写(结合write);r代表读(结合read)
seek函数设置文件读取和写入的位置。
Properties 涉及XML格式。、
Java GUI
主要包swing
控件(组件):标签(JLabel),按钮(JButton),文本框(JTextFiled),多行文本框(JTextArea),密码框(JPasswordFiled),单选按钮(JRadioButton),复选框(JCheckBox),下拉列表框(JComboBox),
菜单(JMenuBar,JMenu,JMenuItem),
JOptionPane[消息框showMessageDialog);输入框(showInputDialog);确认框(showConfirmDialog)];
初始化:BigDecimal a=new BigDecimal(str);]
加减乘除运算:
a+b:a.add(b)
a-b:a.subtract(b)
a*b:a.multiply(b)
a/b:a.divide(b,scale) scale为确定的精度位数(小数位数)。
a.stripTrailingZeros().toPlainString() 去除无用的0,并转为string(注意这里不是用toString(),而是用toPlainString());