视频10:25处讲到了"int newCapacity = oldCapacity + (oldCapacity >> 1);"这一行代码。
视频中说newCapacity为10,为什么?是不是为0?我没有看懂,希望老师解答一下。
还有能再讲讲这一行代码的含义以及作用吗?
老师在自定义异常那节课上,我看老师教材上有讲到自定义类应包含2个构造器,但我看到高淇老师后来举得例子中并没有用到这个知识点呀,构造器并没有出现在老师后来举的例子之中呀
老师好,请看一下,
异常名称:Exception in thread "main" java.net.SocketException: Connection reset
想要知道怎么避免,怎么操作,请演示一下
已通过防火墙
客户端:
package cn.sxt.entity; import java.io.DataInputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.net.Socket; import java.util.Scanner; public class Client2 { public static void main(String[] args) throws IOException { //1创建socket对象,用于连接服务器 Socket client = new Socket("localhost", 9999); //2获取输出流(对象流) ObjectOutputStream oos = new ObjectOutputStream(client.getOutputStream()); //3创建user对象 //获取user对象的方法 User2 user = getUser();//new User2("sxt", "sxt"); //4user对象发送到服务器 oos.writeObject(user);//发生了向上转型 //5获取输入流(数据流) DataInputStream dis = new DataInputStream(client.getInputStream()); System.out.println(dis.readUTF()); //6关闭流 if (dis!=null) { dis.close(); } if (oos!=null) { oos.close(); } if (client!=null) { client.close(); } } public static User2 getUser() {//获取对象的方法 Scanner sc = new Scanner(System.in); System.out.println("请输入账户名"); String userName = sc.next(); System.out.println("请输入密码"); String passWord = sc.next(); return new User2(userName, passWord); } }
服务器端:
package cn.sxt.server; import java.io.DataOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.net.ServerSocket; import java.net.Socket; import cn.sxt.entity.User2; public class Server2 { public static void main(String[] args) throws IOException, ClassNotFoundException { System.out.println("----------服务器端已启动---------"); //1.创建ServerSocket对象 ServerSocket server = new ServerSocket(9999); Socket client = server.accept(); //2.创建输入流--->ObjectInputStream ObjectInputStream ois = new ObjectInputStream(client.getInputStream()); User2 user = (User2)ois.readObject();//向下转型 System.out.println(client.getInetAddress().getHostAddress()+"请求登录:用户名:"+user.getUserName()+"\t密码:"+user.getPassWord()); //3.对用户名和密码进行验证 String str = ""; if ("sxt".equals(user.getUserName())&&"sxt".equals(user.getPassWord())) { str = "登录成功"; }else { str = "对不起,用户名或密码错误"; } //4.获取输出流(数据流) DataOutputStream dos = new DataOutputStream(client.getOutputStream()); dos.writeUTF(str); //5.关闭流 if (dos!=null) { dos.close(); } if (ois!=null) { ois.close(); } if (client!=null) { client.close(); } } }
运行效果:
这里的index能换成size?
如果把这里的index-1看成index如果一共有4个节点那么尾结点的index就是3,这里i<3,那么也遍历不出尾结点的地址啊,这里遍历到第三个节点的地址
有一个有点奇怪的问题,我已经加add方法了,为什么我这边调用仍然不让我调用add方法,自动校正一直让我重新加一个private void add, 我前面写的那个
public void add(E element){
不知道为什么没有生效,完整code我附下面
package com.bjsxt; public class BinaryTreeSort<E extends Integer> { class Node<E extends Integer>{ private E item; private Node left; private Node right; Node(E item){ this.item = item; } public void addNode(Node node){ if(node.item.intValue() < this.item.intValue()){ if(this.left == null){ this.left = node; }else{ this.left.addNode(node); }else{ if(this.right == null){ this.right = node; }else{ this.right.addNode(node); } } } } public void inorderTranversal(){ if(this.left != null)this.left.inorderTranversal(); System.out.println(this.item); if(this.right != null)this.right.inorderTranversal(); } private Node root; public void add(E element){ Node<E> node = new Node<>(element); if(this.root == null) this.root = node; else this.root.addNode(node); } public void sort(){ if(this.root == null)return; this.root.inorderTranversal(); } public static void main(String[] args) { BinaryTreeSort<Integer> sort = new BinaryTreeSort<>(); sort.add(); } }
package com.dataStructure; /** * 自定义基于单向链表实现存储数据的容器 */ public class MySinglyLinkedList<E> implements MyList<E>{ private myNode head; private int size; /** * 创建一个单线链表中用于存储数据的节点类 * @param <E> */ class myNode<E>{ private E item; private myNode next ; public myNode(E item, myNode next) { this.item = item; this.next = next; } } private myNode<E> getTail (){ myNode h = this.head; if(this.head == null){ return null; } while (true){ if(head.next == null){ break; }else { h = h.next; } }return h; } /** * 根据下标获取节点的方法 */ private myNode getNode(int index){ myNode n = head; for (int i = 0 ; i < index; i++){ n = n.next; } return n; } /** * 校验下标合法性的方法 */ private void CheckIndex (int index){ if(this.head == null||index>=size||index<0){ throw new IndexOutOfBoundsException(); } } @Override /** * 添加元素的方法 */ public void add(Object element) { myNode node = new myNode<>(element,null); myNode tail = getTail(); if(tail == null){ this.head = node; }else { tail.next = node; } this.size++; } @Override /** * 删除元素的方法 */ public E remove(int index) { CheckIndex(index); myNode node = getNode(index); E item = (E)node.item; //找到后把这个元素的前一个的next挂到此元素后一个 if(node == this.head){//判断此节点是否是头结点 this.head = node.next; }else { for (int f = 0 ; f < index-1; f++){ getNode(f).next = node.next; } } this.size--; return item; } @Override /** * 获取元素的方法 */ public E get(int index) { this.CheckIndex(index); return (E) getNode(index).item; } @Override /** * 返回元素的个数 */ public int size() { return this.size; } } //新建测试类 package com.dataStructure; public class TestMySinglyLinkedList { public static void main(String[] args) { MySinglyLinkedList<String> mySinglyLinkedList = new MySinglyLinkedList(); mySinglyLinkedList.add("a"); mySinglyLinkedList.add("b"); mySinglyLinkedList.add("c"); mySinglyLinkedList.add("d"); mySinglyLinkedList.add("e"); mySinglyLinkedList.add("f"); System.out.println(mySinglyLinkedList.size()); System.out.println(mySinglyLinkedList.get(3)); System.out.println(mySinglyLinkedList.remove(5)); System.out.println(mySinglyLinkedList.size()); } }
我有两个疑问:1、我执行测试类的时候,报了空指针异常,不懂为什么;
2、为什么我初始化E类型的变量时,要让我强转为E类型?
老师,讲的时候和敲代码的时候能不能不要那么快,看的一脸懵
一个守护线程可以同时守护几个用户线程,是随着最后一个用户线程消亡而消亡吗?
static void printFile(File file,int level){ for (int i = 0;i<level;i++){ System.out.print("-"); } //输出文件名 System.out.println(file.getName()); if (file.isDirectory()){ File[] files = file.listFiles();//列出他的所有子文件,子目录 for (File temp:files){ printFile(temp,level+1); } } }
这个printFile方法下面的都不是很明白
判断他是不是文件之后更不明白能不能详细解释一下
如果说我们拆到"[" 请问添加的字符串"]"是加到"["左边还是右边
我们定义结点的时候声明了泛型E,为什么声明指向下一个结点的引用时不使用E呢。如下
Node<E> next;
像老师这样Node next;编译器怎么知道next到底是指向什么类型的呢?
package fang.stu.sxt; import java.net.DatagramPacket; import java.net.DatagramSocket; /** * 服务端 * * */ public class UdpTest01 { public static void main(String[] args) { DatagramSocket ds=null; try { //创建,服务的的监听对象; ds=new DatagramSocket(9999); //创建缓存区; byte[] bt=new byte[1024]; //创建数据报包; DatagramPacket dap=new DatagramPacket(bt, bt.length); //接收数据 System.out.println("服务端启动,准备接收数据"); ds.receive(dap); //将字节数组转换为字符串接收; String str=new String(dap.getData(),0, dap.getLength()); } catch (Exception e) { e.printStackTrace(); } finally { //关闭这个监听的对象; if (ds!=null){ ds.close(); } } } } package fang.stu.sxt; import java.io.IOException; import java.net.*; /*** * * 客户端 */ public class UdpClient01 { public static void main(String[] args) { DatagramSocket ds=null; try { //将数据类型转换为字节数组 byte[] b="王八蛋".getBytes(); //创建数据报包 DatagramPacket dp=new DatagramPacket(b,b.length, new InetSocketAddress("192.168.44.1",9999)); //创建客户端的监听对象 ds=new DatagramSocket(8088); //开始发送数据 System.out.println("客户端准备发送数据"); ds.send(dp); } catch (Exception e) { e.printStackTrace(); }finally { if (ds!=null){ ds.close(); } } } }
这个和老师讲的基本一样,都能运行,就是没有实现数据的发送
老师什么时候创建对象用new 什么时候不用啊?
如果在initialValue()方法内部加上Thread.sleep(500)的话,运行结果显示三个线程还是在共享着同一个连接,那不还是线程不安全吗?
运行效果图如下所示:
代码如下所示:
package com.bjsxt; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * <b style = "font-size:15px;">用于获得与数据库的连接以及关闭连接</b> * @author 郑锦宗 * @version v1.0 */ public class DBUtil { private static final String DRIVER="com.mysql.jdbc.Driver"; private static final String USER="root"; private static final String PWD="root"; private static final String URL="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8"; private static Connection conn=null; //定义一个数据库连接 private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>() { protected Connection initialValue() { try { Class.forName(DRIVER); if(conn==null){ conn=DriverManager.getConnection(URL, USER, PWD); } try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } }; //获取连接 public static Connection getConnection(){ return tl.get(); } //关闭连接的方法 public static void colseConnection(){ if (conn!=null) { try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void main(String[] args) { System.out.println(getConnection()); } }
源码压缩包如下所示:
源码压缩包.zip
老师问一下,视频里的有参方法是怎么沟造出来的?是快捷键还是什么?
非常抱歉给您带来不好的体验!为了更深入的了解您的学习情况以及遇到的问题,您可以直接拨打投诉热线:
我们将在第一时间处理好您的问题!
关于
课程分类
百战程序员微信公众号
百战程序员微信小程序
©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园网站维护:百战汇智(北京)科技有限公司 京公网安备 11011402011233号 京ICP备18060230号-3 营业执照 经营许可证:京B2-20212637