★ 三者关系如下:JDK > JRE > JVM2.
public class Demo {
public static void main(String[] args) {
System.out.println("Hello-World!");
}
}
(1)基础数据类型(四类八种)不能为null
基本数据类型之间的比较:
基本数据类型 大小 最小值 最大值 包装数据类型
byte 1 个字节(1*8 位) -2^7 2^7 - 1 Byte
short 2 个字节(2*8 位) -2^15 2^15-1 Short
int 4 个字节(4*8 位) -2^31 2^31-1 Integer
long 8 个字节(8*8 位) -2^63 2^63 - 1 Long
boolean - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Boolean
char 2 个字节(2*8 位) 0 2^16 - 1 Character
float 4 个字节(4*8 位) 1.4E - 45 3.4028235E38 Float
double 8 个字节(8*8 位) 4.9E – 324 1.7976931348623157E308 Double
(2)引用数据类型可以=null
类 (Class)
预定义的类:官方定义好的类,拿来就可以使用,无需再次创建
自定义的类:官方没有定义的类,只能够自己创建
接口 (Interface)
预定义的接口:官方定义好的接口,拿来就可以使用,无需再次创建
自定义的接口:官方没有定义的类,只能够自己创建
数组 (Array)
枚举 (Enumeration)
int 、 byte 、 short 、 long 、 char 、 boolean 、 float 、 double 、 true 、 false 、 new 、 void 、 instanceof
break 、 continue 、 switch 、 case 、 default 、 catch 、 do 、 while 、 else 、 if 、 for return 、 try 、 finally 、 throw 、 this 、 super
private 、 public 、 static 、 protected 、 final 、 abstract 、 native 、 synchronized
class 、 extends 、 implements 、 interface 、 package 、 import 、 throws
命名规范:
单行注释
多行注释
文档注释
变量
成员变量/全局变量:定义在类中,不在方法、语句、代码块中
public class Demo{
int age;
}
局部变量:定义在方法中或语句中、代码块中
public calss Dmeo{
public static void main(string []arge){
int age;
System.out,println(age);
}
}
成员变量和局部变量的区别?
常量
public class Demo {
public static void main(String[] args) {
boolean a = 20 > 15 ? true: false;
System.out.println(a);
}
}
选择结构语句
- if
单支语句 if ( ) { }
双支语句 if ( ) { }else if ( ){ }else if ( ){ }
多支语句if ( ) { }else { }
- switch
switch(①){ case xxx : break; default{} }
①的意思是:条件 该条件的类型可以是 整数 在JDK1.7版本后,可以使用字符串作为类型
public class Demo {
public static void main(String[] args) {
System.out.println("请输入分数:");
Scanner sc = new Scanner(System.in);
int score = sc.nextInt();
switch (score/10){
case 10:
case 9:
System.out.println("A");
break;
case 8:
System.out.println("B");
break;
case 7:
case 6:
System.out.println("C");
break;
}
System.out.println("分数为:" + score);
}
}
循环结构语句
while循环
先判断后循环
for循环
i++ 先运算后赋值
++i 先复制后运算
public class Demo {
public static void main(String[] args) {
for (int i = 1; i <= 4; i++) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println();
}
}
}
描述对象具备的功能,就是方法
格式:
权限修饰符 返回值类型 方法名称(参数1 的类型 参数1 ,参数2的类型 参数2 ){
执行语句;
return; 结果值
}
权限修饰符
public 公共的
private 私有的
default 默认的
protected 受保护的
返回值类型
如果有类型,请参照数据类型结构图
如果没有类型,使用void
方法名称
命名在符合命名规范的前提下 见面知意即可 eg:getSum() 求和
返回值
如果有返回值类型,使用return关键字
@Test
public viod getSum(int x,int y){
int z = x + y;
return z;
}
如果没有返回值类型,省略return关键字
@Test
public void print99(){
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i * j);
}
System.out,println();
}
}
重载 overload
方式一:方法名称相同,参数个数不同
方式二:方法名称相同,返回值类型不同
Junit单元测试的方法 使用细节
1.在方法名称上 存在 @Test—— 别忘记导包
2.测试方法的权限修饰符 必须是 public
3.测试方法的返回值类型 必须是 void
4.测试方法的方法名称 随便起名
5.测试方法的方法参数 必须为空
数组
数组是一个容器,也是一个数据存储结构
一维数组
二维数组
数组的使用
1.存入数组
(1)前提:有剩余的长度
(2)直接对剩余的长度进行分别赋值操作
2.从数组中取出元素
(1)单个取出,制定数组中的索引值位置
(2)循环操作
3.如何排序
(1)Arrays.sort(arr);
@Test
public void print(int [] arr){
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + ", ");
}
System.out.println();
}
@Test
public void bubbleSort(){
int arr [] = {2,55,69,78,41,58};
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1; j++) {
if (arr[j] > arr[j + 1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
print(arr);
}
(1)如何找出最值
public class Demo{
public static void main(String[] args) {
int arr [] = {12,56,99,82,36,555};
int max = arr[0];
for (int i = 0; i < arr.length; i++) {
if (arr[i] > max){
max = arr[i];
}
}
System.out.println(max);
}
}
class Dog extends Animal{
//狗 是 狗
Dog d = new Dog();
//狗 是 动物
Animal d = new Dog();
}
抽象类 接 口
构造方法 有 没有
成员变量 有普通成员变量 没有
普通方法 可以包含非抽象的 不可包含
访问类型 可以是public protected 只能是public(默public abstract)
静态方法 可以 不可以
静态成员变量 访问类型可以任意 接口中定义的变量只能是public static final类型
this 当前的
super 父类的
static 静态化的
优点
1.可以使用【类名 方法名称】进行调用,不必再创建对象
2.优于构造函数先执行------> 任何一个类都会有一个默认的无参数的构造方法
构造方法/函数的作用:为了使类可实例化【就是为了可以new】
3.静态成员被所有对象所共享(静态数据达到成为共享数据)
4.随着类的加载而加载(也就是说类运行了,静态成员也就跟随运行了)
缺点
1.访问出现局限性 只能访问静态
2.静态成员的生命周期过长
3.不可以与this | super关键字同用
(1)因为this代表使当前类对象,而静态存在时,有可能没有对象
(2)因为super代表的是父亲对象,而静态存在时,有可能没有对象,而且静态优先于对象存在
4.静态方法只能访问静态成员,非静态方法既可以访问静态又可以访问非静态
final 最终化的
public class Car{
String color; //成员变量
public void driver(){
int speed = 80; //局部变量
System.out.println("时速:" + speed);
}
}
List【线程不安全性】
派生类
ArrayList 查询块、增删慢
LinkedList 查询慢、增删块
Vector 查询慢、增删更慢 【线程安全性】
特点
使用线性存储
可以重复添加
存入与取出顺序一致
Set【线程不安全性】
派生类
HashSet
TreeSet
特点
使用哈希表存储
不可以重复添加
存入与取出顺序不一致
为什么不可以重复添加数据?
接口:继承了Iterable,迭代器
foreach
泛型:限定类型,泛型中的不可以使用基础数据类型,只能使用引用数据类型
HashMap 【线程不安全性】
都需要使用迭代器
Iterator it = Set.iterator();
while (it.hasNext()){
it.next();
}
TreeMap 【线程不安全性】
HashTable【线程安全性】
properties 既是io流 也是集合
list与Map不能转换
set与Map可以转换 共同点有【都是线程不安全性 都是接口 都间接的继承了Iterable这个接口】
在双列集合接口中,并没有继承Iterable,意味着Map集合中没有迭代器
Collections是专门用于对Collection集合进行操作的工具类,它提供了一些便捷的方法,如排序,查找,求最值等等
CPU中央处理器
单核处理器(并行)
多核处理器(并发线程)
如果是单核处理器,就不是同时在执行
运行速度非常快,快到以为是同时
多核处理器真的可以同时在执行,处理器多了可以分开执行
设置线程:Run()方法
开启线程:Start()方法
继承java.lang.Thread类【extend Thread】
实现java.lang.Runnable接口(重写Run方法)【implements Runnable】
实现Callable接口(接口中一定不允许存放变量,不能够存放常量)
Thread和Runnable的区别(实现接口比继承类的优势)
①可以避免单继承的局限性【若一个类继承 Thread的话,则不适合资源共享;但若实现 Runnable 接口的话,就很容易实现资源共享】
②适合多个相同的程序代码的线程去处理同一个资源
③增强程序的扩展性,降低耦合性(避免牵一发而动全身)【代码可以被多个线程共享,代码和数据独立】
④线程池只能放入实现 Runnable 或 Callable 类的线程,不能直接放入继承 Thread 的类
- synchronized同步方法。如果是普通方法会锁住这个对象,如果是静态方法锁住的是整个类。
- synchronized同步代码块。
- volatile修饰变量。
- 重入锁ReenreantLock。实现了Lock接口,可重入,但效率低。
- ThreadLocal线程级别的变量共享。
- 阻塞队列LinkedBlockingQueue。主要通过synchronized的put、take实现。
- 原子变量。
以Stream结尾的为字节流,以Writer或者Reader结尾的为字符流
所有的输入流都是抽象类IuputStream或者是抽象类Reader的子类,所有的输出流都是抽象OutputStream或者是抽象类Writer的子类。字符流能实现的功能字节流都能实现,但字节流能实现的功能字符流不一定能实现。如:图片,视频等二进制文件,只能使用字节流读写。
字节流
字符流
public static void main(String[] args) throws Exception {
InputStream in = new FileInputStream("C:\\Users\\学生29\\Desktop\\a.jpg"); //该资源的位置
OutputStream out = new FileOutputStream("E:\\a.jpg"); //到哪里去 文件名称
long begintime = System.currentTimeMillis();
int len = 0; //局部变量 没有默认的初始化值
byte[] b = new byte[1024 * 10]; //b表示缓冲区
while ((len = in.read(b)) != -1){ //read(b)输入方法
out.write(b,0,len); //write(b,0,len)输出方法
}
long endtime = System.currentTimeMillis();
long time = endtime - begintime;
System.out.println("消耗的时间为:" + time);
out.close(); //关闭流 【先开后关,后开先关】
in.close();
}
RandomAccessFile
int len = 0;
while((len = in.read()) != -1){
out.write(len);
}
int b = in.read();
if(b == -1){
break;
}
字节流和字符流的区别
字节流不是汉字的内容,而是字母、数字等,字符流则是汉字,(简体和繁体);
字节流按字节读写,而字符流按字符读写;
字节流是以stream结尾,而字符流是以reader和writer结尾;
字节流采用ASCII编码,而字符流采用Unicode编码;
字节流默认不使用缓冲区,字符流使用缓冲区。
/**
* 前提:
* 想使用jdbc连接:导入一个jar包
* |-----------mysql-connector-java-5.1.47------------|
* 1.注册驱动
* 2.通过驱动管理(DrviverManage)获取连接class.forName(url user password)
* 3.通过连接(connection)对象创建statement(陈述 声明)对象
* 4.通过statement对象执行SQL语句 execute执行
* 5.操作结果集对象ResultSet
* 6.释放资源
*/
//全局变量
private static String url = "jdbc:mysql://localhost:3306/bookmanage";
private static String driverClassName = "com.mysql.jdbc.Driver";
private static String username = "root";
private static String password = "root";
@Test
public void addJdbc(){
try {
Class.forName(driverClassName);
Connection con = DriverManager.getConnection(url, username, password);
Statement statement = con.createStatement();
statement.execute("insert into dept(id,name,location) values (100,'学术部','深圳')");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Test
public void delJdbc(){
try {
Class.forName(driverClassName);
Connection con = DriverManager.getConnection(url, username, password);
Statement statement = con.createStatement();
String sql;
sql="delete from dept where id=100";
statement.execute(sql);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Test
public void editJdbc(){
try {
Class.forName(driverClassName);
Connection con = DriverManager.getConnection(url, username, password);
Statement statement = con.createStatement();
statement.execute("update dept set location='上海' where id = 33");
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Test
public void listJdbc(){
try {
Class.forName(driverClassName);
Connection con = DriverManager.getConnection(url, username, password);
Statement statement = con.createStatement();
String sql;
sql="select * from dept";
ResultSet rs = statement.executeQuery(sql);
int id = 0;
String name = "";
String location = "";
while (rs.next()){ //处理结果集
id = rs.getInt("id");
name = rs.getString("name");
location = rs.getString("location");
System.out.println(id + " " + name + " " + location);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
或者
public void add2() throws Exception{
Class.forName(driverClassName);
Connection con = DriverManager.getConnection(url, username, password);
PreparedStatement ps = con.prepareStatement("insert into lib(id,name,price,date) values(?,?,?,?)");
ps.setInt(1,111);
ps.setString(2,"蜜汁炖鱿鱼");
ps.setDouble(3,36.9);
String date = "1999-8-8 19:52:00";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //转换
Date d = sdf.parse(date);
long time = d.getTime();
ps.setDate(4,new java.sql.Date(time));
int rows = ps.executeUpdate();
if (rows > 0){
System.out.println("success");
}else{
System.out.println("error");
}
public class JdbcUtil2 {
public static void main(String[] args) {
// update("insert into category (id,name) values (221,'公关部')");
// update("delete from category where i d=?");
// update("update category set name='社会' where id=77");
query("select * from category");
}
public static Connection load(){
String driverClassName = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql:///bookmanage";
String username = "root";
String password = "root";
try {
Class.forName(driverClassName);
Connection connection = DriverManager.getConnection(url, username, password);
return connection;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 增删改 用update
*/
public static void update(String sql){
Connection con = load();
try {
Statement sta = con.createStatement();
boolean execute = sta.execute(sql);
if (!execute){
System.out.println("执行成功");
}else {
System.out.println("执行失败");
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 查询 用query
*/
public static void query(String sql){
Connection con = load();
try {
PreparedStatement ps = con.prepareStatement(sql);
ResultSet resultSet = ps.executeQuery();
while (resultSet.next()){
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println(id + " " + name);
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
/**
* Statement 是编译对象 是执行sql语句的
* |-----PreparedStatement 是预编译对象 是执行sql语句的
*为什么不采用Statement?
* 答:因为有可能会发生 SQL安全问题! SQL注入
* 因此 子类PreparedStatement 解决上面的可会出现的问题,没有 SQL安全问题。所以采用它
* executeUpdate(): 增删改 使用 Update方法 --- > 对应到 QueryRunner 类中的update()
* executeQuery(): 查 使用 Query方法 --- > 对应到 QueryRunner 类中的query()
*/