java基础部分复习笔记


目录

  • 1 输入
  • 2 随机Random
  • 3 Arraylist
  • 4 Linkedlist
  • 5 collections
  • 6 Arrays类
  • 7 String的使用
  • 8 split
  • 9 math类的使用
  • 10 多态
  • 11 访问成员内部类
  • 12 Stringbuilder
  • 13 线程与进程
  • 13 线程安全
  • 1 public synchronized void paytk()
  • 2 synchronized(锁对象)
  • 3 静态的同步方法
  • 4 Lock锁
  • 5 wait和notify
  • 14 Java网络编程


1 输入

Scanner scanner = new Scanner(System.in);
 String a = scanner.next();//从键盘输入数据存储到int a中
 char[] chararray = a.toCharArray();   //传入char数组

2 随机Random

Random random = new Random();
int b = random.nextInt(100)+1;  //取1-100的随机数字

3 Arraylist

部分方法
add 添加
remove 删除
get 获取
clear 清空集合中的所有元素
isEmpty 判断集合时候为空
Object[] xx = x.toArray() 吧集合中的元素,存储到数组中

ArrayList<String> list = new ArrayList<>();
        list.add("123"); //添加
        list.remove(1);  //删除

        for (int i = 0; i < list.size(); i++) { //list.fori 自动添加

        }
        for (int i = 0; i < 6; i++) {            //6.fori 自动添加

        }
        list.get(1);   //显示

4 Linkedlist

部分方法
addFirst(),将制定元素插入到列表开头
addLast() 将制定元素添加到列表的最后 == add()
push() 将元素推入此列表说表示的堆栈==assFirst
removeFirst 删除第一个
removeLast 删除最后一个
pop 删除

5 collections

collections常用功能
addAll() 往集合中添加一些元素
shuffle() 打乱顺序
sort() 默认排序

6 Arrays类

int[] intArray = {10,20,30};
        String intStr = Arrays.toString(intArray);
        System.out.println(intStr);  //吧参数数组变为字符串
    //sort(数组)  数值默认升序,小-大
                //字符串默认字母升序, a-z
        int[] array = {1,43,67,23,54,100,9};
        Arrays.sort(array);
        String s = Arrays.toString(array);
        System.out.println(s);   //数值自动排序

        String[] array2 = {"aaa","bbb","ccc"};
        Arrays.sort(array2);
        String s2 = Arrays.toString(array2);
        System.out.println(s2);   //字符串自动排序

7 String的使用

相关方法的使用

1. substring(3);   //从3开始取后面的字符串
           substring(3,7);
               substring是string的一个方法,格式为:
                public String substring(int beginIndex, int endIndex)
                返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginIndex 处开始,一直到索引 endIndex - 1 处的字符。因此,该子字符串的长度为 endIndex-beginIndex。
                示例: 
                "hamburger".substring(4, 8) returns "urge" "smiles".substring(1, 5) returns "mile"    toCharArray();  
    //将当前字符串拆分为字符数组作为返回值。
           getBytes();    //获得当前字符串底层的字节数组
           replace("do","are");   //将所有出现的老字符串do替换成新字符串are,返回替换后的字符串;
           sb.replace(6,10,"****");  //6-10号的的元素,用****替代
       
        for(int i = 0;i<str1.length();i++)
           {
               if(Character.isDigit(str1.charAt(i)))    //Character.isDigit()判断字符串是否包含数字
               {
                    xxxxxxxxxxxxxx
               }
           }
String c = "123456";
        String d = "7890";
        System.out.println(c.equals(d));  //比较
        String e = c.substring(3);   //从3开始取后面的字符串
        String f = c.substring(3,7);  //3-7输出
        char[] chars = c.toCharArray();   //将当前字符串拆分为字符数组作为返回值。
        byte[] bytes = c.getBytes();    //获得当前字符串底层的字节数组
        String str1 = "how do you do?";
        String g = str1.replace("do","are");   //将所有出现的老字符串do替换成新字符串are,返回e;

8 split

注意事项
按照参数规则,吧字符串划分为若干部分
//split的参数是一个正则表达式,
//如果按照英文句点".“要用”\."

String st3 = "aaa,bbb,ccc,ddd";
String[] array1 = st3.split(",");
for (int i = 0; i < array1.length; i++) {     //array1.length.fori
    System.out.println(array1[i]);              // array1[0]:aaa          array1[1]:bbb    array1[2]:ccc.
}

9 math类的使用

abs取绝对值
ceil 向上取整
floor 向下取整
round 四舍五入

double fl = Math.abs(-3.14); //3.14
        double fl2 = Math.ceil(3.14); //4
        double fl3 = Math.floor(3.14); //3
        double fl4 = Math.round(3.4); //3

10 多态

