会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132482个问题

package com.bjsxt.task;

/** 
 * <p>Title: Node</p>  
 * <p>Description: 自定义节点</p>  
 * @author xiaoding
 * @date Jun 2, 2020  
 * @version 1.0 
 */
public class Node<K,V> {
    K key;        //键
    V value;    //值
    int hash;    //hashCode值
    
    Node<K,V> next;    //节点
    
    //无参构造方法
    public Node() {}
    //有参构造方法
    public Node(K key,V value,int hash,Node<K,V> next) {
        this.key = key;
        this.value = value;
        this.hash = hash;
        this.next = next;
    }
    
    public K getKey() {
        return key;
    }
    public V getValue() {
        return value;
    }
    @Override
    public String toString() {
        return key + "=" + value + "," + next;
    }
    
    
}

package com.bjsxt.task;

import java.util.Arrays;
import java.util.HashMap;

/** 
 * <p>Title: MyHashMap</p>  
 * <p>Description: 自定义HashMap类</p>  
 * @author xiaoding
 * @date Jun 2, 2020  
 * @version 1.0 
 */
public class MyHashMap<K,V> {
    //功能属性
    private Node<K,V>[] table;    //存储数组
    private int size;    //存放节点的个数
    
    //无参构造方法
    public MyHashMap() {
        //默认数组长度
        this.table = new Node[10];
    }
    //有参构造方法
    public MyHashMap(int length) {
        //手动给数组定义长度
        this.table = new Node[length];
    }
    
    //根据键获取值的方法
//    public V get(Object key) {
//        
//    }
    
    //添加方法
    public void put(K key,V value) {
        //计算Hash值
        int num = key.hashCode();
        //创建一个节点对象并赋值
        Node<K, V> newNode = new Node<K,V>(key,value,putV(num),null);
        if (table[newNode.hash] == null) {
            table[newNode.hash] = newNode;
            size++;
        }else if (table[newNode.hash] != null) {
            //创建一个节点指向当前元素
            Node<K, V> i = newNode;
            for (int j = 0;j<size;j++) {
                if (j == i.hash) {
                    boolean flag = table[j].key.equals(i.key);
                    if (flag) {
                        table[j].key = i.key;
                        break;
                    }else {
                        table[j].next = i;
                        break;
                    }
                }
            }
        }
    }
    
    //计算存储位置的方法
    public int putV(int num) {
        return num % 11;
    }
    
    //重写一下HashCode方法
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + size;
        result = prime * result + Arrays.hashCode(table);
        return result;
    }
    
    //重写一下比较方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        MyHashMap other = (MyHashMap) obj;
        if (size != other.size)
            return false;
        if (!Arrays.equals(table, other.table))
            return false;
        return true;
    }
    
    
    @Override
    public String toString() {
        return "" + Arrays.toString(table);
    }
    public static void main(String[] args) {
        MyHashMap<String,Integer> i = new MyHashMap<String, Integer>();
        i.put("java", 123);
        i.put("good", 256);
        i.put("sxt", 2525);
        System.out.println(i);
    }
}

老师我这个相同位置。元素节点好像没有添加进去,还有那个get方法怎么写,我实在是想不出来

运行结果图:

1.png

JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 30046楼
JAVA 全系列/第六阶段:项目管理与SSM框架/RBAC实战 30047楼

<?php
    echo '<pre>';
    require_once '22-1singleton单例创建PDO对象.php'; //引入单例模式的php文件
    $pdo=singletonPDO::getPdo();
    $pdo->exec('set names utf8');

    //增加
    $sql="insert into userinfo values('xiaohei','521123')";  
    //删除
    //$sql="delete  from userinfo where username='leon'";
       //修改
    //$sql="update userinfo set username='fanbingbing',password='888'  where username='xiaohong'";

    if($pdo->exec($sql)){
        echo '操作成功';
    }else{
        echo  '操作失败';
    }
    //查询
    //$sql="select *  from userinfo where 1";

    $result=$pdo->exec($sql);
    var_dump($result);
