1.冒泡排序

//每一次循环都把最大的数直接固定在最后一位,相邻的对比大的交换到后面

public static int[] bubbleSort ( int[] array ){

//外循环控制循环次数,

  1. public static int[] bubbleSort(int[] array) {
  2. for (int i = 0; i < array.length - 1; i++) {
  3. //-1 角标建议防止越界
  4. for (int j = 0; j < array.length - 1 - i; j++) {
  5. if (array[j] > array[j + 1]) {
  6. int max = array[j];
  7. array[j] = array[j + 1];
  8. array[j + 1] = max;
  9. }
  10. }
  11. }
  12. return array;
  13. }

2.对象创造

  1. public class Demo {
  2. public static void main(String[] args) {
  3. Demo d = new Demo();
  4. d.first();
  5. }
  6. public void first() {
  7. int i = 5;
  8. value v = new value();
  9. v.i = 25;
  10. second(v, i);
  11. System.out.println(v.i);
  12. }
  13. public void second(value v, int i) {
  14. i = 0;
  15. v.i = 20;
  16. value val = new value();
  17. v = val;
  18. System.out.println(v.i + " " + i);
  19. }
  20. }
  21. class value {
  22. int i = 15;
  23. }

结果:15 0
20
image.png


3.switch 语句;

  1. 在switch只认break,以及return 以及switch的结束分号,要不然仍然继续执行.
  2. 当case条件满足时: 没有发现break,会从当前case ,后面所有的case值都会输出 ,直到找到break, 没有的话就执行到switch结束的结束分号}
  3. default放在末尾只会case条件不符合,或者case语句没有找到break才会执行.
  4. default放在中间只有没有符合条件case的才会执行,有的话就不会执行了,如果他也没有break,就会和2一样,继续执行.
  1. int a = 5;
  2. switch (a) {
  3. case 1:
  4. System.out.println(1);
  5. default:
  6. System.out.println("default");
  7. case 2:
  8. System.out.println(2);
  9. case 3:
  10. System.out.println(3);
  11. case 4:
  12. System.out.println(4);
  13. }
  14. //输出:default 2 3 4
  15. int a = 3;
  16. switch (a) {
  17. case 1:
  18. System.out.println(1);
  19. default:
  20. System.out.println("default");
  21. case 2:
  22. System.out.println(2);
  23. case 3:
  24. System.out.println(3);
  25. case 4:
  26. System.out.println(4);
  27. }
  28. // 输出:3 4

4.equals和” == “的区别,以及创造String对象的对比

==
可以使用在基本类型和引用数据之间
基本数据类型就是比较两个变量保存的数据是否相等.(类型可以不相同)
引用类型就是比较两个对象的地址值是否相等,指向同一个对象实体

equals只能用于引用类型
object的equals的比较也是地址值与==相同;
有类重写方法所以可以比较内容

注意String str3 = new String(“abcd”)的实现过程直接在堆中创建对象,堆中指向常量值,常量池没有就创建一个.
String str1 = “abcd”的实现过程:首先栈区创建str引用,然后在String池(独立于栈和堆而存在,存储不可变量)中寻找其指向的内容为”abcd”的对象,如果String池中没有,则创建一个,然后str指向String池中的对象,如果有,则直接将str1指向”abcd””;

  1. String str1 = "abcd" ;
  2. String str2="abcd" ;
  3. str1 == str2 (true) ;
  4. String str1 = new String("abcd");
  5. String str2 = new String("abcd")
  6. str1.equals(str2) true //String 重写了equals方法
  7. str1== str2(false) //str1和str2都是装的堆当中的地址值
  8. String s1 = "aaa";
  9. String s2 = "bbb";
  10. String s3 = "aaabbb";
  11. String s4 = "aaa"+"bbb"; s3==s4 (true)
  12. String s5 = s1+"bbb"; s3==s5 (false)
  13. String s6 = "aaa"+s1; s3 =s6 (false)
  14. String s7 = s1+s2 ; s1==s7(false)
  15. final Strting s9 = s1+"bbb";
  16. (s3==s9) true, (fianl就是常量)
  17. s7 == s6(false)
  18. String s8 = s5.intern(); s8==s3(true)
  • 常量与常量,结果都在常量池,常量池不会存在相同的常量
    * 只要有一个变量,结果就在队中
    intern(); 对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

