1 、基本数据类型


Java内置8种基本类型 -> 6种数字类型 -> 4种整数类型: byte, short, int, long


-> 2种浮点类型: float, double


-> 1种布尔类型: boolean


-> 1种字符类型: char


 


 


原始数据类型对应的封装对象


  1. (byte, Byte), (short, Short), (long, Long), (float,Float), (double, Double), (boolean, Boolean)
  2. (int, Integer), (char, Character)


 

2.关键字



  • final:



  • 修饰变量时,用以定义常量;
  • 修饰方法时,方法不能被重写(Override);
  • 修饰类时,类不能被继承。


 


  1. short s1=1; s1=s1+1;


这一句编译错误,因为执行s1+1返回的结果是int类型(执行隐式类型转换)。修改的话要强制转换为short型才可以。


 


3.数组


int[] arr1 = {1,2,3,4}; int[] arr2 = new int[4]; int[] arr3 = new int[]{1,2,3,4};


 


 



  • 数组越界,抛出ArrayIndexOutOfBoundsException
  • 数组具有length属性
  • 如果不对数组指定初值,默认初始化为相应数据类型的默认值。
  • 多维数组,嵌套中括号即可。
  • 数组是一种特殊的结构,在数组对象的对象头中需要记录数组长度的信息


 


4.String


 


equals


String str3 =new String("abc");


String str4 =new String("abc");


System.out.println(str3==str4); 返回fl


str3和str4代码分别创建了2个对象,str3和str4指向的是不同的对象,即上面所说的内存空间中存储位置不同。故str3 == str4 返回的肯定是false。(常量池);


System.out.println(str3.equals(str4)); 返回tr


==比较的是两个对象的引用是否相同,或者是比较原始数据类型是否相等;


 


  1. equals()比较的是两个对象的内容是否相同


 



  • StringBuilder线程不安全,但效率高;
  • StringBuffer线程安全,但效率低。


equals(一般用来判断是否与某两个变量值相等)


eg:String a="你好"


a.equals("你好")(这里用“==”可能报错为fals,因为储存位置不同)


 


 


5.集合


 


Collection


List(ArrayList)、Set(HashSet)、Queue


Map


map(HashMap)


 


 


~类型:List, Set, Map,都是接口而非具体实现


List



  • 特点是有序并且按线性方式存储,可以根据元素的下标进行精准的控制。


//List<Integer> a=new ArrayList<Integer>();


//a.add(123);


//s.remove(1);


//a.set(2, 0000);


//a.addAll(a);//增加一个集合


//a.addAll(0, a);//增加集合到某个下标;


求最大最小值


int maxa = Collections.max(list2),mina = Collections.min(list2);


System.out.println("list2's max value is " + maxa);


System.out.println("list2's min value is " + mina);


排序


//由小及大


Collections.sort(list2);System.out.println("list2 sort is "+list2);


//由大及小


Collections.sort(list2,Collections.reverseOrder());//逆序System.out.println("list2 descend sort is "+list2);


//每个元素转换成字符数组


char[] ch = strList.get(i).toCharArray();


//进行比较


ch[j] >= '0'


Set



  • 直接继承自Collection接口HashSet内部使用HashSet实现;
  • 特点是无序但是不包含重复的元素,可以用来去重
  • 元素存放方式为散列存放,即通过计算hash值存放元素。


//Set<String> a =new HashSet<String>;


//a.add("123");


//a.remove("123")因为没有重复值和下标所以直接输入删除数据


Map



  • Map单独为一个接口,HashMap是基于哈希表的对Map接口的实现,而哈希表的底层数据结构是数组和链表;
  • 特点是能够根据key快速查找value;键必须唯一,put一个键相同的值时该键会被更新,即同一个键只能映射到一个值。
  • 键值对以Entry类型的对象实例存在


//Map<String,String > a=new HashSet<String,String>


//a.put("1","2")


//a.remove("1")


//更改就是重新赋值


 


先用it.hasNext() 判断集合里是不是已经没有元素了


 


如果有就用


it.next();


 


就是取得当前集合的元素 然后把指针往后移一位指向下一个元素(java确实还是有指针的只不过你不能自己调用罢了)


6.面向对象


 


super关键字:既可以作为父类对象的引用调用父类方法,也可以作为父类构造函数名显式调用父类构造函数。 


7.抽象类和接口


 


//一个类可以实现多个接口,但只能继承一个父类


 


//接口是更高级别的抽象,接口中的方法必须都是抽象方法;接口中声明的方法都是没有方法主体的;


public abstract class fu {


abstract void name();


abstract void xx();


abstract void xiujia();


}父类


 


public class jc extends fu{


 


@Override


void name() {


// TODO Auto-generated method stub


System.err.println("xiaonin");


}


 


@Override


void xx() {


// TODO Auto-generated method stub


System.err.println("123");


}


 


@Override


void xiujia() {


// TODO Auto-generated method stub


System.err.println("12年");


}


 


}子类


 


8.异常处理


常见异常类型:.note


try-catch-finally


可以用多个catch子句处理不同异常,级别由低到高。


try { doSomethint(); } catch (Exception1 e) { doSomethingCatch1(); } catch (Exception2 e) { doSomethingCatch2(); } finally { finallyDoSomething(); }


 


 


 


 


 


 


 


 


 


 


9.线程


 


 