?>
<?php
    class singletonPDO{
    private  static $pdo=null;
    public static function getPdo(){
        if(self::$pdo==null){  //self访问静态  并判断
            try{
                self::$pdo=new PDO('mysql:host=localhost;dbname=librarydb','root','');
                self::$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
            }catch(PDOException $e){
                echo '连接错误信息为:'.$e->getMessage();
            }
        }
        return self::$pdo;
    }
    }
?>

image.png

老师,我这往进添加的时候,为啥总是两行两行的添加,怎么回事??

WEB前端全系列/第五阶段:前后端交互/PHP、数据库编程与设计 30048楼
JAVA 全系列/第六阶段:项目管理与SSM框架/Maven 30049楼

看完了这节课的视频以后,总结了下面的内容:

这节课的视频与上次课的视频不同的点在

上次课最后实现的多线程是 多个客户端访问一个服务器的情况,为了让服务器处理多个客户端,使用循环开启多个线程,为每一个客户端开启一个线程来处理服务器端接收信息及相应信息的操作。

while(true){

      Socket socket=server.accept();//接受多个客户端的连接

      ServerThread st=new ServerThread(socket);

      new Thread(st).start();

}


这次课的多线程是客户端的多线程,是单个客户端和单个服务器端之间,单个客户端想跟单个服务器端多次聊天,如果是单次聊天,按视频里最开始的写法(没有多线程的),客户端就只能先,通过BufferedReader包装键盘录入发送信息,后获取响应,并且只有一次聊天的机会,socket就结束了。

为了解决这两个问题:

1)客户端想多次聊天

2)客户端能不能不要总是先发送,后接受信息,能主动接受信息吗?

解决:

1) 循环,循环发送信息,循环读取信息,就可以多次聊天了

2)怎么能决定先发送还是先接受,如果写成以前死的代码,就是先发送后接受,想先接受怎么办,多线程,建立一个发送线程,一个接受线程,让2个线程开启,cpu不断的切换2个线程,有内容发送到客户端来,就主动去接受,就可以先接受了。这边键盘录入,用户想发送的时候按下回车,就可以向输入流中写数据,创造输入的字符串,有内容想发送到服务端,就会触发发送线程。


我分析的视频中的代码:

image.png


一个客户端 一个服务端

服务端只接受一次的socket对象,后面的多次聊天都是因为 

客户端一直开启线程,等待用户键盘录入的回车,从而发送数据,

服务器端接收到数据就一直执行while(true),不停的readUTF() 和writeUTF("收到了");


至于我看到有同学问为什么服务器端能一直读取,我想是因为while(true)里面的readUTF()在不停执行,只要在流里读到东西就会读取出来,在流里东西可用,检测到流末尾或者抛出异常前,此方法一直阻塞,等待读取的字符串。这里需要老师验证一下我说的,是不是我分析的这个原因******。


还有一个问题******,就是在客户端线程类:Send类的send方法中写出字符串的时候,为什么要flush一下。

我猜是因为:这里也需要老师解答一下:

1)每次写出之后flush是为了提高效率,如果一直不flush,缓冲区如果满了就会造成缓冲区堵塞

2)视频里的案例没有关闭流,关闭流的操作里会刷新,但是没有关闭流,一直开着,所以在这里刷新一下。

ps:

什么时候字节流需要刷新:

如果你的流入数据不是特别多,可以都操作结束了关流时写入,那么如果你的数据特别多,你把他们全都放到流中就会占用内存吧,如果占用够多就会死机吧?然后结果你明白了!你读取数据失败了!或者説你担心万一死机了数据没有保存不是很坑!所以你可以选择什么时候刷新下

所以当传入的数据特别大,又担心什么时候会突然停止的时候,字节流可以在某些地方刷新一下。

image.png


以上提到的两个地方都需要老师解答一下(带******号的),还有提到的其他地方如果有不太对的地方,也希望老师指导一下,谢谢!

JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 30052楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 30053楼
Python 全系列/第十六阶段:数据结构与算法/算法与数据结构(旧) 30054楼
Python 全系列/第七阶段:网页编程基础/HTML5基础元素 30055楼
Python 全系列/第五阶段:数据库编程/mysql的使用 30056楼
JAVA 全系列/第七阶段:生产环境部署与协同开发/Docker 30057楼
JAVA 全系列/第三阶段:数据库编程/JDBC技术 30060楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637