5.自动装箱的问题

  1. Object o = true ; ? new Integer(1) : new Double(2.0);
  2. System.out.println(ol)
  3. 结果1.0
  4. Integer i = new Integer(1) ;
  5. Integer j = new Integer(1);
  6. System,out.println( i==j ) //false

Integer内部定义了IntegerCache结构integer[],保存了-128~127范围内,使用自动装箱,可以直接使用数组中的元素,不用再去new.

  1. Integer m = 1 ;
  2. Integer n = 1 ;
  3. System.out.println( m==n ) ; //true
  4. Integer x = 128 ;
  5. Integer y =128 ;
  6. System.out.println(x==y) ; //false ;
  7. double f = 1.2;
  8. Double z = 1.2 ;
  9. System.out.println(f==z); //true

6.重写equals案例

  1. class test {
  2. int x;
  3. String y;
  4. public test(int x, String y) {
  5. this.x = x;
  6. this.y = y;
  7. }
  8. @Override
  9. public boolean equals(Object obj) {
  10. if (this == obj) {
  11. return true;
  12. }
  13. if (obj instanceof test) {
  14. test t = (test) obj;
  15. if (this.x == t.x && this.y.equals(t.y)) {
  16. return true;
  17. }
  18. return false;
  19. }
  20. return false;
  21. }
  22. }

7.代码块和一些静态代码块的执行

  1. public class Demo {
  2. @Test
  3. public void show() {
  4. new Leaf();
  5. }
  6. }
  7. class Root {
  8. static {
  9. System.out.println("Rooot静态代码块");
  10. }
  11. {
  12. System.out.println("Root普通代码块");
  13. }
  14. public Root() {
  15. System.out.println("Root的无参构造器");
  16. }
  17. }
  18. class Mid extends Root {
  19. static {
  20. System.out.println("Mid静态代码块");
  21. }
  22. {
  23. System.out.println("Mid普通代码块");
  24. }
  25. public Mid() {
  26. System.out.println("Mid的无参构造器");
  27. }
  28. public Mid(String msg) {
  29. System.out.println("Mid的带参构造器" + msg);
  30. }
  31. }
  32. class Leaf extends Mid {
  33. static {
  34. System.out.println("Leaf静态代码块");
  35. }
  36. {
  37. System.out.println("Leaf普通代码块");
  38. }
  39. public Leaf() {
  40. super("666");
  41. System.out.println("Leaf的带参构造器");
  42. }
  43. }

输出结果
Rooot静态代码块
Mid静态代码块
Leaf静态代码块
Root普通代码块
Root的无参构造器
Mid普通代码块
Mid的带参构造器666
Leaf普通代码块
Leaf的带参构造器

8.Java静态代码块、构造代码块、构造方法的执行顺序