成员方法:编译看左边,运行看右边
成员变量:编译看左边,运行看左边

11 访问成员内部类

访问成员内部类:外部类.内部类 名称 = new 外部类().new 内部类()
如果出现了重名现象,那么格式是:外部类名称.this.外部类成员变量名
局部内部类:要是用局部变量,局部变量必须是final,不可改变。
匿名内部类:
类名或接口名 名称 = new 类名或接口名(){
重写方法;
}; //注意分号
//以上就是内部类的格式,其实这整体就相当于是new出来的一个对象
举例:

// 有名称th的类,可以使用多次里面定义的方法
          Thread th = new Thread(){
             public void run(){
                 System.out.println(getName());
             }
         };
        //没有对象名称的内部类,只能使用一次方法。
         new Thread(){
             public void run(){
                 System.out.println(getName());
             }
         }.run();

12 Stringbuilder

Stringbuilder //可以添加修改字符串
举例:

StringBuilder sb = new StringBuilder("111");
        sb.append("222");
        sb.append("333")
        System.out.println(append);
        //111222333

13 线程与进程

一个程序运行后至少有一个进程,一个进程中可以包含多个线程

进程:进入内存运行的程序
 
 线程:几个线程就可以同时执行几个任务
      一个进程中的功能,xx,xx,xx,就会开启一条应用程序到cpu的执行路径
      cup就可以通过这个路径执行功能,这个路径就是线程
      是进程中的一个执行单元
      线程多的好处:效率高,线程之间互不影响。
构造方法:
        public Thread()://分配一个新的线程对象。
        public Thread(String name)://分配一个指定名字的新的线程对象。
        public Thread(Runnable target)://分配一个带有指定目标新的线程对象。
        //常用方法:
        public String getName()://获取当前线程名称。
        public void start()://导致此线程开始执行; Java虚拟机调用此线程的run方法。
        public void run()://此线程要执行的任务在此处定义代码。
        public static Thread currentThread()://返回对当前正在执行的线程对象的引用。
        public Thread(Runnable target,String name) ://分配一个带有指定目标新的线程对象并指定名字。
        public static void sleep(long millis) ://使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行)。
实现步骤:1
    1.创建一个Thread类的子类
    2.在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么?)
    3.创建Thread类的子类对象
    4.调用Thread类中的方法start方法,开启新的线程,执行run方法
    void start()使该线程开始执行;Java虚拟机调用该线程的run方法。
    多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
    java程序属于抢占式调度,那个线程的优先级高,那个线程优先执行;同一个优先级,随机选择一个执行
    结果是两个线程并发地运行﹔当前线程(main线程)和另一个线程《创建的新线程,执行其run方法)

  实现步骤2
    实现Runnable接口
    java.Lang.Runnable
    Runnable接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法。
    java.Lang.Thread类的柯造方法
    Thread (Runnable target)分配新的Thread对象。
    Thread ( Runnable target,string name)分配新的 Thread 对象。
    实现步骤:
    1.创建一个Runnable接口的实现类l
    2.在实现类中重写RunnabLe接口的run方法,设置线程任务
    3.创建一个RunnabLe接口的实现类对象
    4.创建Thread类对象,构造方法中传递RunnabLe接口的实现类对象
    5.调用Thread类中的start方法,开启新的线程执行run方法

 例如:
public class ThreadRunnable implements Runnable {
            @Override
            public void run() {
                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName());
                }

            }
        }
        public class Runnableimpl {
            public static void main(String[] args) {
                ThreadRunnable tb = new ThreadRunnable();
                Thread t = new Thread(tb);
                t.start();

                for (int i = 0; i < 20; i++) {
                    System.out.println(Thread.currentThread().getName());
                }
            }
        }

获取线程的名称:
1.使用Thread类中的方法getName()
String getName(返回该线程的名称。
2.可以先获取到当前正在执行的线程,使用线程中的方法getName()获取线程的名称
static Thread currentThread()返回对当前正在执行的线程对象的引用。

public class MyThread extends Thread{
            @Override
            public void run() {
            //主线程也可用
            System.out.println(Thread.currentThread().getName());
            }
        }

匿名内部类实现线程创建

1     new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < 3; i++) {
                    System.out.println("bbb");
                }
            }
        }.start();

   2     new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 3; i++) {
                    System.out.println("卢本伟");
                }
            }
        }){

        }.start();

但是单纯的调用多线程会出现问题,例如,买票系统中3个窗口可能会同时出售一张票的可能,为了避免这个现象,可以使用互斥锁

13 线程安全

1 public synchronized void paytk()