线程是操作系统调度的最小单元,也叫轻量级进程。同一进程可以创建多个线程,而他们都拥有各自的计算器、堆栈和局部变量等属性,并且能够访问共享的内存变量。


 


线程的5个状态



  • 创建(New):使用new关键字创建一个线程
  • 就绪(Ready):调用start方法,等待CPU调度
  • 运行(Running):执行run方法
  • 阻塞(Blocked):由于一些原因放弃CPU使用权,暂时停止执行
  • 死亡(Dead):run方法执行完毕或者执行时产生异常


volatile和synchronized


Java中提供了关键字volatile和synchronized关键字来保证线程之间操作的有序性。volatile包含了禁止指令重排序的语义,并保证不同线程对同一变量操作时的可见性;synchronized关键字对同一时刻同一变量只允许一个线程对其进行lock操作。


 


 


线程创建


继承Thread类重写run()方法


匿名内部类,即在new Thread()后跟具体的定义体,其中重写了run()方法


实现Runnable接口,重写run()方法


开启线程的run()和start()方法区别


run()方法不能新建一个线程,而是在当前线程中调用run()方法;


start()方法新建一个线程并调用其run()方法。


终止线程不要使用stop()


 


 


 


public class xc01 extends Thread {


@Override


public void run() {


for (int i = 0; i < 5; i++) {


System.out.println(Thread.currentThread().getName()+i);


}


}


}


 


 


public class xc02 implements Runnable {


@Override


public void run() {


for (int i = 0; i < 5; i++) {


System.out.println(Thread.currentThread().getName()+i); //Thread.currentThread().getName()+i 获取线程name


}


}}


 


 


public class test {


public static void main(String[] args) {


xc01 xc01=new xc01();


xc02 xc02=new xc02();


Thread th=new Thread(xc02);


th.start();


for (int i = 0; i <5; i++) {


System.out.println(Thread.currentThread().getName()+i);


}


xc01.start();


}


}


 


多线程


 


public class sp implements Runnable {


static int a=100;


@Override


public void run() {


while (true) {


synchronized (this) {


if (a>0) { System.err.println(Thread.currentThread().getName()+"第"+a+"号");


a--;


}else {


break; }


}


}


}


}


 


public class day0701 {


public static void main(String[] args) {


sp sp=new sp();


Thread a1 =new Thread(sp);


Thread a2 =new Thread(sp);


Thread a3 =new Thread(sp);


Thread a4 =new Thread(sp);


 


a1.setName("窗口1");


a2.setName("窗口2");


a3.setName("窗口3");


a4.setName("窗口4");


 


a1.start();


a2.start();


a3.start();


a4.start();}


}


 


 


 


10.I/O操作


流是一组有顺序的, 有起点和终点的字节集合,是对数据传输的总称或抽象。


 


I/O流的分类



  • 根据处理数据类型划分为:字符流和字节流
  • 根据数据流向划分为:输入流和输出流


字符流和字节流


字符流本质上就是基于字节流,读取时查询相应的码表。


区别:



  • 读写单位:字节流以字节为单位;字符流以字符为单位,一次可能读多个字节;
  • 处理对象:字节流能处理所有类型的数据(图片、视频等),而字符流只能处理字符类型的数据。


字节流(简单来说可以完整复制歌曲)


FileInputStream(BufferedInputStream)


FileOutputStream(BufferedOutputStream)


 


FileInputStream fis=new FileInputStream("C:\\Users\\86185\\Desktop\\a.mp3");


FileOutputStream fos=new FileOutputStream("b.mp3");


byte q[]=new byte[1024];


int len=0;


 


BufferedInputStream bis =new BufferedInputStream(new FileInputStream("C:\\Users\\86185\\Desktop\\a.mp3"));


FileOutputStream bos=new BufferedOutputStream(new FileOutputStream("s.mp3"));


byte q[]=new byte[1024];


int len=0;


字符流(简单来说可以复制字符串)


FileReader(BufferedReader)


FileWriter(BufferedWrite)


 


FileReader fr=new FileReader("C:/Users/86185/Desktop/屏幕共享 2/00.txt");


FileWriter fw=new FileWriter("2.txt");


int len=0;


char b[]=new char[1024];


 


 


FileReader br=new BufferedReader(new FileReader("C:/Users/86185/Desktop/屏幕共享 2/00.txt"));


FileWriter bw=new BufferedWriter(new FileWriter("9.txt"));


int len=0;


char b[]=new char[1024];


 


 


eg:


public static void main(String[] args) {


FileReader fr=null;


FileWriter fw=null;


try {


fr=new FileReader("C:/Users/86185/Desktop/屏幕共享 2/00.txt");


fw=new FileWriter("2.txt");


int len=0;


char b[]=new char[1024];


 


while ((len=fr.read(b))!=-1) {(如果fr.read()读到了文件最后,会返回一个-1,就表示读到了文件最后了)


fw.write(b, 0, len);


}


} catch (FileNotFoundException e) {


e.printStackTrace();


} catch (IOException e) {


e.printStackTrace();


}


finally{


if (fw!=null) {


try {


fw.close();


} catch (IOException e) {


// TODO Auto-generated catch block


e.printStackTrace();


}


}


if (fr!=null) {


try {


fr.close();


} catch (IOException e) {


e.printStackTrace();


}


}


}


}


 


 


 


 


 


人生永远无法回头,就连这平淡不惊的一幕,终有一日也会碎落满地