静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存。所以静态的会优先非静态的。
执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步:
1,super语句,可能出现以下三种情况:
1)构造方法体的第一行是this语句,则不会执行隐式三步,
2)构造方法体的第一行是super语句,则调用相应的父类的构造方法,
3)构造方法体的第一行既不是this语句也不是super语句,则隐式调用super(),即其父类的默认构造方法,这也是为什么一个父类通常要提供默认构造方法的原因;
2,初始化非静态变量;
3,构造代码块。
由此可知,构造代码块优先于构造方法的方法体,但是this关键字跟super关键字不能同时出现,而且只能在代码的第一行。如果出现了this关键字,隐式三步就不会执行。
例如,分析下面的代码及执行结果,已经用注释标出了执行步骤Step 1–Step 7。
// 重点 也就是说,当递归调用多个构造方法的时候,构造代码块只会在最后的(也即方法体第一行不是this语句的)那个构造方法执行之前执行!

  1. public class Test {
  2. public static int a = 0;
  3. static {
  4. // Step 1
  5. a = 10;
  6. System.out.println("静态代码块在执行a=" + a);
  7. }
  8. {
  9. // Step 4
  10. a = 8;
  11. System.out.println("非静态代码块(构造代码块)在执行a=" + a);
  12. }
  13. public Test() {
  14. this("调用带参构造方法1,a=" + a);// Step 2
  15. System.out.println("无参构造方法在执行a=" + a);// Step 7
  16. }
  17. public Test(String n) {
  18. this(n, "调用带参构造方法2,a=" + a); // Step 3
  19. System.out.println("带参构造方法1在执行a=" + a);// Step 6
  20. }
  21. public Test(String s1, String s2) {
  22. System.out.println(s1 + ";" + s2); // Step 5
  23. }
  24. public static void main(String[] args) {
  25. Test t = null;
  26. System.out.println("下面new一个Test实例:");
  27. t = new Test();
  28. }
  29. }

执行结果:
静态代码块在执行a=10
下面new一个Test实例:
非静态代码块(构造代码块)在执行a=8
调用带参构造方法1,a=10;调用带参构造方法2,a=10
带参构造方法1在执行a=8

9.接口

  1. interface A {
  2. int x = 0;
  3. }
  4. class B {
  5. int x = 1;
  6. }
  7. class C extends B implements A {
  8. public void show() {
  9. System.out.println(x); //编译不通过x不明确 System.out.println(super.x)
  10. // 输出1
  11. System.out.println(A.x);
  12. //输出0
  13. }
  14. public static void main(String[] args) {
  15. new c().show();
  16. }
  17. }

10.线程安全的案例

