2016-11-28(1)上午
Api 的学习:
Math: 定义了各种算数运算的方法
Math.abs(指定的数):对指定数取绝对值
Math.round(指定数):对指定数四舍五入
Math.ceil(指定数):对指定数向上取整
Math.floor(指定数):对指定数向下取整
Math.random(指定数):随机生成0到1之间的随机小数,包括0 ,不包括1
基本数据类型8种,都有对应的包装类: Interger Long Byte Double Float Boolean Character Int
Integer.parseInt(纯数字字符串):将字符串强制转换为int值,其他包装类页游对应的强制在转换函数
New: 开辟(堆)空间,每一次堆的空间开辟都会产生一个在栈中的地址
String 变量 = 值;
计算机首先会在内存中判断是否存在该值,如果不存在就开辟空间生成地址,如果已经存在就直接返回地址
String 变量 = new String(值);
不会判断,直接开辟空间
String 类常用方法:
charAt(下标) :返回指定下标位置的字符
getBytes(): 将字符串转换为byte数组
getChars(开始下标,结束下标,目标数组,存储开始下标):从指定字符串的开始下标到结束下标挨个获取字符(不包括指定结束下标位置的字符),将字符从指定目标数组的指定存储开始下标位置存储数组
length():获取字符串长度
replace(字符1,字符2):将字符串中的字符1替换为指定的字符2
replace(子字符串1,字符串2):将字符串中的子字符串1替换为指定的字符串2
split(指定格式字符串):按照指定格式字符串拆分原字符串,返回结果为字符串数组
substring(开始下标):返回字符串从开始下标位置到字符串末尾的子字符串
substring(开始下标,结束下标):返回字符串从开始下标位置到结束下标位置的子字符串,包含开始,不包含结束。
trim():去掉字符串首位空格
String.valueOf(值):将值以String类型返回
IsEmpty():当且仅当length()为0时返回true
IndexOf(指定字符或子字符串):返回指定字符或子字符串在原字符串中的下标,没找到返回-1
IndexOf(指定字符或子字符串,开始位置):返回从指定开始位置开始找指定字符或子字符串在原字符串中的下标,没找到返回-1
endsWith(指定子字符串):判断原字符串是否以指定子字符串为结尾
String.format(站位符的字符串,值1,值2….):将值列表添加指定字符串中
%s :表示字符串占位符
%d:表示整数占位符
2016-11-29(2)上午
String str = "abc";
str +="df";
Abc |
abcdf |
字符串每一次的拼接都是生成一个新的对象,如果需要反复操作字符串的值,那么使用String是非常低效的!!建议使用StringBuffer或StringBuilder
使用StringBuffer的方法:
1.创建字符串缓冲区:
StringBuffer 变量名 = new StringBuffer(初始字符串值);
1. 使用StringBuffer 的方法操作缓冲区
append(数据):在缓冲区中追加指定数据
insert(指定位置,数据):将数据插入到缓冲区的指定位置
3.将字符串缓冲区toString转换为不可变的字符串
测试String 和StringBuffer 的差异区别
String str = "";
StringBufferbuffer1 = new StringBuffer();
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
str+=i;
}
long endTime = System.currentTimeMillis();
System.out.println("string 消耗的时间"+(endTime-startTime)+"毫秒");
long startTime1 = System.currentTimeMillis();
for (int i = 0; i < 5000000; i++) {
buffer1.append(i);
}
long endTime1 = System.currentTimeMillis();
System.out.println("stringBuffer 消耗的时间"+(endTime1-startTime1)+"毫秒");
string 消耗的时间515毫秒
stringBuffer 消耗的时间496毫秒
String StringBuffer 和StringBuilder 的区别:
String是字符串常量,
StringBuffer 是字符串变量,---线程安全 (多线程 安全同步,异步不安全)
StringBuilder是字符串变量,--线程不安全
大量操作时选择变量字符串,同时如果需要考虑多线程就使用StringBuilder
IO :input output
根据方向分为:输入流和输出流
根据传递的数据格式不同:字节流和字符流
1. 读写大小不同:字符流:底层还是基于字节流,以字符为单位,字节流:以字节(8bit)单位
2. 处理对象不同:字节流可以处理所有对象,字符只能处理以字符类型的数据。
总结:如果处理纯文本的文字使用字符流
字节流:使用inputStream和OutputStream
字符流:Reader 和Writer
使用时,都是使用其子类
操作步骤:
1. 建立连接(通道),通过创建Flie对象
2. 创建流,以file对象为参数
3. 操作流
4. 关闭流
2016-11-30(3)上午
IO:
BufferedInputStream和BufferedOutputStream操作的是缓冲区的读写
InputStream和OutputStream操作的是硬盘的读写
读写速度内存比硬盘快
使用BufferedOutputStream时,在写入文件时,必须使用flush(),清空缓冲区
public static void main(String[] args) throwsIOException {
//创建文件目录
Filefile = new File("D:\\test.txt");
//创建普通输入流
InputStreaminput = new FileInputStream(file);
//使用BufferedInputStream包装,给普通输入流绑定缓冲功能
BufferedInputStreambuffer = new BufferedInputStream(input);
intnum;//存储每次读取到的数据长度
byte[]b = new byte[1024];//存储从流中拿到的数据
Stringrs = "";
while((num= buffer.read(b,0,b.length)) != -1){
Stringstr = new String(b);
//截取数据,num存储的是获取到的数据长度
rs+= str.substring(0,num);
}
System.out.println(rs);
//释放资源
buffer.close();
input.close();
}
public static void main(String[] args)throws IOException {
Filefile = new File("D:\\test.txt");
PrintWriterwriter = new PrintWriter(new FileWriter(file));
writer.println("姓名:zhangsan");
writer.println("年龄:20");
writer.flush();//清空缓冲,流还存在
writer.close();//关闭流
}
2016-11-30(3)下午
BufferedInputStream:
BufferedOutputStream:
FileReader:用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
FilterWriter:用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
PrintWriter:向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有print 方法。它不包含用于写入原始字节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
2016-12-1(4)上午
异常: Exception
正常编译的代码在运行时出现的错误!
错误:error
物理上的错误,逻辑上的异常
Java对异常的处理有两种方式:
1. 本身不处理异常,将异常交给方法调用端 ,使用throws 关键字抛出异常
语法 : 在函数后面throws关键字 抛出异常
2. 本身将异常处理,不交给调用端处理
使用try ..catch处理异常:
语法: try{
//可能出现异常的代码
}catch(可能出现的异常对象){
//出现异常后的处理代码
}
catch 可以有多个或0个, finally可以没有
try{
//可能出现异常的代码
}catch(可能出现的异常对象){
//出现异常后的处理代码
}finally{
//不管出不出现异常都会执行的代码
}
所有异常的超类Exception,除非程序只有一个异常不清楚,那么可以在最后一个catch中使用Exception 。
排错:建议使用打印输出语句 //System.out.println();
数组:用于存储一组相同数据类型的容器,数据类型固定,长度固定
集合:存储多个数据,数据类型不固定,长度也不固定
泛型集合:存储一组相同数据类型的数据,数据类型固定,长度不固定
集合底层是用数组实现的
集合遍历使用foreach
基本数据类型的数据存入集合中默认会转换Object类型
ArrayList 是有序集合,允许存在重复值和null值
LinkedList基本功能和ArrayList相同,但是封装了更多的对增加和删除的方法
HashSet是无序集合,允许存在null值,不允许存在重复值
迭代算法:
/**
* 迭代算法 ,foreach 底层的算法就是迭代算法
*/
使用迭代器对算法进行迭代
Iterator it = hash.iterator(); //迭代器
while(it.hasNext()){ //判断是否有下一个元素
Objecto = it.next(); //获取下一个元素
System.out.println(o);
}
迭代(iterator):一个一个数
Map集合:都是以健值对的形式存在
HashMap是无序的健值对集合,不允许出现重复键(会覆盖),
泛型:用于规定数据类型
泛型集合:有明确类型规则的集合
ArrayList<数据类型> 变量名 = new ArrayList<数据类型>();
集合就只能存储指定的数据类型数据
练习:
1. 使用LinkedList 定义一个队列类,实现数据的先入先出
2. 定义泛型队列
3. 定义用户类,使用集合存储用户对象
4. 使用IO流将Users.txt 中的用户数据,读取封装为用户对象存入泛型集合
2016-12-2(5)上午
进程:包含多个线程
线程:就是一个代码段
多线程: 同时运行多个线程
使用多线程:有两种方式
1. 继承方式
a) 创建线程类,继承thread类
b) 重写run()
c) 在主函数中创建子函数
2. 实现方式: 接口 Runnable
3. public class RunableTest implements Runnable{
4. private String name ;
5.
6. public RunableTest(String name) {
7. this.name = name;
8. }
9. @Override
10.public void run() {
11. for (int i = 0; i < 5; i++) {
12. System.out.println(name+"线程继续!"+i);
13. try {
14. Thread.sleep((int)(Math.random())*1000);
15. } catch (InterruptedException e) {
16. // TODO Auto-generated catch block
17. e.printStackTrace();
18. }
19. }
20.
21.}
22.
23. }
24.Thread test = new Thread("two");
25.RunableTest run = new RunableTest("one");
26.RunableTest run1 = new RunableTest("two");
27.new Thread(run).start();
28. new Thread(run1).start();
实现步骤:
a) 创建实现接口Runnable
b) 重写run
c) 在主线程将类对象作为参数,创建线程对象。然后让线程对象调用start()
开发中:继承方式不适合去实现数据共享,实现方式适合数据共享
Eg: RunableTest run = new RunableTest();
new Thread(run,"one").start();
new Thread(run,"two").start();
new Thread(run,"three").start();
数据共享的实现方式:
1. 创建唯一就绪对象
2. 使用线程构造函数,以就绪对象作为参数,创建多个线程
3. 调用线程的start()
线程的生命周期:创建 就绪 运行 阻塞 终止
@Override
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(name+"线程输出"+i);
try {
sleep((int)(Math.random())*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catchblock
e.printStackTrace();
}
}
}
Java 里面:
线程创建:首先创建一个线程类,然后继承Thread 并且重写run()方法。在主函数中通过(ThreadClass test1 = newThreadClass("one");)创建。
线程就绪: 对象创建后,通过调用start()方法让线程就绪
线程运行:就绪状态下,线程获取cpu使用权,java虚拟机自动调用run()方法,执行程序代码
线程阻塞:线程因某种原因放弃cpu的使用权。Eg:通过调用sleep()使线程进入阻塞状态。(wait stop)阻塞重新进入就绪状态,可继续执行。
阻塞分为:
等待阻塞:使用wait()
同步阻塞:使用同步锁
其他阻塞:休眠
线程终止:线程运行结束,或出现异常
多线程一般用于处理需要异步执行的代码,或处理耗时较长的代码
2016-12-5(1)上午
sql server2008 R2
新建数据库:保证行数据文件(mdf文件)和日志文件(ldf文件)在同一目录
拷贝数据库必须先分离
通过附加,将数据库添加到SQL程序中
DataBase: 数据库,用于存储大量静态数据
数据库以二维表的形式存储数据,每行数据都是一个数据实体
新建数据库表:
1.设计表结构(列名,列数据类型,是否允许该列有空值)
列名:一般全部小写(和java的变量命名一致)
常用数据类型:
存储字符数据类型: 有char(n) n 表示存储个数 , nchar 、varchar(n) 、nvarchar(n)
char 和varchar 的区别: char是固定长度,如果存入的数据长度不足,会自动补null,
varchar是可变长度,如果定义时的长度大于存储时的数据长度,结果为实际长度,不会补null。
Eg:
char(10) -----> “abc” --- à 该数据在数据库中占用10个字符空间,自动补了7个字符
varchar(10) -----> “abc” --- à 该数据在数据库中只占用3个字符空间。
char 和nchar 的区别:存储数据的格式不同,char不是Unicode编码,存储大小为输入数据的实际字节大小。nchar是Unicode编码,存储大小为输入数据个数的两个字节。
Unicode 编码中:一个字符占两个字节 。
Eg:“我的name”
char 占用 2*2+4 = 8个字节 , nchar占用:6*2 = 12个字节
建议:
如果只存储英文就使用 char 和varchar
如果存储较多中文(双字节文字,如韩文,日文…) 使用nchar 和nvarchar
Text数据类型:用于存储大量文本。
数字类型:
存储整数:tinyint(0-255,一个字节) smallint(两个字节) int(4个) bigint(8个) (类比java: byte short int long)
存储小数:float money
decimal(整数位数,小数位数):整数位数默认为18位,小数位数默认为0
一般情况:
字符串选择: varchar 和nvarchar
字符选择:char(2)
整数:使用int
小数使用float
特殊整数:decimal
设计数据表遵循规则:
1.每张表都应该有主键列,包装每行数据唯一标识
对数据进行操作通过执行SQL语句来实现:
操作分为:查询和更新(包含新增,删除,修改操作)
数据库中的运算符:
+-*/ %
=是相等 !=
!否
And表示并且 or表示或者
*符号表示所有
as 可以给列名取别名
查询语句: 结果为一个二维表(结果集)
Select 列名1,列名2…..from 表名 where 条件
条件:使用“=” 判断相等,一个结果为Boolean的表达式
数据库中标中没有“” 双引号 都用’ ’单引号表示
selectname as '姓名'from Users where age >= 20and gender='女';
新增(插入)语句:
insert into 表名(列名列表)values(值1,值2…..):列名列表可以没有,那么就按照默认设置列名顺序 ,自动增长的列不用给值
insertinto Users values('王小二','21','男','12545132544','wangxiaoer','wxe123');
insertinto Users(age,name,gender,tel,username)values('21','王小','男','12546513254','wangxiao');
删除语句:结果为int值得受影响行数
delete 表名 where 条件
deletefrom Users where id = 6
deleteUsers /*删除整张表数据*/
deleteUsers where id = 5