JAVA问题:byte类型数组里的值和int型的值运算过后为什么还能存放在byte类型数组中?

public class t2 {
public static void main(String[] args) {

   int key = 100;
   byte[] b =new byte[100];

   for (int i = 0; i < b.length; i++) {
    b[i] ^= key;
    //在异或过程中b[i]转成int类型和key运算后为什么还能存放在byte数组中呢?
}

}

}

2个回答

数组的本质是引用地址,这段代码的本质是修改了每个元素的值,new byte[] 初时字节数组中每个元素都是默认值 0。然后用 for 循环修正数组中每个元素的值为 0 和 100 的亦或值。

java规定在做运算时,会有一个自动类型转换,byte short char 在和 int 运算时都会提升成int后,再运算,结果为int;此时再赋值给 byte 类型会有一个强转过程: b[i] ^= key; 里面有一个强制转换过程,等价于:(byte) (s[0]^key);

其实本质上是byte 和 int 运算的结果强制转换成了 byte ,所以可以存入 byte 数组中。

wojiushiwo945you
毕小宝 回复weixin_44904947: 是的,连写不会报错,分开写报错,所以肯定存在类型转换的。
大约一年之前 回复
weixin_44904947
weixin_44904947 所以 ^=是有隐含的强制转换是吗,我发现b[i] = b[i] + key就会报错
大约一年之前 回复
weixin_39606236
꧁gaoKuo꧂ 回复GaoKuoZ: 这个我大意了 我说错了的 跟这个问题没关系 值容量固定一个字节=.=
大约一年之前 回复
weixin_39606236
꧁gaoKuo꧂ 回复caozhy: 比喻好不代表对,首先数组空间在初始化就已经确定了,无法扩容,其次,数组中的值最大容量在初始化时也确定了,如何容纳更大的数据类型实例呢?
大约一年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 这个比喻很好!可以采纳了
大约一年之前 回复

楼上说的是不对的,byte数组无法容纳int类型的值

    public static void main(String[] args) {
                int key = 1025;
                System.out.println((byte)(0^key));
                byte[] b =new byte[100];
                for (int i = 0; i < 1; i++) {
                    b[i] ^= key;
                    System.out.println(b[i]);
                }
    }

执行结果为:
1
1
实际上,类似于"+=","^="这种运算符是包含了类型的隐式转换的,放入数组的仍然是byte
b[i] ^= key;这一行代码相当于b[i]=(byte)(0^key);

wojiushiwo945you
毕小宝 您说的对,这里面有自动类型转换过程。我看题的时候只关注为甚又存入数组中这个点了。
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
java 超过256的int转换byte[]

如题,int a = 318; 转换成byte取低8位为013e;但实际是023e 应该怎么转啊?大神们给个思路。

java类型转化之int转换为byte[]

小白想请问一个问题: java中将int转换为byte[]数组时,我参考网上的代码如下: public byte[] int2bytes(int Num){ byte[] bytes = new byte[4]; bytes[0] = (byte)(Num & 0xff); bytes[1] = (byte)((Num >> 8) & 0xff ); bytes[2] = (byte)((Num >> 16) & 0xff); bytes[3] = (byte)((Num >> 24) & 0xff); return bytes; } ``` ``` 我想问的是,之后的0xff的作用到底是什么。 我的疑惑如下: ①网上的说法是:0xff的二进制第一个字节11111111,其他三个字节均是0,按位与之后,将位运算之后的int低8位之外的24位清零,可是int强制转换为byte是只取了最后的低8位吧,那么前面的是不是0是有什么关系呢。如下: 原数据int: 00000000 00101001 00001010 00010110 位运算>>8: 00000000 00000000 00101001 00001010 & 0xff : 00000000 00000000 00000000 00001010 转换byte : 00001010 按照这样的流程,如果不进行& 0xff操作,直接将位运算之后强制转换,结果应该如下: 原数据int: 00000000 00101001 00001010 00010110 位运算>>8: 00000000 00000000 00101001 00001010 转换byte : 00001010 既然网上的代码都是这样写,肯定有其中的道理,那么我的理解错误点在哪里呢? ②我将此段代码,传参-1024调用,并循环输出byte[4]的元素发现返回结果是一样的 有&0xff:0 -4 -1 -1 无&0xff:0 -4 -1 -1 还请指点,非常感谢。 更新:我后来想了下。觉得这应该是从别的语言里面借鉴过来的写法。 在java中byte的取值范围是127~-128,而int为4个byte,那么可能在位运算之后,不进行& 0xff按位与之后可能存在int的第一个字节和第二个字节均不为零的情况,那么此时int的值实际上是超过了byte的取值范围,在别的语言里可能会造成溢出。 但是,我刚试验过了。java中实际上这种转换不会抛出错误,比如直接将280转换成byte,则直接砍掉前面的14位,只取后面8位。

JAVA 将128位二进制串转换为整型,在进行位运算,计算汉明距离

JAVA,现有两个128位的二进制串,我要计算它们之间的汉明距离,但在Java中位运算好像都需要事先转换为整型。但是128位的二进制数也太大,int并不能满足要求,用长整型好像也不太行。求大神指导。

那位大神能把我这个Java的md5的加密方法写个php版本哦,感激噢!