继承Thread类的安全问题解决方案

  1. import java.util.ArrayList;
  2. import java.util.concurrent.locks.ReentrantLock;
  3. package com.adong.java;
  4. public class Demo01 {
  5. public static void main(String[] args) {
  6. MyThread t1 = new MyThread();
  7. MyThread t2 = new MyThread();
  8. MyThread t3 = new MyThread();
  9. t1.start();
  10. t2.start();
  11. t3.start();
  12. }
  13. }
  14. //方法一
  15. class MyThread extends Thread {
  16. private static int ticket = 100;
  17. @Override
  18. public void run() {
  19. while (true) {
  20. synchronized (MyThread.class) { //方法一
  21. if (ticket > 0) {
  22. System.out.println(Thread.currentThread().getName() + " : " + ticket);
  23. ticket--;
  24. } else {
  25. break;
  26. }
  27. }
  28. }
  29. }
  30. }
  31. //方法二
  32. class MyThread extends Thread {
  33. private static int ticket = 100;
  34. @Override
  35. public void run() {
  36. while (true) {
  37. show();
  38. }
  39. }
  40. public static synchronized void show() {
  41. //监视器:MyThread.class
  42. if (ticket > 0) {
  43. System.out.println(Thread.currentThread().getName() + " : " + ticket);
  44. ticket--;
  45. }
  46. }
  47. }
  48. // 实现Runnable的线程安全的解决方案
  49. public class Demo01 {
  50. public static void main(String[] args) {
  51. Mythread t = new Mythread();
  52. Thread t1 = new Thread(t);
  53. Thread t2 = new Thread(t);
  54. Thread t3 = new Thread(t);
  55. t1.start();
  56. t2.start();
  57. t3.start();
  58. }
  59. }
  60. //方法一
  61. class Mythread implements Runnable {
  62. private int ticket = 100;
  63. @Override
  64. public void run() {
  65. while (true) {
  66. synchronized (this) {
  67. //方法一
  68. if (ticket > 0) {
  69. System.out.println(Thread.currentThread().getName() + " : " + ticket);
  70. ticket--;
  71. } else {
  72. break;
  73. }
  74. }
  75. }
  76. }
  77. } //方法二
  78. class Mythread implements Runnable {
  79. private int ticket = 100;
  80. @Override
  81. public void run() {
  82. while (true) (show();
  83. }
  84. private synchronized void show() {
  85. //方法二监视器就是this
  86. if (ticket > 0) {
  87. System.out.println(Thread.currentThread().getName() + " : " + ticket);
  88. ticket--;
  89. }
  90. }
  91. } //方法三
  92. class Mythread implements Runnable {
  93. private int ticket = 100;
  94. private ReentrantLock lock = new ReentrantLock();
  95. @Override
  96. public void run() {
  97. while (true) {
  98. try {
  99. lock.lock();
  100. //加上锁
  101. if (ticket > 0) {
  102. System.out.println(Thread.currentThread().getName() + " : " + ticket);
  103. ticket--;
  104. } else {
  105. break;
  106. }
  107. } finally {
  108. lock.unlock(); //解锁
  109. }
  110. }
  111. }
  112. }
  113. //方法内部类常见方法
  114. public class Demo {
  115. public Comparable getComparable1() {
  116. // 方法一
  117. class MyComparable1 implements Comparable {
  118. @Override
  119. public int compareTo(Object o) {
  120. return 0;
  121. }
  122. }
  123. return new MyComparable1();
  124. }
  125. public Comparable getComparable2() {
  126. // 方法二
  127. return new Comparable() {
  128. @Override
  129. public int compareTo(Object o) {
  130. return 0;
  131. }
  132. };
  133. }
  134. }

12.死锁案例

public class deadlockDemo {
    public static Object object1 = new Object();
    public static Object object2 = new Object();

    public static void main(String[] args) {
        look1 l1 = new look1();
        look2 l2 = new look2();
        Thread t1 = new Thread(l1);
        Thread t2 = new Thread(l2);
        t1.start();
        t2.start();
    }
}

class look1 implements Runnable {
    @Override
    public void run() {
        System.out.println("look1 run");
        while (true) {
            synchronized (deadlockDemo.object1) { //拥有object1这个锁           
                System.out.println("look1 have object1");
                try {
                    Thread.sleep(100); //睡眠让look2有机会执行并让他获得object2锁     
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }                 //此时需要object2锁,才能继续执行,因为object1还没有被look1释放,而look2拥有object2,需要object1才能释放object2          
                synchronized (deadlockDemo.object2) {
                    System.out.println("look1 have object2");
                }
            }
        }
    }
}

class look2 implements Runnable {
    @Override
    public void run() {
        System.out.println("look2 run");
        synchronized (deadlockDemo.object2) {
            System.out.println("look2 have object2");
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (deadlockDemo.object1) {
                System.out.println("look2 have object1");
            }
        }
    }
}

13.线程通信的案例

不断输入.等待输出了,才会在去输出

public class Demo01 {
    public static void main(String[] args) {
        person p = new person();
        Input input = new Input(p);
        Output output = new Output(p);
        Thread t1 = new Thread(input);
        Thread t2 = new Thread(output);
        t1.start();
        t2.start();
    }
}
class person {
    private String name;
    private String gender;
    boolean flag;
    //设置同步方法,让输入和输出只能有一个方法执行
    public synchronized void set(String name, String gender) {
        //判断是否有值,有值就为true,就让他等待
        if (flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //没值就执行下面的代码赋值,并去激活输出线程
        this.name = name;
        this.gender = gender;
        flag = true;
        notify();
    }
    public synchronized void get() {
        //为!flag表示为true是就去执行下面语句并去唤醒输入线程,false就等待输入线程传值
        if (!flag) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println(name + ":" + gender);
        flag = false; //
        notify(); //激活输入线程
    }
}
class Input implements Runnable {
    private person p;
    public Input(person p) {
        this.p = p;
    }
    @Override
    public void run() {
        int x = 0;
        while (true) {
            if (x == 0) {
                p.set("kkkk", "男男");
            } else {
                p.set("TTTT", "女女");
            }
            x = (x + 1) % 2;
        }
    }
}
class Output implements Runnable {
    private person p;
    public Output(person p) {
        this.p = p;
    }
    @Override
    public void run() {
        while (true) {
            p.get();
        }
    }
}

运行:
kkkk:男男
TTTT:女女
kkkk:男男
TTTT:女女
…省略

13.消费者和生产者

14.你真的懂i++和++i 吗

int i = 0;
i = i++;
System.out.println("i = " + i); //0

示例2
int a = 2;
int b = (3 * a++) + a;
System.out.println(b);  //9
示例3
int a = 2;
int b = a + (3 * a++);
System.out.println(b); // 8
示例4
int i = 1;
int j = 1;
int k = i++ + ++i + ++j + j++;
System.out.println(k); // 8
示例5
int a = 0;
int b = 0;
a = a++; 
b = a++;
System.out.println("a = " + a + ", b = " + b); // a=1 , b = 0 ;

你始终记住一点就是
int temp = i;
i = i + 1;
return temp; 这3句代码就是上面所说的那样:i++是先自增,然后才返回自增之前的值。
++i 即前加加,原理是:先自增,然后返回自增后的值
i++ 即后加加,原理是:先自增,然后返回自增之前的值
https://blog.csdn.net/android_cai_niao/article/details/106027313

15:这就是set



public class CollectionDemo {
    @Test
    public void show() {
        Person p1 = new Person("aaa", "11");
        Person p2 = new Person("bbb", "20");
        Set set = new HashSet();
        set.add(p1);
        set.add(p2);
        System.out.println(set.toString());//[Person{name='aaa', age='11'}, Person{name='bbb', age='20'}]
        p1.name = "xxx";//值虽然改了,但是还是把他存在"aaa","11"所计算的hashcode的位置
        set.remove(p1);//删除hashcode为"xxx","11"对象;此时p1以前hashcode为"aaa","111";所以没有找到.
        System.out.println(set.toString());//[Person{name='xxx', age='11'}, Person{name='bbb', age='20'}]
        set.add(new Person("xxx", "11"));//添加到"xxx","11'的位置
        System.out.println(set.toString());//[Person{name='xxx', age='11'}, Person{name='xxx', age='11'}, Person{name='bbb', age='20'}]
        set.add(new Person("aaa", "11"));//p1存放的时"aaa","11"哈希值存放位置,所以判断他们相等,比较equals是p1已经是"xxx","11",他们不相等,所以也添加成功,通过链表存储时p1指向新的
        System.out.println(set.toString());//[Person{name='xxx', age='11'}, Person{name='xxx', age='11'}, Person{name='bbb', age='20'}, Person{name='aaa', age='11'}]
    }
}

class Person {
    String name;
    String age;

    public Person() {
    }

    public Person(String name, String age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        if (name != null ? !name.equals(person.name) : person.name != null) return false;
        return age != null ? age.equals(person.age) : person.age == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + (age != null ? age.hashCode() : 0);
        return result;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}

16.tcp连接例题

importorg.junit.Test;

importjava.io.ByteArrayOutputStream;
importjava.io.IOException;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.net.InetAddress;
importjava.net.ServerSocket;
importjava.net.Socket;
/**
*@authoradong
*/
public classTcpTest {
//客户端
@Test
public voidclient() {
Socket socket =null;
OutputStream is =null;
try{
//指明服务器端的ip
InetAddress inet = InetAddress.getByName(“192.168.3.11”);
//创建socket对象,指定端口号
socket =newSocket(inet,8899);
//获取输出流,输出数据
is = socket.getOutputStream();
//写入数据
is.write(“小白船”.getBytes());
}catch(IOException e) {
e.printStackTrace();
}finally{
//资源关闭
if(is !=null) {
try{
is.close();
}catch(IOException e) {
e.printStackTrace();
}
}
if(socket !=null) {
try{
socket.close();
}catch(IOException e) {
e.printStackTrace();
}
}

        }<br />    }

//服务端<br />    @Test<br />    public voidserver() {<br />        ServerSocket ss =null;<br />        Socket socket =null;<br />        InputStream inputStream =null;<br />        ByteArrayOutputStream bois =null;<br />        try{<br />            //创建severSocket对象,指明端口号<br />            ss =newServerSocket(8899);<br />            //调用accept()接收客户端的Socket<br />            socket = ss.accept();<br />            //获取输入流,读取socket中的数据<br />            inputStream = socket.getInputStream();<br />            //读取输入流中的数据<br />            bois =newByteArrayOutputStream();<br />            byte[] bytes =new byte[10];<br />            intlen;<br />            while((len = inputStream.read(bytes)) != -1) {<br />                bois.write(bytes,0,len);<br />            }<br />            System._out_.println(bois.toString());<br />        }catch(IOException e) {<br />            e.printStackTrace();<br />        }finally{<br />            //关闭资源<br />            if(bois !=null) {<br />                try{<br />                    bois.close();<br />                }catch(IOException e) {<br />                    e.printStackTrace();<br />                }<br />            }<br />            if(inputStream !=null) {<br />                try{<br />                    inputStream.close();<br />                }catch(IOException e) {<br />                    e.printStackTrace();<br />                }<br />            }<br />            if(socket !=null) {<br />                try{<br />                    socket.close();<br />                }catch(IOException e) {<br />                    e.printStackTrace();<br />                }<br />            }<br />            if(ss !=null) {<br />                try{<br />                    ss.close();<br />                }catch(IOException e) {<br />                    e.printStackTrace();<br />                }<br />            }<br />       }<br />    }<br />}

17.UDPD的例题

public class UDPTest {
    //发送端
    @Test
    public void sender() throws IOException {
        //建立udp的socket服务
        DatagramSocket socket = new DatagramSocket();
        //发送的内容        
        String str = "我是UDP方式发送的导弹";
        byte[] data = str.getBytes();
        InetAddress inet = InetAddress.getLocalHost();
        //将要发送的数据封装到数据包中 
        DatagramPacket packet = new DatagramPacket(data, 0, data.length, inet, 9090);
        //通过udp的socket服务将数据包发送出去      
        socket.send(packet);
        // 关闭服务      
        socket.close();
    }

    //接收端
    @Test
    public void receiver() throws IOException {
        //建立udp socket服务 
        DatagramSocket socket = new DatagramSocket(9090);
        byte[] buffer = new byte[100];
        // 创建数据包,用于存储接受到的数据.方便数据包对对象的方法解析这些数据   
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
        // 使用socket服务的receive方法去接收数据存储到数据包中      
        socket.receive(packet);
        System.out.println(new String(packet.getData(), 0, packet.getLength()));
        // 关闭资源         
        socket.close();
        // 
    }
}

URL练习(下载图片)

public class URLTest1 {
    public static void main(String[] args) {
        HttpURLConnection urlConnection = null;
        InputStream is = null;
        FileOutputStream fos = null;
        try {
            URL url = new URL("http://localhost:8080/examples/beauty.jpg");
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.connect();
            is = urlConnection.getInputStream();
            fos = new FileOutputStream("day10\\beauty3.jpg");
            byte[] buffer = new byte[1024];
            int len;
            while ((len = is.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
            }
            System.out.println("下载完成");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (urlConnection != null) {
                urlConnection.disconnect();
            }
        }
    }
}