解决线程安全问题的一种方案:使用同步代码块
格式:
synchronized(锁对象)
可能会出现线程安全向题的代码(访问了共享数据的代码)
)
注意:
1.通过代码块中的锁对象,可以使用任意的对象
2.但是必须保证多个线程使用的锁对象是同一个
3.锁对象作用:
把同步代码块锁住,只让一个线程在同步代码块中执行

2 synchronized(锁对象)

解决线程安全问题的一种方案:
使用同步代码块
格式:
synchronized(锁对象){
可能会出现线程安全问题的代码(访问了共享数据的代码)
}
注意:
1.通过代码块中的锁对象,可以使用任意的对象
2.但是必须保证多个线程使用的锁对象是同一个
3.锁对象作用:
把同步代码块锁住,只让一个线程在同步代码块中执行

//第一种
public class Runnableimpl implements Runnable{
            //定义一个多线程的共享票源
            private int ticket = 100;

            //创建锁对象
            Object obj = new Object();

            //设置买票任务
            @Override
            public void run() {
                while(true){
                    //同步代码块
                    paytk();
                }
            }
            //同步方法
            public synchronized void paytk(){
                if (ticket>0){
                    //为了程序安全,设置sleep
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
                    ticket--;
                }
            }

        }
第二种
  public class Runnableimpl implements Runnable{
            //定义一个多线程的共享票源
            private int ticket = 100;

            //创建锁对象
            Object obj = new Object();

            //设置买票任务
            @Override
            public void run() {
                while(true){
                    //同步代码块
                    paytk();
                }
            }
            //同步方法
            public void paytk(){
                synchronized (this){
                    if (ticket>0){
                        //为了程序安全,设置sleep
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
                        ticket--;
                    }
                }
            }
        }

3 静态的同步方法

锁对象是谁?
不能是this
this是创建对象之后产生的静态方法优先于对象
静态方法的锁对象是本类的cLass属性-->cLass文件对象(反射)
public class Runnableimpl implements Runnable{
            //定义一个多线程的共享票源
            静态变量
            private static int ticket = 100;

            //创建锁对象
            Object obj = new Object();

            //设置买票任务
            @Override
            public void run() {
                while(true){
                    //同步代码块
                    paytk();
                }
            }
            //静态同步方法
            public static synchronized void paytk(){
                    if (ticket>0){
                        //为了程序安全,设置sleep
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
                        ticket--;
                    }
            }
        }

4 Lock锁

解决线程安全问题的三种方案:使用Lock锁
java.utiL.concurrent.Locks.Lock接口
lock实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作。
lock接口中的方法:
void lock()获取锁。
void unlock(释放锁。
java.util.concurrent.Locks.ReentrantLock impLements Lock接口
使用步骤:
1.在成员位置创建一个ReentrantLock对象
2.在可能会出现安全问题的代码前调用Lock接口中的方法Lock获取锁
3.在可能会出现安全问题的代码后调用Lock接口中的方法Lock获取锁

public class Runnableimpl implements Runnable{
            //定义一个多线程的共享票源
            private static int ticket = 100;
            //在成员位置创建一个ReentrantLock对象
            Lock l = new ReentrantLock();

            //设置买票任务
            @Override
            public void run() {
                while(true){
                    //开启lock锁
                    l.lock();
                    //同步代码块
                    if (ticket>0){
                        //为了程序安全,设置sleep
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+"正在卖第"+ticket+"张票");
                        ticket--;
                    }
                    //关闭lock锁
                    l.unlock();
                }
            }
        }

进入到Timewaiting(计时等待)有两种方式

1.使用sleep(Long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/8Locked状态
⒉.使用wait(Long m)方法, wait方法如果在毫秒值结束之后,还没有被not ify唤醒,就会自动醒来,线程睡醒进入到RunnabLe/BLocked状态

5 wait和notify

①wait() 与 notify/notifyAll 方法必须在同步代码块中使用

②wait() 与 notify/notifyAll() 的执行过程

③中断 调用wait()方法进入等待队列的 线程

④notify 通知的顺序不能错

⑤多线程中测试某个条件的变化用 if 还是用 while?

wait() 与 notify/notifyAll 方法必须在同步代码块中使用

wait() 与 notify/notifyAll() 是Object类的方法,在执行两个方法时,要先获得锁。那么怎么获得锁呢?

在这篇:链接: JAVA多线程之Synchronized关键字–对象锁的特点.****文章中介绍了使用synchronized关键字获得锁。因此,wait()
与 notify/notifyAll()
经常与synchronized搭配使用,即在synchronized修饰的同步代码块或方法里面调用wait() 与
notify/notifyAll()方法。

例如: wait暂定线程后会释放cpu资源,等待下一个线程执行,
notify方法,会开启暂定的wait线程

14 Java网络编程

java语言通过URl类来访问网络上的资源
创建url对象的构造方法:

1

1

跟新……