那位大神能把我这个Java的md5的加密方法写个php版本哦,感激噢,Java代码如下! 写这个的人 描述的思路如下 1.将秘钥、源串分别转换byte数组 2.声明2个64位数组 将key的byte数组分别做异或运算填充进去 并分别补充 54、92 补满64长度 3.获得md5摘要算法的MessageDigest 对象 4.使用其中一个数组及源串的数组更新MessageDigest 摘要 完成哈希计算 5.重置摘要 6.使用另一个数组更新摘要 使用4中结果 从0到16开始更新摘要 完成哈希计算 7.转换字符串 public String cryptMd5(String source, String key) { byte[] k_ipad = new byte[64]; byte[] k_opad = new byte[64]; byte[] keyb; byte[] value; try { byte[] keyb = key.getBytes("UTF-8"); value = source.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { byte[] value; keyb = key.getBytes(); value = source.getBytes(); } Arrays.fill(k_ipad, keyb.length, 64, 54); Arrays.fill(k_opad, keyb.length, 64, 92); for (int i = 0; i < keyb.length; i++) { k_ipad[i] = (byte)(keyb[i] ^ 0x36); k_opad[i] = (byte)(keyb[i] ^ 0x5C); } MessageDigest md = null; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { return null; } md.update(k_ipad); md.update(value); byte[] dg = md.digest(); md.reset(); md.update(k_opad); md.update(dg, 0, 16); dg = md.digest(); return toHex(dg); } public static String toHex(byte[] input) { if (input == null) { return null; } StringBuffer output = new StringBuffer(input.length * 2); for (int i = 0; i < input.length; i++) { int current = input[i] & 0xFF; if (current < 16) output.append("0"); output.append(Integer.toString(current, 16)); } return output.toString(); }

求大神 大哥优化java 求N的阶乘

ackage cn.zmx; public class Multiply { /** * 这个默认构造方法不能省略,因为有了带参数的构造方法后,类在实例化过程中就 * 不会再创建默认的缺省构造方法。 * 类没有提供任何构造函数,将自动生成一个默认构建函数。 * 但如果有构造函数,则不会自动生成该默认构造函数。 */ public Multiply(){ } public Multiply(int x) { this.setX(x); } private int x = 0;//表示x的阶乘 private int length=0;//计算结果的长度 public int getX() { return x; } /** * 设置x的值,当x值为负数时取绝对值 * @param x * 如当x为-1时,则计算1的阶乘 */ public void setX(int x) { this.x = x>0?x:-x; } public int getLength() { return length; } public void setLength(int length) { this.length = length; } /** * 用于测试的main方法 * @param args */ public static void main(String[] args) { Multiply m = new Multiply(1000); System.out.println("运算开始..."); long startTime = System.currentTimeMillis(); byte[] des = m.calculate(new byte[1]); for(int i=0;i<des.length;i++){ System.out.print(des[i]); if((i+1)%50==0){ System.out.println();//每50个字符 换行 } m.setLength(m.getLength()+1); } long endTime = System.currentTimeMillis(); System.out.println("\n运算结束!\n共耗时:"+(endTime-startTime)/1000+"秒"+ (endTime-startTime)%1000+"毫秒"); System.out.println("总长度为:"+m.getLength()); } /** * * @return result * 以字符串形式返回结果 * 格式: "结果,数据长度,耗时毫秒" */ public String showResult(){ Multiply m = new Multiply(this.getX()); String result=""; long startTime = System.currentTimeMillis(); byte[] des = m.calculate(new byte[1]); for(int i=0;i<des.length;i++){ result += des[i]; m.setLength(m.getLength()+1); } long endTime = System.currentTimeMillis(); return result+","+m.getLength()+","+(endTime-startTime)/1000; } /** * 计算x!并存入des字节数组中 * @param des * @return */ public byte[] calculate(byte[] des) { des[0] = 1; for (int i = 0; i <this.getX(); i++) { des = ArrayMultiply(des ,tobyteArray(i+1, 0, new byte[1]),new byte[1]); } return des; } public byte[] calculate(int x,byte[] des) { des = tobyteArray(x, 0, new byte[1]); return des; } /** * 一个数组乘以一个数后并调整OK * @param b * @param x * @param result * @param offset * 补足0的个数 * @return */ public byte[] ArrayMultiply(byte[] b,int x,byte[] result,int offset){ int carrier = 0;//进位值 byte[] bt = (byte[])b.clone(); for(int i=bt.length-1;i>=0;i--){ bt[i] *= x; int temp = carrier; carrier = (bt[i]+carrier)/10; bt[i] = (byte) ((bt[i]+temp)%10); if(i-1<0&&carrier>0){ result = new byte[bt.length+1]; System.arraycopy(bt,0,result,1,bt.length); result[0] = (byte) carrier; if(offset>0){ byte[] bb = shiftArray(offset,result); return bb; } return result; } } if(offset>0){ byte[] bb = shiftArray(offset, bt); return bb; } return bt; } /** * 数组平移,最右边补足offset个零 * @param offset * @param bt * @return */ private byte[] shiftArray(int offset, byte[] bt) { byte[] bb = new byte[bt.length+offset]; System.arraycopy(bt,0,bb,0,bt.length); return bb; } /** * 计算两个数组相乘,返回一个新的数组OK * @param b1 * {7,5,3,9} * @param b2 * {4,2,6,8,9,4} * @param des * @return */ private byte[] ArrayMultiply(byte[] b1,byte[] b2,byte[] des){ for(int i=b1.length-1;i>=0;i--){ //byte[] b = ArrayMultiply(b2,b1[i],new byte[1],b1.length-1-i); des = ArrayAdd((byte[])des.clone(),ArrayMultiply(b2,b1[i],new byte[1],b1.length-1-i),new byte[1]); } return des; } /** * 两个数组进行按位求和,并按十进制调整长度OK * @param des * @param bs * @param result * @return */ private byte[] ArrayAdd(byte[] des, byte[] bs,byte[] result) { byte[] shortArray = des.length<bs.length?des:bs; byte[] longArray = des.length<bs.length?bs:des; for(int i=shortArray.length-1;i>=0;i--){ longArray[longArray.length-1-(shortArray.length-1-i)] += shortArray[i]; if(longArray[longArray.length-1-(shortArray.length-1-i)]>9){ longArray = AdjustArray((byte[])longArray.clone()); } } return longArray; } /** * 调整一个数组,按10进制进行调整,由src.length-1到0位进行调整 OK * @param src * @return */ private byte[] AdjustArray(byte[] src) { for (int i = src.length-1; i >=0; i--) { if (src[i] > 9) { if (i - 1 <0) { byte[] temp = new byte[src.length + 1]; System.arraycopy(src, 0, temp, 1, src.length); temp[0] += temp[i]/10; temp[i] %= 10; src = AdjustArray(temp); } else { src[i - 1] += src[i]/10; src[i] %= 10; } } } return src; } /** * 将一个整数转化为byte数组OK * @param x * @param index * 初始为0 * @param src * 初始长度1 * @return */ private byte[] tobyteArray(int x,int index,byte[] src){ src[index] = (byte) (x%10); x /= 10; if(x>0){ index++; byte[] temp = new byte[src.length+1]; System.arraycopy(src,0,temp,0,src.length); if(x<=9){ temp[index] = (byte) x; reverseArray(temp); return temp; }else{ src = tobyteArray(x,index,temp); } } return src; } /** * 数组的反转OK * @param src */ private void reverseArray(byte[] src) { if(src.length%2==0){ for(int i=0;i<src.length/2;i++){ swap(src, i); } }else{ for(int i=0;i<(src.length-1)/2;i++){ swap(src, i); } } } /** * 交换数组中两个整数的位置,不定义中间变量OK * @param src * @param i */ private void swap(byte[] src, int i) { src[i] ^= src[src.length-i-1]; src[src.length-i-1] ^= src[i]; src[i] ^= src[src.length-i-1]; } }

java实现 循环冗余校验(CRC)算法

算法的要求是如下: ① 装一个16 位寄存器,所有数位均为1。 ② 取被校验串的一个字节与16 位寄存器的高位字节进行“异或”运算。运算结果放 入这个16 位寄存器。 ③ 把这个16 寄存器向右移一位。 ④ 若向右(标记位)移出的数位是1,则生成多项式1010 0000 0000 0001 和这个寄 存器进行“异或”运算;若向右移出的数位是0,则返回③。 ⑤ 重复③和④,直至移出8 位。 ⑥ 取被校验串的下一个字节 ⑦ 重复③~⑥,直至被校验串的所有字节均与16 位寄存器进行“异或”运算,并移位 8 次。 ⑧ 这个16 位寄存器的内容即2 字节CRC 错误校验码。 校验码按照先高字节后低字节的顺序存放。 我自己理解实现了下: ``` public static short crc16(byte[] data) { short crc = (short) 0xFFFF; short dxs = (short) 0xA001; byte tc; byte sbit; for (int i = 0; i < data.length; i++) { tc = (byte) ((crc & 0xff00) >> 8); crc = (short) (tc ^ data[i]); for (int r = 0; r < 8; r++) { sbit = (byte) (crc & 0x01); crc = (short) (crc >> 1); if (sbit != 0) crc = (short) (crc ^ dxs); } } System.out.println(bytesToHexString(new byte[] { (byte) ((crc & 0xff00) >> 8), (byte) (crc & 0xff) })); return crc; } //将字节数组按16进制输出 public static String bytesToHexString(byte[] src) { StringBuilder stringBuilder = new StringBuilder(""); if (src == null || src.length <= 0) { return null; } for (int i = 0; i < src.length; i++) { int v = src[i] & 0xFF; String hv = Integer.toHexString(v); if (stringBuilder.length() != 0) { stringBuilder.append(","); } if (hv.length() < 2) { stringBuilder.append(0); } stringBuilder.append(hv); } return stringBuilder.toString(); } ``` 可是我计算出的接口和文档上对不上,不知道哪里有问题?

用多线程优化一下代码

package jiecheng; public class Multiply { public Multiply(){ } public Multiply(int x) { this.setX(x); } private int x = 0;//表示x的阶乘 private int length=0;//计算结果的长度 public int getX() { return x; } /** * 设置x的值,当x值为负数时取绝对值 * @param x * 如当x为-1时,则计算1的阶乘 */ public void setX(int x) { this.x = x>0?x:-x; } public int getLength() { return length; } public void setLength(int length) { this.length = length; } /** * 用于测试的main方法 * @param args */ public static void main(String[] args) { Multiply m = new Multiply(1000); System.out.println("运算开始..."); long startTime = System.currentTimeMillis(); byte[] des = m.calculate(new byte[1]); for(int i=0;i<des.length;i++){ System.out.print(des[i]); if((i+1)%50==0){ System.out.println(); } m.setLength(m.getLength()+1); } long endTime = System.currentTimeMillis(); System.out.println("\n运算结束!\n共耗时:"+(endTime-startTime)/1000+"秒"+ (endTime-startTime)%1000+"毫秒"); System.out.println("总长度为:"+m.getLength()); } /** * * @return result * 以字符串形式返回结果 * 格式: "结果,数据长度,耗时毫秒" */ public String showResult(){ Multiply m = new Multiply(this.getX()); String result=""; long startTime = System.currentTimeMillis(); byte[] des = m.calculate(new byte[1]); for(int i=0;i<des.length;i++){ result += des[i]; m.setLength(m.getLength()+1); } long endTime = System.currentTimeMillis(); return result+","+m.getLength()+","+(endTime-startTime)/1000; } /** * 计算x!并存入des字节数组中 * @param des * @return */ public byte[] calculate(byte[] des) { des[0] = 1; for (int i = 0; i <this.getX(); i++) { des = ArrayMultiply(des ,tobyteArray(i+1, 0, new byte[1]),new byte[1]); } return des; } public byte[] calculate(int x,byte[] des) { des = tobyteArray(x, 0, new byte[1]); return des; } /** * 一个数组乘以一个数后并调整OK * @param b * @param x * @param result * @param offset * 补足0的个数 * @return */ public byte[] ArrayMultiply(byte[] b,int x,byte[] result,int offset){ int carrier = 0;//进位值 byte[] bt = (byte[])b.clone(); for(int i=bt.length-1;i>=0;i--){ bt[i] *= x; int temp = carrier; carrier = (bt[i]+carrier)/10; bt[i] = (byte) ((bt[i]+temp)%10); if(i-1<0&&carrier>0){ result = new byte[bt.length+1]; System.arraycopy(bt,0,result,1,bt.length); result[0] = (byte) carrier; if(offset>0){ byte[] bb = shiftArray(offset,result); return bb; } return result; } } if(offset>0){ byte[] bb = shiftArray(offset, bt); return bb; } return bt; } /** * 数组平移,最右边补足offset个零 * @param offset * @param bt * @return */ private byte[] shiftArray(int offset, byte[] bt) { byte[] bb = new byte[bt.length+offset]; System.arraycopy(bt,0,bb,0,bt.length); return bb; } /** * 计算两个数组相乘,返回一个新的数组OK * @param b1 * {7,5,3,9} * @param b2 * {4,2,6,8,9,4} * @param des * @return */ private byte[] ArrayMultiply(byte[] b1,byte[] b2,byte[] des){ for(int i=b1.length-1;i>=0;i--){ //byte[] b = ArrayMultiply(b2,b1[i],new byte[1],b1.length-1-i); des = ArrayAdd((byte[])des.clone(),ArrayMultiply(b2,b1[i],new byte[1],b1.length-1-i),new byte[1]); } return des; } /** * 两个数组进行按位求和,并按十进制调整长度OK * @param des * @param bs * @param result * @return */ private byte[] ArrayAdd(byte[] des, byte[] bs,byte[] result) { byte[] shortArray = des.length<bs.length?des:bs; byte[] longArray = des.length<bs.length?bs:des; for(int i=shortArray.length-1;i>=0;i--){ longArray[longArray.length-1-(shortArray.length-1-i)] += shortArray[i]; if(longArray[longArray.length-1-(shortArray.length-1-i)]>9){ longArray = AdjustArray((byte[])longArray.clone()); } } return longArray; } /** * 调整一个数组,按10进制进行调整,由src.length-1到0位进行调整 OK * @param src * @return */ private byte[] AdjustArray(byte[] src) { for (int i = src.length-1; i >=0; i--) { if (src[i] > 9) { if (i - 1 <0) { byte[] temp = new byte[src.length + 1]; System.arraycopy(src, 0, temp, 1, src.length); temp[0] += temp[i]/10; temp[i] %= 10; src = AdjustArray(temp); } else { src[i - 1] += src[i]/10; src[i] %= 10; } } } return src; } /** * 将一个整数转化为byte数组OK * @param x * @param index * 初始为0 * @param src * 初始长度1 * @return */ private byte[] tobyteArray(int x,int index,byte[] src){ src[index] = (byte) (x%10); x /= 10; if(x>0){ index++; byte[] temp = new byte[src.length+1]; System.arraycopy(src,0,temp,0,src.length); if(x<=9){ temp[index] = (byte) x; reverseArray(temp); return temp; }else{ src = tobyteArray(x,index,temp); } } return src; } /** * 数组的反转OK * @param src */ private void reverseArray(byte[] src) { if(src.length%2==0){ for(int i=0;i<src.length/2;i++){ swap(src, i); } }else{ for(int i=0;i<(src.length-1)/2;i++){ swap(src, i); } } } /** * 交换数组中两个整数的位置,不定义中间变量OK * @param src * @param i */ private void swap(byte[] src, int i) { src[i] ^= src[src.length-i-1]; src[src.length-i-1] ^= src[i]; src[i] ^= src[src.length-i-1]; } }

继续求助第二波,那位大神能把这个Java md5的方法写个php版的,得加密结果一致的,谢谢了!

继续求助第二波,那位大神能这个Java md5的方法写个php版的,得加密结果一致的,谢谢了,第一波有位达人写了一个了,但是加密结果不一样,大家可以参考下! java方法描述的思路如下 1.将秘钥、源串分别转换byte数组 2.声明2个64位数组 将key的byte数组分别做异或运算填充进去 并分别补充 54、92 补满64长度 3.获得md5摘要算法的MessageDigest 对象 4.使用其中一个数组及源串的数组更新MessageDigest 摘要 完成哈希计算 5.重置摘要 6.使用另一个数组更新摘要 使用4中结果 从0到16开始更新摘要 完成哈希计算 7.转换字符串 方法如下 public String cryptMd5(String source, String key) { byte[] k_ipad = new byte[64]; byte[] k_opad = new byte[64]; byte[] keyb; byte[] value; try { byte[] keyb = key.getBytes("UTF-8"); value = source.getBytes("UTF-8"); } catch (UnsupportedEncodingException e) { byte[] value; keyb = key.getBytes(); value = source.getBytes(); } Arrays.fill(k_ipad, keyb.length, 64, 54); Arrays.fill(k_opad, keyb.length, 64, 92); for (int i = 0; i < keyb.length; i++) { k_ipad[i] = (byte)(keyb[i] ^ 0x36); k_opad[i] = (byte)(keyb[i] ^ 0x5C); } MessageDigest md = null; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { return null; } md.update(k_ipad); md.update(value); byte[] dg = md.digest(); md.reset(); md.update(k_opad); md.update(dg, 0, 16); dg = md.digest(); return toHex(dg); } public static String toHex(byte[] input) { if (input == null) { return null; } StringBuffer output = new StringBuffer(input.length * 2); for (int i = 0; i < input.length; i++) { int current = input[i] & 0xFF; if (current < 16) output.append("0"); output.append(Integer.toString(current, 16)); } return output.toString(); } 下面这个是上次提问达人写的,加密结果和Java的还是不一致 function cryptMd5($source, $key) { if(! mb_check_encoding($source, 'utf-8')) $source = mb_convert_encoding($source, "utf-8", "auto"); if(! mb_check_encoding($key, 'utf-8')) $key = mb_convert_encoding($key, "utf-8", "auto"); $k_ipad = str_pad($key, 64, chr(54)); $k_opad = str_pad($key, 64, chr(92)); for($i=0; $i<strlen($key); $i++) { $k_ipad{$i} = $key{$i} ^ chr(0x36); $k_opad{$i} = $key{$i} ^ chr(0x5c); } $dg = md5($source . substr($k_ipad, strlen($source)), true); $dg = md5(substr($dg, 0, 16) . substr($k_opad, 16), true); return bin2hex($dg); }

jsp中javabean优化。。。。

public class Multiply { public Multiply(){ } public Multiply(int x) { this.setX(x); } private int x = 0;//表示x的阶乘 private int length=0;//计算结果的长度 public int getX() { return x; } /** * 设置x的值,当x值为负数时取绝对值 * @param x * 如当x为-1时,则计算1的阶乘 */ public void setX(int x) { this.x = x>0?x:-x; } public int getLength() { return length; } public void setLength(int length) { this.length = length; } /** * 用于测试的main方法 * @param args */ public static void main(String[] args) { Multiply m = new Multiply(1000); System.out.println("运算开始..."); long startTime = System.currentTimeMillis(); byte[] des = m.calculate(new byte[1]); for(int i=0;i<des.length;i++){ System.out.print(des[i]); if((i+1)%50==0){ System.out.println(); } m.setLength(m.getLength()+1); } long endTime = System.currentTimeMillis(); System.out.println("\n运算结束!\n共耗时:"+(endTime-startTime)/1000+"秒"+ (endTime-startTime)%1000+"毫秒"); System.out.println("总长度为:"+m.getLength()); } /** * * @return result * 以字符串形式返回结果 * 格式: "结果,数据长度,耗时毫秒" */ public String showResult(){ Multiply m = new Multiply(this.getX()); String result=""; long startTime = System.currentTimeMillis(); byte[] des = m.calculate(new byte[1]); for(int i=0;i<des.length;i++){ result += des[i]; m.setLength(m.getLength()+1); } long endTime = System.currentTimeMillis(); return result+","+m.getLength()+","+(endTime-startTime)/1000; } /** * 计算x!并存入des字节数组中 * @param des * @return */ public byte[] calculate(byte[] des) { des[0] = 1; for (int i = 0; i <this.getX(); i++) { des = ArrayMultiply(des ,tobyteArray(i+1, 0, new byte[1]),new byte[1]); } return des; } public byte[] calculate(int x,byte[] des) { des = tobyteArray(x, 0, new byte[1]); return des; } /** * 一个数组乘以一个数后并调整OK * @param b * @param x * @param result * @param offset * 补足0的个数 * @return */ public byte[] ArrayMultiply(byte[] b,int x,byte[] result,int offset){ int carrier = 0;//进位值 byte[] bt = (byte[])b.clone(); for(int i=bt.length-1;i>=0;i--){ bt[i] *= x; int temp = carrier; carrier = (bt[i]+carrier)/10; bt[i] = (byte) ((bt[i]+temp)%10); if(i-1<0&&carrier>0){ result = new byte[bt.length+1]; System.arraycopy(bt,0,result,1,bt.length); result[0] = (byte) carrier; if(offset>0){ byte[] bb = shiftArray(offset,result); return bb; } return result; } } if(offset>0){ byte[] bb = shiftArray(offset, bt); return bb; } return bt; } /** * 数组平移,最右边补足offset个零 * @param offset * @param bt * @return */ private byte[] shiftArray(int offset, byte[] bt) { byte[] bb = new byte[bt.length+offset]; System.arraycopy(bt,0,bb,0,bt.length); return bb; } /** * 计算两个数组相乘,返回一个新的数组OK * @param b1 * {7,5,3,9} * @param b2 * {4,2,6,8,9,4} * @param des * @return */ private byte[] ArrayMultiply(byte[] b1,byte[] b2,byte[] des){ for(int i=b1.length-1;i>=0;i--){ //byte[] b = ArrayMultiply(b2,b1[i],new byte[1],b1.length-1-i); des = ArrayAdd((byte[])des.clone(),ArrayMultiply(b2,b1[i],new byte[1],b1.length-1-i),new byte[1]); } return des; } /** * 两个数组进行按位求和,并按十进制调整长度OK * @param des * @param bs * @param result * @return */ private byte[] ArrayAdd(byte[] des, byte[] bs,byte[] result) { byte[] shortArray = des.length<bs.length?des:bs; byte[] longArray = des.length<bs.length?bs:des; for(int i=shortArray.length-1;i>=0;i--){ longArray[longArray.length-1-(shortArray.length-1-i)] += shortArray[i]; if(longArray[longArray.length-1-(shortArray.length-1-i)]>9){ longArray = AdjustArray((byte[])longArray.clone()); } } return longArray; } /** * 调整一个数组,按10进制进行调整,由src.length-1到0位进行调整 OK * @param src * @return */ private byte[] AdjustArray(byte[] src) { for (int i = src.length-1; i >=0; i--) { if (src[i] > 9) { if (i - 1 <0) { byte[] temp = new byte[src.length + 1]; System.arraycopy(src, 0, temp, 1, src.length); temp[0] += temp[i]/10; temp[i] %= 10; src = AdjustArray(temp); } else { src[i - 1] += src[i]/10; src[i] %= 10; } } } return src; } /** * 将一个整数转化为byte数组OK * @param x * @param index * 初始为0 * @param src * 初始长度1 * @return */ private byte[] tobyteArray(int x,int index,byte[] src){ src[index] = (byte) (x%10); x /= 10; if(x>0){ index++; byte[] temp = new byte[src.length+1]; System.arraycopy(src,0,temp,0,src.length); if(x<=9){ temp[index] = (byte) x; reverseArray(temp); return temp; }else{ src = tobyteArray(x,index,temp); } } return src; } /** * 数组的反转OK * @param src */ private void reverseArray(byte[] src) { if(src.length%2==0){ for(int i=0;i<src.length/2;i++){ swap(src, i); } }else{ for(int i=0;i<(src.length-1)/2;i++){ swap(src, i); } } } /** * 交换数组中两个整数的位置,不定义中间变量OK * @param src * @param i */ private void swap(byte[] src, int i) { src[i] ^= src[src.length-i-1]; src[src.length-i-1] ^= src[i]; src[i] ^= src[src.length-i-1]; } }

java编程题桌面设计。。。。。

![图片说明](https://img-ask.csdn.net/upload/201601/12/1452565879_699275.png) ![图片说明](https://img-ask.csdn.net/upload/201601/12/1452565966_393439.png) 实现文件的加密与解密,关键就在加、解密的算法。程序的设计思想就是通过流从文件中读取数据进行处理,然后写入到新文件中,当解密时通过对应的方式对加密的文件进行处理恢复原文件。 (1)文件加密处理算法 for (int i = 0; i < buffer.length; i++) { //循环遍历从流中读取的数组 int ibt = buffer[i]; ibt += 100; //将数组中数据做相加运算 ibt %= 256; buffer[i] = (byte) ibt; } (2)文件的解密处理算法 for (int i = 0; i < buffer.length; i++) { int ibt = buffer[i]; ibt -= 100; //对从流中读取的数据进行运算处理 ibt += 256; ibt %= 256; buffer[i] = (byte) ibt; } 五、设计过程 (1) 创建类EnctryptFile,在该类中定义文件加密、解密方法。 a) encry( )方法为加密方法,该方法有两个String类型参数,分别用于指定要进行加密的文件路径与加密后文件的保存地址。 b) unEncry( )方法,该方法有两个String类型参数,分别用于指定要进行解密的文件路径与解密后文件的保存地址。 (2) 创建EnctryAndUnEntryFrame类,该类继承自JFrame类,实现窗体类。向窗体中添加控件,主要控件及说明如下表所示。 表1 窗体的主要控件及说明 控件类型 控件命名 控件用途 JTabbedPane tabbedPane 这窗体添加选项卡面板 JPanel untryPanene 解密面板 entryPanel 加密面板 JTextField entryTextField 显示要加密文件地址文本框 saveTextField 显示加密后文本的保存地址文本框 JButton confirmButton “确认加密”按钮 entryButton 为用户提供“选择”加密文件的按钮 saveButton 为用户提供“选择”加密文件的保存地址按钮

这是一个MD5加密工具类,登陆始终是失败的,我用相同的密码123456多次注册发现加密后的密码字符串都是不同的,是不是工具类有错误的原因?

``` package com.easy.demo.utils; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Arrays; /*这是一个非常好用的使用MD5+salt加密的工具类。使用这个工具类,非常简单, 从前台拿到密码password,直接HexUtil.getEncryptedPwd(password)就可以返回一个长度为56的字符串, 可以用来保存到数据库中,相反,登录的时候,因为MD5加密是不可逆的运算,只能拿用户输入的密码走一遍MD5+salt加密之后, 跟数据库中的password比较,看是否一致,一致时密码相同,登录成功,通过调用HexUtil.validpassword(String password,String dbpassword)方法, 就可以了,不用再做其他事。*/ public class MD5Util { private final static String HEX_NUMS_STR = "0123456789ABCDEF"; private final static Integer SALT_LENGTH = 12; /** * 将16进制字符串转换成数组 * * @return byte[] * @author jacob * */ public static byte[] hexStringToByte(String hex) { /* len为什么是hex.length() / 2 ? * 首先,hex是一个字符串,里面的内容是像16进制那样的char数组 * 用2个16进制数字可以表示1个byte,所以要求得这些char[]可以转化成什么样的byte[],首先可以确定的就是长度为这个char[]的一半 */ int len = (hex.length() / 2); byte[] result = new byte[len]; char[] hexChars = hex.toCharArray(); for (int i = 0; i < len; i++) { int pos = i * 2; result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR .indexOf(hexChars[pos + 1])); } return result; } /** * 将数组转换成16进制字符串 * * @return String * @author jacob * * */ public static String byteToHexString(byte[] salt){ StringBuffer hexString = new StringBuffer(); for (int i = 0; i < salt.length; i++) { String hex = Integer.toHexString(salt[i] & 0xFF); if(hex.length() == 1){ hex = '0' + hex; } hexString.append(hex.toUpperCase()); } return hexString.toString(); } /** * 密码验证 * @param password 用户输入密码 * @param dbpassword 数据库保存的密码 * @return * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static boolean validpassword(String password, String dbpassword) throws NoSuchAlgorithmException, UnsupportedEncodingException{ byte[] pwIndb = hexStringToByte(dbpassword); //定义salt byte[] salt = new byte[SALT_LENGTH]; System.arraycopy(pwIndb, 0, salt, 0, SALT_LENGTH); //创建消息摘要对象 MessageDigest md = MessageDigest.getInstance("MD5"); //将盐数据传入消息摘要对象 md.update(salt); md.update(password.getBytes("UTF-8")); byte[] digest = md.digest(); //声明一个对象接收数据库中的口令消息摘要 byte[] digestIndb = new byte[pwIndb.length - SALT_LENGTH]; //获得数据库中口令的摘要 System.arraycopy(pwIndb, SALT_LENGTH, digestIndb, 0,digestIndb.length); //比较根据输入口令生成的消息摘要和数据库中的口令摘要是否相同 if(Arrays.equals(digest, digestIndb)){ //口令匹配相同 return true; }else{ return false; } } /** * 获得md5之后的16进制字符 * @param password 用户输入密码字符 * @return String md5加密后密码字符 * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static String getEncryptedPwd(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException{ //拿到一个随机数组,作为盐 byte[] pwd = null; SecureRandom sc= new SecureRandom(); byte[] salt = new byte[SALT_LENGTH]; sc.nextBytes(salt); //声明摘要对象,并生成 MessageDigest md = MessageDigest.getInstance("MD5"); //计算MD5函数 md.update(salt); //password.getBytes("UTF-8")将输入密码变成byte数组,即将某个数装换成一个16进制数 md.update(password.getBytes("UTF-8")); //计算后获得字节数组,这就是那128位了即16个元素 byte[] digest = md.digest(); pwd = new byte[salt.length + digest.length]; System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH); System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length); return byteToHexString(pwd); } } //controller层实现登陆的代码 @RequestMapping(value={"/login"}, method=RequestMethod.GET) public boolean login(HttpServletRequest request, @Param(value = "number")String number, @Param(value = "password")String password) throws UnsupportedEncodingException, NoSuchAlgorithmException { password = HexUtil.getEncryptedPwd(password); User user = userMapper.loginUser(number,password); if(user != null){ return true; }else{ return false; } } ``` 密码输入多遍始终登陆失败,尝试注册相同密码发现,每次注册123456加密后的密码都不一样,是不是MD5工具类有错误?

我有md5加密工具类了,但是不会去调用,要在哪个层去调用?

![图片说明](https://img-ask.csdn.net/upload/201909/18/1568792334_186753.png) ``` package com.easy.demo.utils; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Arrays; /*这是一个非常好用的使用MD5+salt加密的工具类。使用这个工具类,非常简单, 从前台拿到密码password,直接HexUtil.getEncryptedPwd(password)就可以返回一个长度为56的字符串, 可以用来保存到数据库中,相反,登录的时候,因为MD5加密是不可逆的运算,只能拿用户输入的密码走一遍MD5+salt加密之后, 跟数据库中的password比较,看是否一致,一致时密码相同,登录成功,通过调用HexUtil.validpassword(String password,String dbpassword)方法, 就可以了,不用再做其他事。*/ public class MD5Util { private final static String HEX_NUMS_STR = "0123456789ABCDEF"; private final static Integer SALT_LENGTH = 12; /** * 将16进制字符串转换成数组 * * @return byte[] * @author jacob * */ public static byte[] hexStringToByte(String hex) { /* len为什么是hex.length() / 2 ? * 首先,hex是一个字符串,里面的内容是像16进制那样的char数组 * 用2个16进制数字可以表示1个byte,所以要求得这些char[]可以转化成什么样的byte[],首先可以确定的就是长度为这个char[]的一半 */ int len = (hex.length() / 2); byte[] result = new byte[len]; char[] hexChars = hex.toCharArray(); for (int i = 0; i < len; i++) { int pos = i * 2; result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR .indexOf(hexChars[pos + 1])); } return result; } /** * 将数组转换成16进制字符串 * * @return String * @author jacob * * */ public static String byteToHexString(byte[] salt){ StringBuffer hexString = new StringBuffer(); for (int i = 0; i < salt.length; i++) { String hex = Integer.toHexString(salt[i] & 0xFF); if(hex.length() == 1){ hex = '0' + hex; } hexString.append(hex.toUpperCase()); } return hexString.toString(); } /** * 密码验证 * @param password 用户输入密码 * @param dbpassword 数据库保存的密码 * @return * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static boolean validpassword(String password, String dbpassword) throws NoSuchAlgorithmException, UnsupportedEncodingException{ byte[] pwIndb = hexStringToByte(dbpassword); //定义salt byte[] salt = new byte[SALT_LENGTH]; System.arraycopy(pwIndb, 0, salt, 0, SALT_LENGTH); //创建消息摘要对象 MessageDigest md = MessageDigest.getInstance("MD5"); //将盐数据传入消息摘要对象 md.update(salt); md.update(password.getBytes("UTF-8")); byte[] digest = md.digest(); //声明一个对象接收数据库中的口令消息摘要 byte[] digestIndb = new byte[pwIndb.length - SALT_LENGTH]; //获得数据库中口令的摘要 System.arraycopy(pwIndb, SALT_LENGTH, digestIndb, 0,digestIndb.length); //比较根据输入口令生成的消息摘要和数据库中的口令摘要是否相同 if(Arrays.equals(digest, digestIndb)){ //口令匹配相同 return true; }else{ return false; } } /** * 获得md5之后的16进制字符 * @param password 用户输入密码字符 * @return String md5加密后密码字符 * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ public static String getEncryptedPwd(String password) throws NoSuchAlgorithmException, UnsupportedEncodingException{ //拿到一个随机数组,作为盐 byte[] pwd = null; SecureRandom sc= new SecureRandom(); byte[] salt = new byte[SALT_LENGTH]; sc.nextBytes(salt); //声明摘要对象,并生成 MessageDigest md = MessageDigest.getInstance("MD5"); //计算MD5函数 md.update(salt); //password.getBytes("UTF-8")将输入密码变成byte数组,即将某个数装换成一个16进制数 md.update(password.getBytes("UTF-8")); //计算后获得字节数组,这就是那128位了即16个元素 byte[] digest = md.digest(); pwd = new byte[salt.length + digest.length]; System.arraycopy(salt, 0, pwd, 0, SALT_LENGTH); System.arraycopy(digest, 0, pwd, SALT_LENGTH, digest.length); return byteToHexString(pwd); } } ```

java 这个方法是干什么用的,

public static final int getIntFromBytes(byte[] b, int offset, int len) throws IOException { int num = 0; int sw = 8 * (len - 1); for (int loop = 0; loop < len; loop++) { num |= ((int) b[offset + loop] & 0x00ff) << sw; sw -= 8; } return num; } b是从网络接收来的一个byte数组

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

Linux面试题(2020最新版)

文章目录Linux 概述什么是LinuxUnix和Linux有什么区别?什么是 Linux 内核?Linux的基本组件是什么?Linux 的体系结构BASH和DOS之间的基本区别是什么?Linux 开机启动过程?Linux系统缺省的运行级别?Linux 使用的进程间通信方式?Linux 有哪些系统日志文件?Linux系统安装多个桌面环境有帮助吗?什么是交换空间?什么是root帐户什么是LILO?什...

将一个接口响应时间从2s优化到 200ms以内的一个案例

一、背景 在开发联调阶段发现一个接口的响应时间特别长,经常超时,囧… 本文讲讲是如何定位到性能瓶颈以及修改的思路,将该接口从 2 s 左右优化到 200ms 以内 。 二、步骤 2.1 定位 定位性能瓶颈有两个思路,一个是通过工具去监控,一个是通过经验去猜想。 2.1.1 工具监控 就工具而言,推荐使用 arthas ,用到的是 trace 命令 具体安装步骤很简单,大家自行研究。 我的使用步骤是...

学历低,无法胜任工作,大佬告诉你应该怎么做

微信上收到一位读者小涛的留言,大致的意思是自己只有高中学历,经过培训后找到了一份工作,但很难胜任,考虑要不要辞职找一份他能力可以胜任的实习工作。下面是他留言的一部分内容: 二哥,我是 2016 年高中毕业的,考上了大学但没去成,主要是因为当时家里经济条件不太允许。 打工了三年后想学一门技术,就去培训了。培训的学校比较垃圾,现在非常后悔没去正规一点的机构培训。 去年 11 月份来北京找到了一份工...

JVM内存结构和Java内存模型别再傻傻分不清了

JVM内存结构和Java内存模型都是面试的热点问题,名字看感觉都差不多,网上有些博客也都把这两个概念混着用,实际上他们之间差别还是挺大的。 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关,本文针对这两个总是被混用的概念展开讲解。 JVM内存结构 JVM构成 说到JVM内存结构,就不会只是说内存结构的5个分区,而是会延展到整个JVM相关的问题,所以先了解下

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

Google 与微软的浏览器之争

浏览器再现“神仙打架”。整理 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN(ID:CSDNnews)从 IE 到 Chrome,再从 Chrome 到 Edge,微软与...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

搜狗输入法也在挑战国人的智商!

故事总是一个接着一个到来...上周写完《鲁大师已经彻底沦为一款垃圾流氓软件!》这篇文章之后,鲁大师的市场工作人员就找到了我,希望把这篇文章删除掉。经过一番沟通我先把这篇文章从公号中删除了...

85后蒋凡:28岁实现财务自由、34岁成为阿里万亿电商帝国双掌门,他的人生底层逻辑是什么?...

蒋凡是何许人也? 2017年12月27日,在入职4年时间里,蒋凡开挂般坐上了淘宝总裁位置。 为此,时任阿里CEO张勇在任命书中力赞: 蒋凡加入阿里,始终保持创业者的冲劲,有敏锐的...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

什么时候跳槽,为什么离职,你想好了么?

都是出来打工的,多为自己着想

程序员为什么千万不要瞎努力?

本文作者用对比非常鲜明的两个开发团队的故事,讲解了敏捷开发之道 —— 如果你的团队缺乏统一标准的环境,那么即使勤劳努力,不仅会极其耗时而且成果甚微,使用...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

立即提问
相关内容推荐